@@ -32,6 +32,7 @@ const {
3232 HTTP2_HEADER_STATUS ,
3333
3434 HTTP_STATUS_CONTINUE ,
35+ HTTP_STATUS_EARLY_HINTS ,
3536 HTTP_STATUS_EXPECTATION_FAILED ,
3637 HTTP_STATUS_METHOD_NOT_ALLOWED ,
3738 HTTP_STATUS_OK
@@ -55,6 +56,7 @@ const {
5556const {
5657 validateFunction,
5758 validateString,
59+ validateLinkHeaderValue,
5860} = require ( 'internal/validators' ) ;
5961const {
6062 kSocket,
@@ -844,6 +846,49 @@ class Http2ServerResponse extends Stream {
844846 } ) ;
845847 return true ;
846848 }
849+
850+ writeEarlyHints ( links ) {
851+ let linkHeaderValue = '' ;
852+
853+ if ( typeof links === 'string' ) {
854+ validateLinkHeaderValue ( links , 'links' ) ;
855+ linkHeaderValue += links ;
856+ } else if ( ArrayIsArray ( links ) ) {
857+ if ( ! links . length ) {
858+ return ;
859+ }
860+
861+ linkHeaderValue += '' ;
862+
863+ for ( let i = 0 ; i < links . length ; i ++ ) {
864+ const link = links [ i ] ;
865+ validateLinkHeaderValue ( link , 'links' ) ;
866+ linkHeaderValue += link ;
867+
868+ if ( i !== links . length - 1 ) {
869+ linkHeaderValue += ', ' ;
870+ }
871+ }
872+ } else {
873+ throw new ERR_INVALID_ARG_VALUE (
874+ 'links' ,
875+ links ,
876+ 'must be an array or string of format "</styles.css>; rel=preload; as=style"'
877+ ) ;
878+ }
879+
880+ const stream = this [ kStream ] ;
881+
882+ if ( stream . headersSent || this [ kState ] . closed )
883+ return false ;
884+
885+ stream . additionalHeaders ( {
886+ [ HTTP2_HEADER_STATUS ] : HTTP_STATUS_EARLY_HINTS ,
887+ 'Link' : linkHeaderValue
888+ } ) ;
889+
890+ return true ;
891+ }
847892}
848893
849894function onServerStream ( ServerRequest , ServerResponse ,
0 commit comments