@@ -473,6 +473,14 @@ function storeHTTPOptions(options) {
473
473
} else {
474
474
this . connectionsCheckingInterval = 30_000 ; // 30 seconds
475
475
}
476
+
477
+ const requireHostHeader = options . requireHostHeader ;
478
+ if ( requireHostHeader !== undefined ) {
479
+ validateBoolean ( requireHostHeader , 'options.requireHostHeader' ) ;
480
+ this . requireHostHeader = requireHostHeader ;
481
+ } else {
482
+ this . requireHostHeader = true ;
483
+ }
476
484
}
477
485
478
486
function setupConnectionsTracking ( server ) {
@@ -1022,7 +1030,18 @@ function parserOnIncoming(server, socket, state, req, keepAlive) {
1022
1030
1023
1031
let handled = false ;
1024
1032
1033
+
1025
1034
if ( req . httpVersionMajor === 1 && req . httpVersionMinor === 1 ) {
1035
+
1036
+ // From RFC 7230 5.4 https://datatracker.ietf.org/doc/html/rfc7230#section-5.4
1037
+ // A server MUST respond with a 400 (Bad Request) status code to any
1038
+ // HTTP/1.1 request message that lacks a Host header field
1039
+ if ( server . requireHostHeader && req . headers . host === undefined ) {
1040
+ res . writeHead ( 400 , [ 'Connection' , 'close' ] ) ;
1041
+ res . end ( ) ;
1042
+ return 0 ;
1043
+ }
1044
+
1026
1045
const isRequestsLimitSet = (
1027
1046
typeof server . maxRequestsPerSocket === 'number' &&
1028
1047
server . maxRequestsPerSocket > 0
@@ -1045,7 +1064,6 @@ function parserOnIncoming(server, socket, state, req, keepAlive) {
1045
1064
1046
1065
if ( RegExpPrototypeExec ( continueExpression , req . headers . expect ) !== null ) {
1047
1066
res . _expect_continue = true ;
1048
-
1049
1067
if ( server . listenerCount ( 'checkContinue' ) > 0 ) {
1050
1068
server . emit ( 'checkContinue' , req , res ) ;
1051
1069
} else {
0 commit comments