Skip to content

Commit

Permalink
[logging] Downgrade hapi connection errors when connecting with the w…
Browse files Browse the repository at this point in the history
…rong protocol
  • Loading branch information
jbudz committed Apr 12, 2017
1 parent 3ff7d5b commit 04b0d21
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 6 deletions.
32 changes: 31 additions & 1 deletion src/server/logging/__tests__/log_interceptor.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ import expect from 'expect.js';

import { LogInterceptor } from '../log_interceptor';

function stubClientErrorEvent(errno) {
function stubClientErrorEvent(errno, message) {
const error = new Error();
error.errno = errno;
error.message = message;

return {
event: 'error',
Expand Down Expand Up @@ -110,4 +111,33 @@ describe('server logging LogInterceptor', () => {
expect(interceptor.downgradeIfEcanceled(event)).to.be(null);
});
});

describe('#downgradeIfHTTPSWhenHTTP', () => {
it('transforms https requests when serving http errors', () => {
const interceptor = new LogInterceptor();
const event = stubClientErrorEvent(undefined, 'Parse Error');
assertDowngraded(interceptor.downgradeIfHTTPSWhenHTTP(event));
});

it('ignores non events', () => {
const interceptor = new LogInterceptor();
const event = stubClientErrorEvent(null, 'Not Parse Error');
expect(interceptor.downgradeIfEcanceled(event)).to.be(null);
});
});

describe('#downgradeIfHTTPWhenHTTPS', () => {
it('transforms http requests when serving https errors', () => {
const message = '40735139278848:error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request:../deps/openssl/openssl/ssl/s23_srvr.c:394'; // eslint-disable-line max-len
const interceptor = new LogInterceptor();
const event = stubClientErrorEvent(undefined, message);
assertDowngraded(interceptor.downgradeIfHTTPWhenHTTPS(event));
});

it('ignores non events', () => {
const interceptor = new LogInterceptor();
const event = stubClientErrorEvent(null, 'Not error');
expect(interceptor.downgradeIfEcanceled(event)).to.be(null);
});
});
});
44 changes: 39 additions & 5 deletions src/server/logging/log_interceptor.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
import Stream from 'stream';
import { get, isEqual } from 'lodash';

const GET_CLIENT_HELLO = /GET_CLIENT_HELLO:http/;

function doTagsMatch(event, tags) {
return isEqual(get(event, 'tags'), tags);
}

function doesMessageMatch(errorMessage, match) {
if (!errorMessage) return false;
const isRegExp = match instanceof RegExp;
if (isRegExp) return match.test(errorMessage);
return errorMessage === match;
}
// converts the given event into a debug log if it's an error of the given type
function downgradeIfErrorMatches(errorType, event) {
function downgradeIfErrorType(errorType, event) {
const isClientError = doTagsMatch(event, ['connection', 'client', 'error']);
const matchesErrorType = isClientError && get(event, 'data.errno') === errorType;

Expand All @@ -23,6 +31,22 @@ function downgradeIfErrorMatches(errorType, event) {
};
}

function downgradeIfErrorMessage(match, event) {
const isClientError = doTagsMatch(event, ['connection', 'client', 'error']);
const errorMessage = get(event, 'data.message');
const matchesErrorMessage = isClientError && doesMessageMatch(errorMessage, match);

if (!matchesErrorMessage) return null;

return {
event: 'log',
pid: event.pid,
timestamp: event.timestamp,
tags: ['debug', 'connection'],
data: errorMessage
};
}

export class LogInterceptor extends Stream.Transform {
constructor() {
super({
Expand All @@ -42,7 +66,7 @@ export class LogInterceptor extends Stream.Transform {
* @param {object} - log event
*/
downgradeIfEconnreset(event) {
return downgradeIfErrorMatches('ECONNRESET', event);
return downgradeIfErrorType('ECONNRESET', event);
}

/**
Expand All @@ -56,7 +80,7 @@ export class LogInterceptor extends Stream.Transform {
* @param {object} - log event
*/
downgradeIfEpipe(event) {
return downgradeIfErrorMatches('EPIPE', event);
return downgradeIfErrorType('EPIPE', event);
}

/**
Expand All @@ -70,13 +94,23 @@ export class LogInterceptor extends Stream.Transform {
* @param {object} - log event
*/
downgradeIfEcanceled(event) {
return downgradeIfErrorMatches('ECANCELED', event);
return downgradeIfErrorType('ECANCELED', event);
}

downgradeIfHTTPSWhenHTTP(event) {
return downgradeIfErrorMessage('Parse Error', event);
}

downgradeIfHTTPWhenHTTPS(event) {
return downgradeIfErrorMessage(GET_CLIENT_HELLO, event);
}

_transform(event, enc, next) {
const downgraded = this.downgradeIfEconnreset(event)
|| this.downgradeIfEpipe(event)
|| this.downgradeIfEcanceled(event);
|| this.downgradeIfEcanceled(event)
|| this.downgradeIfHTTPSWhenHTTP(event)
|| this.downgradeIfHTTPWhenHTTPS(event);

this.push(downgraded || event);
next();
Expand Down

0 comments on commit 04b0d21

Please sign in to comment.