Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions lib/api/api-connect.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,10 @@ class ConnectHandler extends AsyncResource {
this.callback = null

let responseHeaders = headers
const rawHeaders = controller?.rawHeaders
// Indicates is an HTTP2Session
if (responseHeaders != null) {
responseHeaders = this.responseHeaders === 'raw'
? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])
: headers
if (responseHeaders != null && this.responseHeaders === 'raw') {
const rawHeaders = controller?.rawHeaders
responseHeaders = Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : []
}

this.runInAsyncScope(callback, null, null, {
Expand Down
12 changes: 8 additions & 4 deletions lib/api/api-pipeline.js
Original file line number Diff line number Diff line change
Expand Up @@ -165,9 +165,11 @@ class PipelineHandler extends AsyncResource {

if (statusCode < 200) {
if (this.onInfo) {
const rawHeaders = controller?.rawHeaders
const responseHeaders = this.responseHeaders === 'raw'
? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])
? (() => {
const rawHeaders = controller?.rawHeaders
return Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : []
})()
: headers
this.onInfo({ statusCode, headers: responseHeaders })
}
Expand All @@ -179,9 +181,11 @@ class PipelineHandler extends AsyncResource {
let body
try {
this.handler = null
const rawHeaders = controller?.rawHeaders
const responseHeaders = this.responseHeaders === 'raw'
? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])
? (() => {
const rawHeaders = controller?.rawHeaders
return Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : []
})()
: headers
body = this.runInAsyncScope(handler, null, {
statusCode,
Expand Down
6 changes: 4 additions & 2 deletions lib/api/api-request.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,11 @@ class RequestHandler extends AsyncResource {
onResponseStart (controller, statusCode, headers, statusText) {
const { callback, opaque, context, responseHeaders, highWaterMark } = this

const rawHeaders = controller?.rawHeaders
const responseHeaderData = responseHeaders === 'raw'
? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])
? (() => {
const rawHeaders = controller?.rawHeaders
return Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : []
})()
: headers

if (statusCode < 200) {
Expand Down
6 changes: 4 additions & 2 deletions lib/api/api-stream.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,11 @@ class StreamHandler extends AsyncResource {
onResponseStart (controller, statusCode, headers, _statusMessage) {
const { factory, opaque, context, responseHeaders } = this

const rawHeaders = controller?.rawHeaders
const responseHeaderData = responseHeaders === 'raw'
? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])
? (() => {
const rawHeaders = controller?.rawHeaders
return Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : []
})()
: headers

if (statusCode < 200) {
Expand Down
6 changes: 4 additions & 2 deletions lib/api/api-upgrade.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,11 @@ class UpgradeHandler extends AsyncResource {

this.callback = null

const rawHeaders = controller?.rawHeaders
const responseHeaders = this.responseHeaders === 'raw'
? (Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : [])
? (() => {
const rawHeaders = controller?.rawHeaders
return Array.isArray(rawHeaders) ? util.parseRawHeaders(rawHeaders) : []
})()
: headers

this.runInAsyncScope(callback, null, null, {
Expand Down
27 changes: 21 additions & 6 deletions lib/core/request.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,37 @@ function isValidContentLengthHeaderValue (val) {
const kHandler = Symbol('handler')
const kController = Symbol('controller')
const kResume = Symbol('resume')
const kRawHeaders = Symbol('raw headers')

class RequestController {
#paused = false
#reason = null
#aborted = false
#abort

[kResume] = null
[kResume] = null;
[kRawHeaders] = null

rawHeaders = null
rawTrailers = null

constructor (abort) {
this.#abort = abort
}

get rawHeaders () {
let rawHeaders = this[kRawHeaders]
if (typeof rawHeaders === 'function') {
rawHeaders = rawHeaders()
this[kRawHeaders] = rawHeaders
}

return rawHeaders
}

set rawHeaders (rawHeaders) {
this[kRawHeaders] = rawHeaders
}

pause () {
this.#paused = true
}
Expand Down Expand Up @@ -325,7 +340,7 @@ class Request {
return this[kHandler].onResponseStarted?.()
}

onResponseStart (statusCode, headers, resume, statusText) {
onResponseStart (statusCode, headers, resume, statusText, rawHeaders = headers) {
assert(!this.aborted)
assert(!this.completed)

Expand All @@ -336,7 +351,7 @@ class Request {
const controller = this[kController]
if (controller) {
controller[kResume] = resume
controller.rawHeaders = headers
controller.rawHeaders = rawHeaders
}

const parsedHeaders = Array.isArray(headers) ? parseHeaders(headers) : headers
Expand Down Expand Up @@ -368,13 +383,13 @@ class Request {
}
}

onRequestUpgrade (statusCode, headers, socket) {
onRequestUpgrade (statusCode, headers, socket, rawHeaders = headers) {
assert(!this.aborted)
assert(!this.completed)

const controller = this[kController]
if (controller) {
controller.rawHeaders = headers
controller.rawHeaders = rawHeaders
}

const parsedHeaders = Array.isArray(headers) ? parseHeaders(headers) : headers
Expand Down
16 changes: 14 additions & 2 deletions lib/dispatcher/client-h2.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,18 @@ function getH2HeaderNameBuffer (name) {
return buffer
}

function parseH2HeadersObject (headers) {
const result = Object.create(null)

for (const name in headers) {
if (name[0] !== ':') {
result[name] = headers[name]
}
}

return result
}

function parseH2Headers (headers) {
const result = []

Expand Down Expand Up @@ -604,7 +616,7 @@ function writeH2 (client, request) {

const statusCode = headers[HTTP2_HEADER_STATUS]

request.onRequestUpgrade(statusCode, parseH2Headers(headers), stream)
request.onRequestUpgrade(statusCode, parseH2HeadersObject(headers), stream, () => parseH2Headers(headers))

if (!request.aborted && !request.completed) {
stream.off('error', onUpgradeStreamError)
Expand Down Expand Up @@ -797,7 +809,7 @@ function writeH2 (client, request) {
return
}

if (request.onResponseStart(Number(statusCode), parseH2Headers(headers), stream.resume.bind(stream), '') === false) {
if (request.onResponseStart(Number(statusCode), parseH2HeadersObject(headers), stream.resume.bind(stream), '', () => parseH2Headers(headers)) === false) {
stream.pause()
}

Expand Down
Loading