Skip to content

Commit ca76b3c

Browse files
committed
Proper handling of GitHub post-receive hook format.
1 parent 43e9203 commit ca76b3c

File tree

4 files changed

+29
-21
lines changed

4 files changed

+29
-21
lines changed

lib/hook.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
11
var semver = require( "semver" ),
22
Step = require( "step" ),
33
pluginsDb = require( "./pluginsdb" ),
4-
service = require( "./service" ),
54
retry = require( "./retrydb" ),
65
logger = require( "./logger" );
76

8-
function processHook( data, fn ) {
9-
var repo = service.getRepoByHook( data );
10-
11-
if ( !repo ) {
12-
logger.warn( "Could not parse hook: " + JSON.stringify( data ) );
13-
return fn( new Error( "Could not parse hook." ) );
14-
}
15-
7+
function processHook( repo, fn ) {
168
Step(
179
function() {
1810
processVersions( repo, this );

lib/service.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -377,11 +377,15 @@ module.exports = {
377377
},
378378

379379
getRepoByHook: function( data ) {
380-
if ( !services.github.test( data ) ) {
381-
return null;
380+
var service, parsed;
381+
for ( service in services ) {
382+
parsed = services[ service ].test( data );
383+
if ( parsed ) {
384+
return new services[ service ]( parsed );
385+
}
382386
}
383387

384-
return new services.github( data );
388+
return null;
385389
}
386390
};
387391

lib/service/github.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var fs = require( "fs" ),
2+
querystring = require( "querystring" ),
23
exec = require( "child_process" ).exec,
34
semver = require( "semver" ),
45
Step = require( "step" ),
@@ -44,7 +45,18 @@ function GithubRepo( userName, repoName ) {
4445
}
4546

4647
GithubRepo.test = function( data ) {
47-
return reGithubUrl.test( data.repository && data.repository.url );
48+
try {
49+
data = querystring.parse( data );
50+
data = JSON.parse( data.payload );
51+
} catch( error ) {
52+
return null;
53+
}
54+
55+
if ( reGithubUrl.test( data.repository && data.repository.url ) ) {
56+
return data;
57+
}
58+
59+
return null;
4860
};
4961

5062
// service interface

scripts/update-server.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var http = require( "http" ),
2+
service = require( "../lib/service" ),
23
hook = require( "../lib/hook" ),
34
logger = require( "../lib/logger" );
45

@@ -12,18 +13,17 @@ process.on( "uncaughtException", function( error ) {
1213
});
1314

1415
var server = http.createServer(function( request, response ) {
15-
var json = "";
16+
var data = "";
1617
request.setEncoding( "utf8" );
1718
request.on( "data", function( chunk ) {
18-
json += chunk;
19+
data += chunk;
1920
});
2021

2122
request.on( "end", function() {
22-
try {
23-
json = JSON.parse( json );
24-
} catch( e ) {
25-
// Invalid JSON, stop processing
26-
logger.error( "Invalid request: " + json );
23+
var repo = service.getRepoByHook( data );
24+
if ( !repo ) {
25+
// Invalid data, stop processing
26+
logger.error( "Invalid request: " + data );
2727
response.writeHead( 400 );
2828
response.end();
2929
return;
@@ -34,7 +34,7 @@ var server = http.createServer(function( request, response ) {
3434
response.end();
3535

3636
// Process the request
37-
hook.processHook( json, function( error ) {
37+
hook.processHook( repo, function( error ) {
3838
if ( error ) {
3939
logger.error( "Error processing hook: " + error.stack );
4040
}

0 commit comments

Comments
 (0)