@@ -32,6 +32,7 @@ const {
32
32
HTTP2_HEADER_STATUS ,
33
33
34
34
HTTP_STATUS_CONTINUE ,
35
+ HTTP_STATUS_EARLY_HINTS ,
35
36
HTTP_STATUS_EXPECTATION_FAILED ,
36
37
HTTP_STATUS_METHOD_NOT_ALLOWED ,
37
38
HTTP_STATUS_OK
@@ -55,6 +56,7 @@ const {
55
56
const {
56
57
validateFunction,
57
58
validateString,
59
+ validateLinkHeaderValue,
58
60
} = require ( 'internal/validators' ) ;
59
61
const {
60
62
kSocket,
@@ -844,6 +846,49 @@ class Http2ServerResponse extends Stream {
844
846
} ) ;
845
847
return true ;
846
848
}
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
+ }
847
892
}
848
893
849
894
function onServerStream ( ServerRequest , ServerResponse ,
0 commit comments