GeezerVison is showing github.com — http: add drop request event for http server · nodejs/node@082a263
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: doc/api/http.md +14Lines changed: 14 additions & 0 deletions - Display the source diff
- Display the rich diff
| Original file line number | Diff line number | Diff line change |
|---|
@@ -1396,6 +1396,20 @@ This event is guaranteed to be passed an instance of the {net.Socket} class, | 1396 | 1396 | a subclass of {stream.Duplex}, unless the user specifies a socket | 1397 | 1397 | type other than {net.Socket}. | 1398 | 1398 |
| | 1399 | +### Event: `'dropRequest'` | | 1400 | + | | 1401 | +<!-- YAML | | 1402 | +added: REPLACEME | | 1403 | +--> | | 1404 | + | | 1405 | +* `request` {http.IncomingMessage} Arguments for the HTTP request, as it is in | | 1406 | + the [`'request'`][] event | | 1407 | +* `socket` {stream.Duplex} Network socket between the server and client | | 1408 | + | | 1409 | +When the number of requests on a socket reaches the threshold of | | 1410 | +`server.maxRequestsPerSocket`, the server will drop new requests | | 1411 | +and emit `'dropRequest'` event instead, then send `503` to client. | | 1412 | + | 1399 | 1413 | ### Event: `'request'` | 1400 | 1414 |
| 1401 | 1415 | <!-- YAML | |
Collapse file Copy file name to clipboardExpand all lines: lib/_http_server.js +1-1Lines changed: 1 addition & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -951,7 +951,7 @@ function parserOnIncoming(server, socket, state, req, keepAlive) { | 951 | 951 | if (isRequestsLimitSet && | 952 | 952 | (server.maxRequestsPerSocket < state.requestsCount)) { | 953 | 953 | handled = true; | 954 | | - | | 954 | + server.emit('dropRequest', req, socket); | 955 | 955 | res.writeHead(503); | 956 | 956 | res.end(); | 957 | 957 | } else if (req.headers.expect !== undefined) { | |
Collapse file Copy file name to clipboard +34Lines changed: 34 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +'use strict'; | | 2 | + | | 3 | +const common = require('../common'); | | 4 | +const http = require('http'); | | 5 | +const net = require('net'); | | 6 | +const assert = require('assert'); | | 7 | + | | 8 | +function request(socket) { | | 9 | + socket.write('GET / HTTP/1.1\r\n'); | | 10 | + socket.write('Connection: keep-alive\r\n'); | | 11 | + socket.write('\r\n\r\n'); | | 12 | +} | | 13 | + | | 14 | +const server = http.createServer(common.mustCall((req, res) => { | | 15 | + res.end('ok'); | | 16 | +})); | | 17 | + | | 18 | +server.on('dropRequest', common.mustCall((request, socket) => { | | 19 | + assert.strictEqual(request instanceof http.IncomingMessage, true); | | 20 | + assert.strictEqual(socket instanceof net.Socket, true); | | 21 | + server.close(); | | 22 | +})); | | 23 | + | | 24 | +server.listen(0, common.mustCall(() => { | | 25 | + const socket = net.connect(server.address().port); | | 26 | + socket.on('connect', common.mustCall(() => { | | 27 | + request(socket); | | 28 | + request(socket); | | 29 | + })); | | 30 | + socket.on('data', common.mustCallAtLeast()); | | 31 | + socket.on('close', common.mustCall()); | | 32 | +})); | | 33 | + | | 34 | +server.maxRequestsPerSocket = 1; |
Collapse file Copy file name to clipboard +51Lines changed: 51 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +'use strict'; | | 2 | + | | 3 | +const common = require('../common'); | | 4 | + | | 5 | +if (!common.hasCrypto) | | 6 | + common.skip('missing crypto'); | | 7 | + | | 8 | +const https = require('https'); | | 9 | +const http = require('http'); | | 10 | +const net = require('net'); | | 11 | +const assert = require('assert'); | | 12 | +const tls = require('tls'); | | 13 | +const { readKey } = require('../common/fixtures'); | | 14 | + | | 15 | +function request(socket) { | | 16 | + socket.write('GET / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n\r\n'); | | 17 | +} | | 18 | + | | 19 | +// https options | | 20 | +const httpsOptions = { | | 21 | + key: readKey('agent1-key.pem'), | | 22 | + cert: readKey('agent1-cert.pem') | | 23 | +}; | | 24 | + | | 25 | +const server = https.createServer(httpsOptions, common.mustCall((req, res) => { | | 26 | + res.end('ok'); | | 27 | +})); | | 28 | + | | 29 | +server.on('dropRequest', common.mustCall((request, socket) => { | | 30 | + assert.strictEqual(request instanceof http.IncomingMessage, true); | | 31 | + assert.strictEqual(socket instanceof net.Socket, true); | | 32 | + server.close(); | | 33 | +})); | | 34 | + | | 35 | +server.listen(0, common.mustCall(() => { | | 36 | + const socket = tls.connect( | | 37 | + server.address().port, | | 38 | + { | | 39 | + rejectUnauthorized: false | | 40 | + }, | | 41 | + common.mustCall(() => { | | 42 | + request(socket); | | 43 | + request(socket); | | 44 | + socket.on('error', common.mustNotCall()); | | 45 | + socket.on('data', common.mustCallAtLeast()); | | 46 | + socket.on('close', common.mustCall()); | | 47 | + }) | | 48 | + ); | | 49 | +})); | | 50 | + | | 51 | +server.maxRequestsPerSocket = 1; |
|