/
request.js
88 lines (72 loc) · 2.32 KB
/
request.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
var http = require('http');
var events = require('events');
var sys = require('sys');
var Url = require('url');
// parts of this based on the request object from http://github.com/kriszyp/jsgi-node
function Request(request){
events.EventEmitter.call(this);
var
url = Url.parse( request.url ),
headers = request.headers,
namePort = headers.host.split( ":" ),
lowerCaseHeaders = {},
self = this,
listeners = {},
inputBuffers = {},
completeEvents = {},
emittedEvents = {}
bodyListener = false,
inputBuffer = [],
bodyComplete = false,
completeEmitted = false;
this.method = request.method;
this.scriptName = "";
this.pathInfo = url.pathname;
this.url = request.url;
this.queryString = url.query || "";
this.serverName = namePort[ 0 ];
this.serverPort = namePort[ 1 ] || 80;
this.scheme = "http";
for(var i in headers){
lowerCaseHeaders[i.toLowerCase()] = headers[i];
}
this.headers = lowerCaseHeaders;
this.version = [ request.httpVersionMajor, request.httpVersionMinor ];
request.isComplete = false;
this.addListener = function(event){
if(event == "body"){
if( self.bodyEmitStarted )
throw(new Error("Request Body Emitting Already Started"));
bodyListener = true;
}
Request.prototype.addListener.apply(this, arguments);
// Have to give the complete listener a chance to be added
process.nextTick(shiftAndEmit)
}
// From here we deal with buffering the request as it comes in
function shiftAndEmit(){
if(!bodyListener) return;
if(inputBuffer.length > 0){
var chunk = inputBuffer.shift();
self.bodyEmitStarted = true;
self.emit("body", chunk);
}
if(bodyComplete && !completeEmitted && inputBuffer.length == 0){
self.emit("complete");
completeEmitted = true;
} else if(inputBuffer.length > 0) {
process.nextTick(shiftAndEmit);
}
}
request
.addListener( "body", function( data ) {
inputBuffer.push( data );
shiftAndEmit();
})
.addListener("complete", function() {
bodyComplete = true;
shiftAndEmit();
});
}
sys.inherits(Request, events.EventEmitter);
exports.Request = Request;