import { setImmediate } from "./timers.ts";import type { Buffer } from "./buffer.ts";import { FreeList } from "./internal/freelist.ts";import { HTTPParser, HTTPParserJS } from "./vendor/http_parser.js";
function parserOnHeaders() { }
function parserOnHeadersComplete( this: { onIncoming: (res: unknown, shouldKeepAlive: boolean) => void; socket: unknown; }, versionMajor: unknown, versionMinor: unknown, headers: unknown, method: unknown, url: unknown, statusCode: unknown, statusMessage: unknown, upgrade: unknown, shouldKeepAlive: boolean,) { const incoming = Object.assign(this.socket, { versionMajor, versionMinor, headers, method, url, statusCode, statusMessage, upgrade, }); this.onIncoming(incoming, shouldKeepAlive);}
function parserOnBody( this: { incoming: any; socket: any }, b: Buffer, start: number, len: number,) { const stream = this.incoming;
if (stream == null) { return; }
if (len > 0 && !stream._dumped) { const slice = b.slice(start, start + len); const ret = stream.push(slice); if (!ret) { if (this.socket) { this.socket.pause(); } } }}
function parserOnMessageComplete( this: { incoming: any; _headers: any; _url: any; socket: any },) { const parser = this; const stream = parser.incoming;
if (stream != null) { stream.complete = true; const headers = parser._headers; if (headers.length) { stream._addHeaderLines(headers, headers.length); parser._headers = []; parser._url = ""; }
stream.push(null); }
const socket = parser.socket; if (socket && !socket._paused && socket.readable) { socket.resume(); }}
export const parsers = new FreeList("parsers", 1000, function parsersCb() { const parser = new HTTPParser();
parser[HTTPParser.kOnHeaders] = parserOnHeaders; (parser as any)[HTTPParser.kOnHeadersComplete] = parserOnHeadersComplete; parser[HTTPParser.kOnBody] = parserOnBody; parser[HTTPParser.kOnMessageComplete] = parserOnMessageComplete;
return parser;});
function closeParserInstance(parser: HTTPParserJS) { parser.close();}
export function freeParser( parser: HTTPParserJS, req: any, socket: any,) { if (parsers.free(parser) === false) { setImmediate(closeParserInstance, parser); } else { parser.free(); } if (req) { req.parser = null; } if (socket) { socket.parser = null; }}
const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/;function checkIsHttpToken(val: string) { return tokenRegExp.test(val);}
const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/;function checkInvalidHeaderChar(val: string) { return headerCharRegex.test(val);}
export function prepareError( err: any, parser: HTTPParserJS, rawPacket: Buffer,) { err.rawPacket = rawPacket || parser.getCurrentBuffer(); if (typeof err.reason === "string") { err.message = `Parse Error: ${err.reason}`; }}
export function isLenient() { return false;}
export const chunkExpression = /(?:^|\W)chunked(?:$|\W)/i;export { checkInvalidHeaderChar as _checkInvalidHeaderChar, checkIsHttpToken as _checkIsHttpToken, HTTPParser,};