| '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) | 
|   } | 
| } |