diff --git a/lib/nghttp2_session.c b/lib/nghttp2_session.c
index 4935a3324938e7362646ad094ddb2ffcbd790b4b..1247df4b533bd16461d35df660eb64291193e05a 100644
--- a/lib/nghttp2_session.c
+++ b/lib/nghttp2_session.c
@@ -1733,14 +1733,6 @@ static int session_prep_frame(nghttp2_session *session,
 
       aux_data = &item->aux_data.headers;
 
-      estimated_payloadlen = session_estimate_headers_payload(
-          session, frame->headers.nva, frame->headers.nvlen,
-          NGHTTP2_PRIORITY_SPECLEN);
-
-      if (estimated_payloadlen > NGHTTP2_MAX_HEADERSLEN) {
-        return NGHTTP2_ERR_FRAME_SIZE_ERROR;
-      }
-
       if (frame->headers.cat == NGHTTP2_HCAT_REQUEST) {
         /* initial HEADERS, which opens stream */
         nghttp2_stream *stream;
@@ -1754,6 +1746,14 @@ static int session_prep_frame(nghttp2_session *session,
           return NGHTTP2_ERR_NOMEM;
         }
 
+        estimated_payloadlen = session_estimate_headers_payload(
+            session, frame->headers.nva, frame->headers.nvlen,
+            NGHTTP2_PRIORITY_SPECLEN);
+
+        if (estimated_payloadlen > NGHTTP2_MAX_HEADERSLEN) {
+          return NGHTTP2_ERR_FRAME_SIZE_ERROR;
+        }
+
         rv = session_predicate_request_headers_send(session, item);
         if (rv != 0) {
           return rv;
@@ -1765,6 +1765,14 @@ static int session_prep_frame(nghttp2_session *session,
       } else {
         nghttp2_stream *stream;
 
+        estimated_payloadlen = session_estimate_headers_payload(
+            session, frame->headers.nva, frame->headers.nvlen,
+            NGHTTP2_PRIORITY_SPECLEN);
+
+        if (estimated_payloadlen > NGHTTP2_MAX_HEADERSLEN) {
+          return NGHTTP2_ERR_FRAME_SIZE_ERROR;
+        }
+
         stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
 
         if (session_predicate_push_response_headers_send(session, stream) ==