123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- import { logger } from '@sentry/utils';
- function debug(...args) {
- logger.log('[https-proxy-agent:parse-proxy-response]', ...args);
- }
- function parseProxyResponse(socket) {
- return new Promise((resolve, reject) => {
- // we need to buffer any HTTP traffic that happens with the proxy before we get
- // the CONNECT response, so that if the response is anything other than an "200"
- // response code, then we can re-play the "data" events on the socket once the
- // HTTP parser is hooked up...
- let buffersLength = 0;
- const buffers = [];
- function read() {
- const b = socket.read();
- if (b) ondata(b);
- else socket.once('readable', read);
- }
- function cleanup() {
- socket.removeListener('end', onend);
- socket.removeListener('error', onerror);
- socket.removeListener('readable', read);
- }
- function onend() {
- cleanup();
- debug('onend');
- reject(new Error('Proxy connection ended before receiving CONNECT response'));
- }
- function onerror(err) {
- cleanup();
- debug('onerror %o', err);
- reject(err);
- }
- function ondata(b) {
- buffers.push(b);
- buffersLength += b.length;
- const buffered = Buffer.concat(buffers, buffersLength);
- const endOfHeaders = buffered.indexOf('\r\n\r\n');
- if (endOfHeaders === -1) {
- // keep buffering
- debug('have not received end of HTTP headers yet...');
- read();
- return;
- }
- const headerParts = buffered.slice(0, endOfHeaders).toString('ascii').split('\r\n');
- const firstLine = headerParts.shift();
- if (!firstLine) {
- socket.destroy();
- return reject(new Error('No header received from proxy CONNECT response'));
- }
- const firstLineParts = firstLine.split(' ');
- const statusCode = +firstLineParts[1];
- const statusText = firstLineParts.slice(2).join(' ');
- const headers = {};
- for (const header of headerParts) {
- if (!header) continue;
- const firstColon = header.indexOf(':');
- if (firstColon === -1) {
- socket.destroy();
- return reject(new Error(`Invalid header from proxy CONNECT response: "${header}"`));
- }
- const key = header.slice(0, firstColon).toLowerCase();
- const value = header.slice(firstColon + 1).trimStart();
- const current = headers[key];
- if (typeof current === 'string') {
- headers[key] = [current, value];
- } else if (Array.isArray(current)) {
- current.push(value);
- } else {
- headers[key] = value;
- }
- }
- debug('got proxy server response: %o %o', firstLine, headers);
- cleanup();
- resolve({
- connect: {
- statusCode,
- statusText,
- headers,
- },
- buffered,
- });
- }
- socket.on('error', onerror);
- socket.on('end', onend);
- read();
- });
- }
- export { parseProxyResponse };
- //# sourceMappingURL=parse-proxy-response.js.map
|