Skip to content

Commit

Permalink
Make parameters encoding configurable with an environmental variable
Browse files Browse the repository at this point in the history
  • Loading branch information
MytsV authored and maany committed Nov 12, 2024
1 parent f011b6c commit dafd58b
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 7 deletions.
1 change: 1 addition & 0 deletions .env.development.local.template
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ NODE_TLS_REJECT_UNAUTHORIZED=0
[gateway]
RUCIO_AUTH_HOST=https://rucio-devmaany.cern.ch:443
RUCIO_HOST=https://rucio-devmaany.cern.ch:443
PARAMS_ENCODING_ENABLED=false

[oidc]
OIDC_ENABLED=true
Expand Down
5 changes: 5 additions & 0 deletions src/lib/core/port/secondary/env-config-gateway-output-port.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,9 @@ export default interface EnvConfigGatewayOutputPort {
* @returns the URL of the VO/Experiment community that maintains the Rucio WebUI instance
*/
projectURL(): Promise<string>;

/**
* @returns whether the query parameters should get URI encoded
*/
paramsEncodingEnabled(): Promise<boolean>;
}
9 changes: 9 additions & 0 deletions src/lib/infrastructure/gateway/env-config-gateway.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,15 @@ class EnvConfigGateway implements EnvConfigGatewayOutputPort {
}
return Promise.resolve(undefined);
}

async paramsEncodingEnabled(): Promise<boolean> {
const value = await this.get('PARAMS_ENCODING_ENABLED');
if (value === 'true' || value === 'True' || value === 'TRUE') {
return Promise.resolve(true);
} else {
return Promise.resolve(false);
}
}
}

export default EnvConfigGateway;
3 changes: 2 additions & 1 deletion src/lib/sdk/gateway-endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,8 @@ export abstract class BaseEndpoint<TDTO extends BaseDTO> {
throw new Error(`Request not initialized for ${this.constructor.name}`);
}

const preparedRequest = prepareRequestArgs(this.request);
const encodeParams = await this.envConfigGateway.paramsEncodingEnabled();
const preparedRequest = prepareRequestArgs(this.request, encodeParams);

const response: Response = await fetch(preparedRequest.url, preparedRequest.requestArgs);
if (!response.ok) {
Expand Down
10 changes: 7 additions & 3 deletions src/lib/sdk/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,21 @@ export type HTTPRequest = {
/**
* Prepares the request arguments for an HTTP request.
* @param {HTTPRequest} request - The HTTP request to prepare arguments for.
* @param {boolean} encodeParams - Whether the query parameters should get URI encoded
* @returns {{ url: string | URL; requestArgs: RequestInit }} - An object containing the URL and request arguments.
*/
export function prepareRequestArgs(request: HTTPRequest): {
export function prepareRequestArgs(
request: HTTPRequest,
encodeParams: boolean = false,
): {
url: string | URL;
requestArgs: RequestInit;
} {
if (request.params) {
const url = new URL(request.url);
Object.keys(request.params).forEach(key => {
const encodedValue = encodeURIComponent(request.params![key]);
url.searchParams.append(key, encodedValue);
const value = request.params![key];
url.searchParams.append(key, encodeParams ? encodeURIComponent(value) : value);
});
request.url = url.toString();
}
Expand Down
13 changes: 10 additions & 3 deletions src/lib/sdk/streaming-gateway.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
import 'reflect-metadata';
import StreamGatewayOutputPort from '@/lib/core/port/secondary/stream-gateway-output-port';
import { injectable } from 'inversify';
import { inject, injectable } from 'inversify';
import fetch, { Response } from 'node-fetch';
import { PassThrough, Transform } from 'node:stream';
import { HTTPRequest, prepareRequestArgs } from '@/lib/sdk/http';
import { BytesToStringifiedJSONTransform, NewlineDelimittedDataParser } from '@/lib/sdk/stream-transformers';
import type EnvConfigGatewayOutputPort from '@/lib/core/port/secondary/env-config-gateway-output-port';
import GATEWAYS from '@/lib/infrastructure/ioc/ioc-symbols-gateway';

@injectable()
export default class StreamingGateway implements StreamGatewayOutputPort {
constructor(@inject(GATEWAYS.ENV_CONFIG) private envConfigGateway: EnvConfigGatewayOutputPort) {}

private convertChunkBytesToString = new Transform({
transform(chunk, encoding, callback) {
callback(null, chunk.toString());
},
});

async getTextStream(request: HTTPRequest): Promise<PassThrough | Response> {
const { url, requestArgs } = prepareRequestArgs(request);
const encodeParams = await this.envConfigGateway.paramsEncodingEnabled();
const { url, requestArgs } = prepareRequestArgs(request, encodeParams);

const response = await fetch(url, requestArgs);
if (!response.ok || response.body === null) {
Expand All @@ -27,7 +33,8 @@ export default class StreamingGateway implements StreamGatewayOutputPort {
}

async getJSONChunks(request: HTTPRequest, ndjson: boolean = false): Promise<{ type: 'response' | 'stream'; content: PassThrough | Response }> {
const { url, requestArgs } = prepareRequestArgs(request);
const encodeParams = await this.envConfigGateway.paramsEncodingEnabled();
const { url, requestArgs } = prepareRequestArgs(request, encodeParams);
const response = await fetch(url, requestArgs);

if (!response.ok || response.body === null) {
Expand Down

0 comments on commit dafd58b

Please sign in to comment.