100 lines
2.9 KiB
JavaScript
Executable file
100 lines
2.9 KiB
JavaScript
Executable file
'use strict'
|
|
|
|
// NOTE: Mostly copy paste from node
|
|
exports.writeHead = function writeHead (statusCode, reason, obj) {
|
|
var headers
|
|
|
|
if (typeof reason === 'string') {
|
|
// writeHead(statusCode, reasonPhrase[, headers])
|
|
this.statusMessage = reason
|
|
} else {
|
|
// writeHead(statusCode[, headers])
|
|
this.statusMessage =
|
|
this.statusMessage || 'unknown'
|
|
obj = reason
|
|
}
|
|
this.statusCode = statusCode
|
|
|
|
if (this._headers) {
|
|
// Slow-case: when progressive API and header fields are passed.
|
|
if (obj) {
|
|
var keys = Object.keys(obj)
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var k = keys[i]
|
|
if (k) this.setHeader(k, obj[k])
|
|
}
|
|
}
|
|
// only progressive api is used
|
|
headers = this._renderHeaders()
|
|
} else {
|
|
// only writeHead() called
|
|
headers = obj
|
|
}
|
|
|
|
if (statusCode === 204 || statusCode === 304 ||
|
|
(statusCode >= 100 && statusCode <= 199)) {
|
|
// RFC 2616, 10.2.5:
|
|
// The 204 response MUST NOT include a message-body, and thus is always
|
|
// terminated by the first empty line after the header fields.
|
|
// RFC 2616, 10.3.5:
|
|
// The 304 response MUST NOT contain a message-body, and thus is always
|
|
// terminated by the first empty line after the header fields.
|
|
// RFC 2616, 10.1 Informational 1xx:
|
|
// This class of status code indicates a provisional response,
|
|
// consisting only of the Status-Line and optional headers, and is
|
|
// terminated by an empty line.
|
|
this._hasBody = false
|
|
}
|
|
|
|
// don't keep alive connections where the client expects 100 Continue
|
|
// but we sent a final status; they may put extra bytes on the wire.
|
|
if (this._expect_continue && !this._sent100) {
|
|
this.shouldKeepAlive = false
|
|
}
|
|
|
|
// Implicit headers sent!
|
|
this._header = true
|
|
this._headerSent = true
|
|
|
|
if (this.socket._handle) { this.socket._handle._spdyState.stream.respond(this.statusCode, headers) }
|
|
}
|
|
|
|
exports.end = function end (data, encoding, callback) {
|
|
if (!this._headerSent) {
|
|
this.writeHead(this.statusCode)
|
|
}
|
|
|
|
if (!this.socket._handle) {
|
|
return
|
|
}
|
|
|
|
// Compatibility with Node.js core
|
|
this.finished = true
|
|
|
|
var self = this
|
|
var handle = this.socket._handle
|
|
handle._spdyState.ending = true
|
|
this.socket.end(data, encoding, function () {
|
|
self.constructor.prototype.end.call(self, '', 'utf8', callback)
|
|
})
|
|
}
|
|
|
|
exports.push = function push (path, headers, callback) {
|
|
var frame = {
|
|
path: path,
|
|
method: headers.method ? headers.method.toString() : 'GET',
|
|
status: headers.status ? parseInt(headers.status, 10) : 200,
|
|
host: this._req.headers.host,
|
|
headers: headers.request,
|
|
response: headers.response
|
|
}
|
|
|
|
var stream = this.spdyStream
|
|
return stream.pushPromise(frame, callback)
|
|
}
|
|
|
|
exports.writeContinue = function writeContinue (callback) {
|
|
if (this.socket._handle) {
|
|
this.socket._handle._spdyState.stream.respond(100, {}, callback)
|
|
}
|
|
}
|