From 0b921f1819740560a2859571b22c03343ad9755b Mon Sep 17 00:00:00 2001 From: restyler Date: Tue, 16 Nov 2021 09:58:25 +0400 Subject: [PATCH 1/6] Update index.js --- index.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/index.js b/index.js index 4d47e5d..28bce12 100644 --- a/index.js +++ b/index.js @@ -5,9 +5,9 @@ var nextLine = require('next-line') // RFC-2068 Start-Line definitions: // Request-Line: Method SP Request-URI SP HTTP-Version CRLF // Status-Line: HTTP-Version SP Status-Code SP Reason-Phrase CRLF -var startLine = /^[A-Z_]+(\/\d\.\d)? / -var requestLine = /^([A-Z_]+) (.+) [A-Z]+\/(\d)\.(\d)$/ -var statusLine = /^[A-Z]+\/(\d)\.(\d) (\d{3}) (.*)$/ +var startLine = /^[A-Z_]+(\/\d)?/ +var requestLine = /^([A-Z_]+) (.+) HTTP\/([12](\.(\d))?)$/ +var statusLine = /^HTTP\/([12](\.(\d))?) (\d{3})\s?(.*)?$/ module.exports = function (data, onlyHeaders) { return parse(normalize(data), onlyHeaders) @@ -17,20 +17,25 @@ function parse (str, onlyHeaders) { var line = firstLine(str) var match + //console.log('line', line + '#'); + console.log('line.match(startLine)', startLine.test(line)) + //console.log('line.match(statusLine)', line.match(statusLine)) + + if (onlyHeaders && startLine.test(line)) { return parseHeaders(str) } else if ((match = line.match(requestLine)) !== null) { return { method: match[1], url: match[2], - version: { major: parseInt(match[3], 10), minor: parseInt(match[4], 10) }, + version: match[3], headers: parseHeaders(str) } } else if ((match = line.match(statusLine)) !== null) { return { - version: { major: parseInt(match[1], 10), minor: parseInt(match[2], 10) }, - statusCode: parseInt(match[3], 10), - statusMessage: match[4], + version: match[1],//{ major: parseInt(match[1], 10), minor: parseInt(match[2], 10) }, + statusCode: parseInt(match[4], 10), + statusMessage: match[5] ?? '', headers: parseHeaders(str) } } else { From 69a89957bd02d23f79afc7682430360b32d92dc9 Mon Sep 17 00:00:00 2001 From: restyler Date: Tue, 16 Nov 2021 09:58:56 +0400 Subject: [PATCH 2/6] Update test.js --- test.js | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/test.js b/test.js index ec74ced..f838b33 100644 --- a/test.js +++ b/test.js @@ -7,6 +7,7 @@ var httpHeaders = require('./') var requestLine = 'GET /foo HTTP/1.1\r\n' var statusLine = 'HTTP/1.1 200 OK\r\n' +var statusLineV2 = 'HTTP/2 200 \r\n' var msgHeaders = 'Date: Tue, 10 Jun 2014 07:29:20 GMT\r\n' + 'Connection: keep-alive\r\n' + 'Transfer-Encoding: chunked\r\n' + @@ -20,6 +21,7 @@ var msgHeaders = 'Date: Tue, 10 Jun 2014 07:29:20 GMT\r\n' + '\r\n' var requestMsg = requestLine + msgHeaders + 'Hello: World' var responseMsg = statusLine + msgHeaders + 'Hello: World' +var responseMsgV2 = statusLine + msgHeaders + 'Hello: World' var headerResult = { date: 'Tue, 10 Jun 2014 07:29:20 GMT', @@ -31,15 +33,22 @@ var headerResult = { 'x-multi-line-header': 'Foo Bar' } var responseResult = { - version: { major: 1, minor: 1 }, + version: '1.1', statusCode: 200, statusMessage: 'OK', headers: headerResult } +var responseResultV2 = { + version: '2', + statusCode: 200, + statusMessage: '', + headers: headerResult +} + var requestResult = { method: 'GET', url: '/foo', - version: { major: 1, minor: 1 }, + version: '1.1', headers: headerResult } @@ -70,11 +79,13 @@ test('empty buffer', function (t) { test('start-line + header', function (t) { t.deepEqual(httpHeaders(requestLine + msgHeaders), requestResult) t.deepEqual(httpHeaders(statusLine + msgHeaders), responseResult) + t.deepEqual(httpHeaders(statusLineV2 + msgHeaders), responseResultV2) t.deepEqual(httpHeaders(new Buffer(requestLine + msgHeaders)), requestResult) t.deepEqual(httpHeaders(new Buffer(statusLine + msgHeaders)), responseResult) t.deepEqual(httpHeaders(requestLine + msgHeaders, true), headerResult) t.deepEqual(httpHeaders(statusLine + msgHeaders, true), headerResult) t.deepEqual(httpHeaders(new Buffer(requestLine + msgHeaders), true), headerResult) + console.log('checking', statusLine + msgHeaders) t.deepEqual(httpHeaders(new Buffer(statusLine + msgHeaders), true), headerResult) t.end() }) @@ -83,7 +94,7 @@ test('request-line only', function (t) { var requestResult = { method: 'GET', url: '/foo', - version: { major: 1, minor: 1 }, + version: '1.1', headers: {} } @@ -96,7 +107,7 @@ test('request-line only', function (t) { test('status-line only', function (t) { var responseResult = { - version: { major: 1, minor: 1 }, + version: '1.1', statusCode: 200, statusMessage: 'OK', headers: {} @@ -109,14 +120,33 @@ test('status-line only', function (t) { t.end() }) +test('status-line only (HTTP/2)', function (t) { + var responseResult = { + version: '2', + statusCode: 200, + statusMessage: '', + headers: {} + } + + t.deepEqual(httpHeaders(statusLineV2 + '\r\n'), responseResult) + t.deepEqual(httpHeaders(new Buffer(statusLineV2 + '\r\n')), responseResult) + t.deepEqual(httpHeaders(statusLineV2 + '\r\n', true), {}) + t.deepEqual(httpHeaders(new Buffer(statusLineV2 + '\r\n'), true), {}) + t.end() +}) + + test('headers only', function (t) { + console.log('checking', msgHeaders) t.deepEqual(httpHeaders(msgHeaders), headerResult) - t.deepEqual(httpHeaders(new Buffer(msgHeaders)), headerResult) + /*t.deepEqual(httpHeaders(new Buffer(msgHeaders)), headerResult) t.deepEqual(httpHeaders(msgHeaders, true), headerResult) - t.deepEqual(httpHeaders(new Buffer(msgHeaders), true), headerResult) + t.deepEqual(httpHeaders(new Buffer(msgHeaders), true), headerResult)*/ t.end() }) +return; + test('full http response', function (t) { t.deepEqual(httpHeaders(requestMsg), requestResult) t.deepEqual(httpHeaders(responseMsg), responseResult) From 4f87a4ef2aa93d669944605fdd6425f4ac2b3991 Mon Sep 17 00:00:00 2001 From: restyler Date: Tue, 16 Nov 2021 10:12:33 +0400 Subject: [PATCH 3/6] Update test.js --- test.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test.js b/test.js index f838b33..f8e38c7 100644 --- a/test.js +++ b/test.js @@ -85,7 +85,7 @@ test('start-line + header', function (t) { t.deepEqual(httpHeaders(requestLine + msgHeaders, true), headerResult) t.deepEqual(httpHeaders(statusLine + msgHeaders, true), headerResult) t.deepEqual(httpHeaders(new Buffer(requestLine + msgHeaders), true), headerResult) - console.log('checking', statusLine + msgHeaders) + t.deepEqual(httpHeaders(new Buffer(statusLine + msgHeaders), true), headerResult) t.end() }) @@ -139,13 +139,12 @@ test('status-line only (HTTP/2)', function (t) { test('headers only', function (t) { console.log('checking', msgHeaders) t.deepEqual(httpHeaders(msgHeaders), headerResult) - /*t.deepEqual(httpHeaders(new Buffer(msgHeaders)), headerResult) + t.deepEqual(httpHeaders(new Buffer(msgHeaders)), headerResult) t.deepEqual(httpHeaders(msgHeaders, true), headerResult) - t.deepEqual(httpHeaders(new Buffer(msgHeaders), true), headerResult)*/ + t.deepEqual(httpHeaders(new Buffer(msgHeaders), true), headerResult) t.end() }) -return; test('full http response', function (t) { t.deepEqual(httpHeaders(requestMsg), requestResult) @@ -159,6 +158,7 @@ test('full http response', function (t) { t.end() }) + test('http.ServerResponse', function (t) { t.test('real http.ServerResponse object', function (t) { var res = new http.ServerResponse({}) @@ -186,6 +186,7 @@ test('http.ServerResponse', function (t) { }) }) + test('set-cookie', function (t) { t.deepEqual(httpHeaders('Set-Cookie: foo'), { 'set-cookie': ['foo'] }) t.deepEqual(httpHeaders('Set-Cookie: foo\r\nSet-Cookie: bar'), { 'set-cookie': ['foo', 'bar'] }) From 57a386b3bbd093d201a11c7aa0a46957d4c85e73 Mon Sep 17 00:00:00 2001 From: restyler Date: Tue, 16 Nov 2021 10:13:11 +0400 Subject: [PATCH 4/6] Fixing startLine regex --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 28bce12..873857c 100644 --- a/index.js +++ b/index.js @@ -5,7 +5,7 @@ var nextLine = require('next-line') // RFC-2068 Start-Line definitions: // Request-Line: Method SP Request-URI SP HTTP-Version CRLF // Status-Line: HTTP-Version SP Status-Code SP Reason-Phrase CRLF -var startLine = /^[A-Z_]+(\/\d)?/ +var startLine = /^[A-Z_]+[^:]*$/ var requestLine = /^([A-Z_]+) (.+) HTTP\/([12](\.(\d))?)$/ var statusLine = /^HTTP\/([12](\.(\d))?) (\d{3})\s?(.*)?$/ From d600d42c069f59888fac137966d526263b3a58dc Mon Sep 17 00:00:00 2001 From: restyler Date: Tue, 16 Nov 2021 10:14:47 +0400 Subject: [PATCH 5/6] cleanup --- index.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/index.js b/index.js index 873857c..8446b05 100644 --- a/index.js +++ b/index.js @@ -17,11 +17,6 @@ function parse (str, onlyHeaders) { var line = firstLine(str) var match - //console.log('line', line + '#'); - console.log('line.match(startLine)', startLine.test(line)) - //console.log('line.match(statusLine)', line.match(statusLine)) - - if (onlyHeaders && startLine.test(line)) { return parseHeaders(str) } else if ((match = line.match(requestLine)) !== null) { @@ -33,7 +28,7 @@ function parse (str, onlyHeaders) { } } else if ((match = line.match(statusLine)) !== null) { return { - version: match[1],//{ major: parseInt(match[1], 10), minor: parseInt(match[2], 10) }, + version: match[1], statusCode: parseInt(match[4], 10), statusMessage: match[5] ?? '', headers: parseHeaders(str) From 34af267e5fac03da1b984778788027f3a272fd19 Mon Sep 17 00:00:00 2001 From: restyler Date: Tue, 16 Nov 2021 10:22:56 +0400 Subject: [PATCH 6/6] http v3 regex support (just in case) --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 8446b05..087e8c9 100644 --- a/index.js +++ b/index.js @@ -6,8 +6,8 @@ var nextLine = require('next-line') // Request-Line: Method SP Request-URI SP HTTP-Version CRLF // Status-Line: HTTP-Version SP Status-Code SP Reason-Phrase CRLF var startLine = /^[A-Z_]+[^:]*$/ -var requestLine = /^([A-Z_]+) (.+) HTTP\/([12](\.(\d))?)$/ -var statusLine = /^HTTP\/([12](\.(\d))?) (\d{3})\s?(.*)?$/ +var requestLine = /^([A-Z_]+) (.+) HTTP\/([123](\.(\d))?)$/ +var statusLine = /^HTTP\/([123](\.(\d))?) (\d{3})\s?(.*)?$/ module.exports = function (data, onlyHeaders) { return parse(normalize(data), onlyHeaders)