@@ -492,8 +492,7 @@ Http2Session::Http2Session(Environment* env,
492492 padding_strategy_ = opts.GetPaddingStrategy ();
493493
494494 bool hasGetPaddingCallback =
495- padding_strategy_ == PADDING_STRATEGY_MAX ||
496- padding_strategy_ == PADDING_STRATEGY_CALLBACK;
495+ padding_strategy_ != PADDING_STRATEGY_NONE;
497496
498497 nghttp2_session_callbacks* callbacks
499498 = callback_struct_saved[hasGetPaddingCallback ? 1 : 0 ].callbacks ;
@@ -681,6 +680,25 @@ inline void Http2Session::RemoveStream(int32_t id) {
681680 streams_.erase (id);
682681}
683682
683+ // Used as one of the Padding Strategy functions. Will attempt to ensure
684+ // that the total frame size, including header bytes, are 8-byte aligned.
685+ // If maxPayloadLen is smaller than the number of bytes necessary to align,
686+ // will return maxPayloadLen instead.
687+ inline ssize_t Http2Session::OnDWordAlignedPadding (size_t frameLen,
688+ size_t maxPayloadLen) {
689+ size_t r = (frameLen + 9 ) % 8 ;
690+ if (r == 0 ) return frameLen; // If already a multiple of 8, return.
691+
692+ size_t pad = frameLen + (8 - r);
693+
694+ // If maxPayloadLen happens to be less than the calculated pad length,
695+ // use the max instead, even tho this means the frame will not be
696+ // aligned.
697+ pad = std::min (maxPayloadLen, pad);
698+ DEBUG_HTTP2SESSION2 (this , " using frame size padding: %d" , pad);
699+ return pad;
700+ }
701+
684702// Used as one of the Padding Strategy functions. Uses the maximum amount
685703// of padding allowed for the current frame.
686704inline ssize_t Http2Session::OnMaxFrameSizePadding (size_t frameLen,
@@ -987,9 +1005,21 @@ inline ssize_t Http2Session::OnSelectPadding(nghttp2_session* handle,
9871005 Http2Session* session = static_cast <Http2Session*>(user_data);
9881006 ssize_t padding = frame->hd .length ;
9891007
990- return session->padding_strategy_ == PADDING_STRATEGY_MAX
991- ? session->OnMaxFrameSizePadding (padding, maxPayloadLen)
992- : session->OnCallbackPadding (padding, maxPayloadLen);
1008+ switch (session->padding_strategy_ ) {
1009+ case PADDING_STRATEGY_NONE:
1010+ // Fall-through
1011+ break ;
1012+ case PADDING_STRATEGY_MAX:
1013+ padding = session->OnMaxFrameSizePadding (padding, maxPayloadLen);
1014+ break ;
1015+ case PADDING_STRATEGY_ALIGNED:
1016+ padding = session->OnDWordAlignedPadding (padding, maxPayloadLen);
1017+ break ;
1018+ case PADDING_STRATEGY_CALLBACK:
1019+ padding = session->OnCallbackPadding (padding, maxPayloadLen);
1020+ break ;
1021+ }
1022+ return padding;
9931023}
9941024
9951025#define BAD_PEER_MESSAGE " Remote peer returned unexpected data while we " \
@@ -2872,6 +2902,7 @@ void Initialize(Local<Object> target,
28722902 NODE_DEFINE_CONSTANT (constants, NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE);
28732903
28742904 NODE_DEFINE_CONSTANT (constants, PADDING_STRATEGY_NONE);
2905+ NODE_DEFINE_CONSTANT (constants, PADDING_STRATEGY_ALIGNED);
28752906 NODE_DEFINE_CONSTANT (constants, PADDING_STRATEGY_MAX);
28762907 NODE_DEFINE_CONSTANT (constants, PADDING_STRATEGY_CALLBACK);
28772908
0 commit comments