101 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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)
 | 
						|
  }
 | 
						|
}
 |