Skip to content

Commit f82439b

Browse files
XadillaXMylesBorins
authored andcommitted
http: add rawPacket in err of clientError event
The `rawPacket` is the current buffer that just parsed. Adding this buffer to the error object of `clientError` event is to make it possible that developers can log the broken packet. PR-URL: #17672 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent b89cda4 commit f82439b

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

doc/api/http.md

+11
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,11 @@ changes:
734734
description: The default action of calling `.destroy()` on the `socket`
735735
will no longer take place if there are listeners attached
736736
for `clientError`.
737+
- version: REPLACEME
738+
pr-url: https://github.com/nodejs/node/pull/17672
739+
description: The rawPacket is the current buffer that just parsed. Adding
740+
this buffer to the error object of clientError event is to make
741+
it possible that developers can log the broken packet.
737742
-->
738743

739744
* `exception` {Error}
@@ -765,6 +770,12 @@ object, so any HTTP response sent, including response headers and payload,
765770
*must* be written directly to the `socket` object. Care must be taken to
766771
ensure the response is a properly formatted HTTP response message.
767772

773+
`err` is an instance of `Error` with two extra columns:
774+
775+
+ `bytesParsed`: the bytes count of request packet that Node.js may have parsed
776+
correctly;
777+
+ `rawPacket`: the raw packet of current request.
778+
768779
### Event: 'close'
769780
<!-- YAML
770781
added: v0.1.4

lib/_http_server.js

+1
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ function onParserExecuteCommon(server, socket, parser, state, ret, d) {
476476
resetSocketTimeout(server, socket, state);
477477

478478
if (ret instanceof Error) {
479+
ret.rawPacket = d || parser.getCurrentBuffer();
479480
debug('parse error', ret);
480481
socketOnError.call(socket, ret);
481482
} else if (parser.incoming && parser.incoming.upgrade) {

test/parallel/test-http-server-client-error.js

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ const server = http.createServer(common.mustCall(function(req, res) {
1010
}));
1111

1212
server.on('clientError', common.mustCall(function(err, socket) {
13+
assert.strictEqual(err instanceof Error, true);
14+
assert.strictEqual(err.code, 'HPE_INVALID_METHOD');
15+
assert.strictEqual(err.bytesParsed, 1);
16+
assert.strictEqual(err.message, 'Parse Error');
17+
assert.strictEqual(err.rawPacket.toString(), 'Oopsie-doopsie\r\n');
18+
1319
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
1420

1521
server.close();

0 commit comments

Comments
 (0)