Skip to content

Account for removal of duplicate data from host #238

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 11, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/WorkerChannel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { IFunctionLoader } from './FunctionLoader';
import { CreateContextAndInputs, LogCallback, ResultCallback } from './Context';
import { IEventStream } from './GrpcService';
import { toTypedData } from './converters';
import { augmentTriggerMetadata } from './augmenters';
import { systemError, systemLog } from './utils/Logger';
import { InternalException } from './utils/InternalException';

Expand Down Expand Up @@ -82,8 +83,10 @@ export class WorkerChannel implements IWorkerChannel {
* @param msg gRPC message content
*/
public workerInitRequest(requestId: string, msg: rpc.WorkerInitRequest) {
let capabilitiesDictionary = {};
capabilitiesDictionary['RpcHttpBodyOnly'] = "true";
const capabilitiesDictionary = {
RpcHttpTriggerMetadataRemoved: "true",
RpcHttpBodyOnly: "true"
};
this._eventStream.write({
requestId: requestId,
workerInitResponse: {
Expand Down Expand Up @@ -126,6 +129,9 @@ export class WorkerChannel implements IWorkerChannel {
* @param msg gRPC message content
*/
public invocationRequest(requestId: string, msg: rpc.InvocationRequest) {
// Repopulate triggerMetaData if http.
augmentTriggerMetadata(msg);

let info = this._functionLoader.getInfo(<string>msg.functionId);
let logCallback: LogCallback = (level, ...args) => {
this.log({
Expand Down Expand Up @@ -267,4 +273,4 @@ export class WorkerChannel implements IWorkerChannel {

return status;
}
}
}
34 changes: 34 additions & 0 deletions src/augmenters/InvocationRequestAugmenters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { AzureFunctionsRpcMessages as rpc } from '../../azure-functions-language-worker-protobuf/src/rpc';

/**
* Augments TriggerMetadata from invocation with $request.
* @param request IInvocationRequest object
*/
export function augmentTriggerMetadata(request: rpc.IInvocationRequest) {
var key: any, value: any;
if (request.inputData) {
request.inputData.forEach((element, _index, _array) => {
let elementKeys = Object.keys(element);
if (elementKeys) {
for (let val of elementKeys) {
if (element[val] && element[val].http) {
key = element["name"];
value = element[val];
break;
}
}
}
});
}
if(request && request.triggerMetadata)
{
if(key && (request.triggerMetadata[key] === undefined || request.triggerMetadata[key] === null))
{
request.triggerMetadata[key] = value;
}
if((request.triggerMetadata["$request"] === undefined || request.triggerMetadata["$request"] === null))
{
request.triggerMetadata["$request"] = value;
}
}
}
1 change: 1 addition & 0 deletions src/augmenters/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './InvocationRequestAugmenters';
3 changes: 2 additions & 1 deletion src/converters/BindingConverters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ export function getBindingDefinitions(info: FunctionInfo): BindingDefinition[] {
export function getNormalizedBindingData(request: rpc.IInvocationRequest): Dict<any> {
let bindingData: Dict<any> = {
invocationId: request.invocationId
};
};

// node binding data is camel cased due to language convention
if (request.triggerMetadata) {
Object.assign(bindingData, convertKeysToCamelCase(request.triggerMetadata))
Expand Down
1 change: 1 addition & 0 deletions test/BindingConvertersTests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ describe('Binding Converters', () => {
string: "Https://mock/"
}
};

var request: rpc.IInvocationRequest = <rpc.IInvocationRequest> {
triggerMetadata: triggerDataMock,
invocationId: "12341"
Expand Down
49 changes: 43 additions & 6 deletions test/WorkerChannelTests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ describe('WorkerChannel', () => {
requestId: 'id',
workerInitResponse: {
capabilities: {
'RpcHttpBodyOnly': "true"
'RpcHttpBodyOnly': "true",
'RpcHttpTriggerMetadataRemoved': "true"
},
result: {
status: rpc.StatusResult.Status.Success
Expand Down Expand Up @@ -161,13 +162,45 @@ describe('WorkerChannel', () => {
name: 'test',
outputBindings: {}
})

var triggerDataMock: { [k: string]: rpc.ITypedData } = {
"Headers": {
json: JSON.stringify({Connection: 'Keep-Alive'})
},
"Sys": {
json: JSON.stringify({MethodName: 'test-js', UtcNow: '2018', RandGuid: '3212'})
}
};

var inputDataValue = {
name: "req",
data: {
data: "http",
http:
{
body:
{
data: "string",
body: "blahh"
},
rawBody:
{
data: "string",
body: "blahh"
}
}
}
};

var actualInvocationRequest: rpc.IInvocationRequest = <rpc.IInvocationRequest> {
functionId: 'id',
invocationId: '1',
inputData: [inputDataValue],
triggerMetadata: triggerDataMock,
};

stream.addTestMessage({
invocationRequest: {
functionId: 'id',
invocationId: '1',
inputData: []
}
invocationRequest: actualInvocationRequest
});

sinon.assert.calledWithMatch(stream.written, <rpc.IStreamingMessage> {
Expand All @@ -179,6 +212,10 @@ describe('WorkerChannel', () => {
outputData: []
}
});

// triggerMedata will be augmented with inpuDataValue since "RpcHttpTriggerMetadataRemoved" capability is set to true and therefore not populated by the host.
expect(JSON.stringify(actualInvocationRequest.triggerMetadata!.$request)).to.equal(JSON.stringify(inputDataValue.data));
expect(JSON.stringify(actualInvocationRequest.triggerMetadata!.req)).to.equal(JSON.stringify(inputDataValue.data));
});

it ('throws for malformed messages', () => {
Expand Down