Skip to content
This repository has been archived by the owner on Jun 21, 2019. It is now read-only.

Commit

Permalink
Merge pull request #5 from universalbasket/fix-respmod
Browse files Browse the repository at this point in the history
Fix responding to both REQMOD and RESPMOD.
  • Loading branch information
randunel committed Aug 3, 2016
2 parents 843f2b9 + 3249d56 commit 72555d4
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 17 deletions.
4 changes: 4 additions & 0 deletions src/decoder.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ module.exports = function createDecoder(socket, events) {
decoder.decode(data);
});

socket.on('error', err => {
events.emit('error', err);
});

return {
getDecodedMessage,
acceptNewRequest,
Expand Down
78 changes: 61 additions & 17 deletions src/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ module.exports = function createServer(options) {
function handleConnection(socket) {
const connection = createIcapConnection(socket);

connection.events.on('error', handleServerError);

connection.events.on('icap-request', icapDetails => {
const handler = handlers[icapDetails.path];
if (!handler) {
Expand All @@ -79,29 +81,53 @@ module.exports = function createServer(options) {
if (!response) {
return connection.dontChange();
}
/**
* bodyFromUser source depends on response.requestHeaders or response.responseHeaders presence
* responseType depends on response.requestHeaders or response.responseHeaders presence
*
* responseDetails = {
* bodyFromUser: response.requestBody | response.responseBody | undefined
* requestType: 'request' | 'response'
* responseType: 'request' | 'response'
* }
*/
const responseDetails = getBodyDetails(handler.method, response);
const requestType = responseDetails.requestType;
const responseType = responseDetails.responseType;
const bodyFromUser = responseDetails.bodyFromUser;
let body;
if (bodyFromUser) {
body = sanitizeBody(bodyFromUser);
} else if (responseType === requestType) {
body = sanitizeBody(icapRequest.getRawBody());
}
return Promise.all([
sanitizeRequestHeaders(response.requestHeaders, icapRequest),
sanitizeResponseHeaders(response.responseHeaders, icapRequest),
sanitizeBody(response.requestBody, icapRequest),
sanitizeBody(response.responseBody, icapRequest),
body,
])
.then(results => {
const [
requestHeaders,
responseHeaders,
requestBody,
responseBody
body
] = results;
connection.respond({
const response = {
statusCode: 200,
statusText: 'OK',
payload: new Map([
};
if (responseType === 'request') {
response.payload = new Map([
['req-hdr', requestHeaders],
['req-body', body]
]);
} else {
response.payload = new Map([
['res-hdr', responseHeaders],
['req-body', requestBody],
['res-body', responseBody]
])
});
['res-body', body]
]);
}
connection.respond(response);
});
})
.catch(err => {
Expand All @@ -111,6 +137,30 @@ module.exports = function createServer(options) {
});
}

function getBodyDetails(method, userResponse) {
if (method === 'REQMOD') {
const requestType = 'request';
if (!!userResponse.responseHeaders) {
return {
bodyFromUser: userResponse.responseBody,
responseType: 'response',
requestType
};
}
return {
bodyFromUser: userResponse.requestBody,
responseType: 'request',
requestType
};
}
const requestType = 'response';
return {
bodyFromUser: userResponse.responseBody,
responseType: requestType,
requestType
};
}

function handleOptions(connection, handler) {
const headers = [
['Methods', handler.method]
Expand Down Expand Up @@ -181,13 +231,7 @@ function sanitizeResponseHeaders(headers, icapRequest) {
return sanitizeHeaders(headers);
}

function sanitizeBody(body, icapRequest) {
if (!body) {
if (!icapRequest.hasBody()) {
return;
}
return icapRequest.getRawBody();
}
function sanitizeBody(body) {
return body;
}

Expand Down

0 comments on commit 72555d4

Please sign in to comment.