Supports OAuth Providers that don't end connections neatly (Google!)

This commit is contained in:
ciaranj
2011-08-15 23:27:06 +01:00
parent 8ba869ff41
commit 0643395b2e
3 changed files with 57 additions and 14 deletions

View File

@ -1,7 +1,8 @@
var querystring= require('querystring'),
crypto= require('crypto'),
https= require('https'),
URL= require('url');
URL= require('url'),
OAuthUtils= require('./_utils');
exports.OAuth2= function(clientId, clientSecret, baseSite, authorizePath, accessTokenPath) {
this._clientId= clientId;
@ -61,20 +62,37 @@ exports.OAuth2.prototype._request= function(method, url, headers, access_token,
headers: realHeaders
};
request = https.request(options, function (response) {
response.addListener("data", function (chunk) {
result+= chunk
});
response.addListener("end", function () {
// Some hosts *cough* google appear to close the connection early / send no content-length header
// allow this behaviour.
var allowEarlyClose= OAuthUtils.isAnEarlyCloseHost(options.host);
var callbackCalled= false;
function passBackControl( response, result ) {
if(!callbackCalled) {
callbackCalled=true;
if( response.statusCode != 200 ) {
callback({ statusCode: response.statusCode, data: result });
} else {
callback(null, result, response);
}
}
}
request = https.request(options, function (response) {
response.on("data", function (chunk) {
result+= chunk
});
response.on("close", function (err) {
if( allowEarlyClose ) {
passBackControl( response, result );
}
});
response.addListener("end", function () {
passBackControl( response, result );
});
});
request.on('error', function(e) {
callbackCalled= true;
callback(e);
});