@@ -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 ;
@@ -682,6 +681,25 @@ inline void Http2Session::RemoveStream(int32_t id) {
682681 streams_.erase (id);
683682}
684683
684+ // Used as one of the Padding Strategy functions. Will attempt to ensure
685+ // that the total frame size, including header bytes, are 8-byte aligned.
686+ // If maxPayloadLen is smaller than the number of bytes necessary to align,
687+ // will return maxPayloadLen instead.
688+ inline ssize_t Http2Session::OnDWordAlignedPadding (size_t frameLen,
689+ size_t maxPayloadLen) {
690+ size_t r = (frameLen + 9 ) % 8 ;
691+ if (r == 0 ) return frameLen; // If already a multiple of 8, return.
692+
693+ size_t pad = frameLen + (8 - r);
694+
695+ // If maxPayloadLen happens to be less than the calculated pad length,
696+ // use the max instead, even tho this means the frame will not be
697+ // aligned.
698+ pad = std::min (maxPayloadLen, pad);
699+ DEBUG_HTTP2SESSION2 (this , " using frame size padding: %d" , pad);
700+ return pad;
701+ }
702+
685703// Used as one of the Padding Strategy functions. Uses the maximum amount
686704// of padding allowed for the current frame.
687705inline ssize_t Http2Session::OnMaxFrameSizePadding (size_t frameLen,
@@ -988,9 +1006,21 @@ inline ssize_t Http2Session::OnSelectPadding(nghttp2_session* handle,
9881006 Http2Session* session = static_cast <Http2Session*>(user_data);
9891007 ssize_t padding = frame->hd .length ;
9901008
991- return session->padding_strategy_ == PADDING_STRATEGY_MAX
992- ? session->OnMaxFrameSizePadding (padding, maxPayloadLen)
993- : session->OnCallbackPadding (padding, maxPayloadLen);
1009+ switch (session->padding_strategy_ ) {
1010+ case PADDING_STRATEGY_NONE:
1011+ // Fall-through
1012+ break ;
1013+ case PADDING_STRATEGY_MAX:
1014+ padding = session->OnMaxFrameSizePadding (padding, maxPayloadLen);
1015+ break ;
1016+ case PADDING_STRATEGY_ALIGNED:
1017+ padding = session->OnDWordAlignedPadding (padding, maxPayloadLen);
1018+ break ;
1019+ case PADDING_STRATEGY_CALLBACK:
1020+ padding = session->OnCallbackPadding (padding, maxPayloadLen);
1021+ break ;
1022+ }
1023+ return padding;
9941024}
9951025
9961026#define BAD_PEER_MESSAGE " Remote peer returned unexpected data while we " \
@@ -2873,6 +2903,7 @@ void Initialize(Local<Object> target,
28732903 NODE_DEFINE_CONSTANT (constants, NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE);
28742904
28752905 NODE_DEFINE_CONSTANT (constants, PADDING_STRATEGY_NONE);
2906+ NODE_DEFINE_CONSTANT (constants, PADDING_STRATEGY_ALIGNED);
28762907 NODE_DEFINE_CONSTANT (constants, PADDING_STRATEGY_MAX);
28772908 NODE_DEFINE_CONSTANT (constants, PADDING_STRATEGY_CALLBACK);
28782909
0 commit comments