3131#include "lsquic_logger.h"
3232
3333
34- /* headers_state is used by HEADERS, PUSH_PROMISE, and CONTINUATION frames */
34+ /* headers_state is used by HEADERS and CONTINUATION frames */
3535struct headers_state
3636{
3737 enum http_frame_type
3838 frame_type ;
3939 unsigned nread ; /* Not counting pesw, only payload and padding */
4040
4141 /* Values parsed out from pesw buffer: */
42- uint32_t oth_stream_id ; /* For HEADERS: ID of stream we depend on;
43- * for PUSH_PROMISE: promised stream ID.
44- */
42+ uint32_t oth_stream_id ; /* For HEADERS: ID of stream we depend on */
4543 unsigned short weight ; /* HEADERS only */
4644 signed char exclusive ; /* HEADERS only */
4745 unsigned char pad_length ;
4846
4947 unsigned char pseh ;
5048
5149 /* PESW: Pad length, Exclusive, Stream Dependency, Weight. This is at
52- * most six bytes for HEADERS frame (RFC 7540, page 33) and five bytes
53- * for PUSH_PROMISE frame (Ibid, p. 40).
50+ * most six bytes for HEADERS frame (RFC 7540, page 33).
5451 */
5552 unsigned char pesw_size ;
5653 unsigned char pesw_nread ;
@@ -88,7 +85,6 @@ struct reader_state
8885 enum {
8986 READER_SKIP ,
9087 READER_HEADERS ,
91- READER_PUSH_PROMISE ,
9288 READER_CONTIN ,
9389 READER_SETTINGS ,
9490 READER_PRIORITY ,
@@ -115,8 +111,8 @@ struct lsquic_frame_reader
115111 const struct lsquic_hset_if * fr_hsi_if ;
116112 void * fr_hsi_ctx ;
117113 struct http1x_ctor_ctx fr_h1x_ctor_ctx ;
118- /* The the header block is shared between HEADERS, PUSH_PROMISE, and
119- * CONTINUATION frames. It gets added to as block fragments come in.
114+ /* The header block is shared between HEADERS and CONTINUATION frames.
115+ * It gets added to as block fragments come in.
120116 */
121117 unsigned char * fr_header_block ;
122118#if LSQUIC_CONN_STATS
@@ -258,7 +254,6 @@ prepare_for_payload (struct lsquic_frame_reader *fr)
258254 if (fr -> fr_state .header .hfh_type != HTTP_FRAME_CONTINUATION &&
259255 (fr -> fr_flags & FRF_HAVE_PREV ) &&
260256 (fr -> fr_prev_frame_type == HTTP_FRAME_HEADERS ||
261- fr -> fr_prev_frame_type == HTTP_FRAME_PUSH_PROMISE ||
262257 fr -> fr_prev_frame_type == HTTP_FRAME_CONTINUATION ) &&
263258 0 == (fr -> fr_prev_hfh_flags & HFHF_END_HEADERS ))
264259 {
@@ -307,47 +302,17 @@ prepare_for_payload (struct lsquic_frame_reader *fr)
307302 fr -> fr_state .reader_type = READER_HEADERS ;
308303 break ;
309304 case HTTP_FRAME_PUSH_PROMISE :
310- if (fr -> fr_flags & FRF_SERVER )
311- {
312- LSQ_INFO ("clients should not push promised" );
313- fr -> fr_callbacks -> frc_on_error (fr -> fr_cb_ctx , stream_id ,
305+ LSQ_INFO ("received PUSH_PROMISE but push promises are not supported" );
306+ fr -> fr_callbacks -> frc_on_error (fr -> fr_cb_ctx , stream_id ,
314307 FR_ERR_UNEXPECTED_PUSH );
315- return -1 ;
316- }
317- if (fr -> fr_max_headers_sz &&
318- fr -> fr_state .payload_length > fr -> fr_max_headers_sz )
319- goto headers_too_large ;
320- fr -> fr_state .by_type .headers_state .frame_type = HTTP_FRAME_PUSH_PROMISE ;
321- fr -> fr_state .by_type .headers_state .nread = 0 ;
322- fr -> fr_state .by_type .headers_state .pesw_nread = 0 ;
323- fr -> fr_state .by_type .headers_state .pseh = 0 ;
324- if (fr -> fr_state .header .hfh_flags & HFHF_PADDED )
325- fr -> fr_state .by_type .headers_state .pesw_size = 5 ;
326- else
327- {
328- fr -> fr_state .by_type .headers_state .pad_length = 0 ;
329- fr -> fr_state .by_type .headers_state .pesw_size = 4 ;
330- }
331- LSQ_DEBUG ("pesw size: %u; payload length: %u; flags: 0x%X" ,
332- fr -> fr_state .by_type .headers_state .pesw_size ,
333- fr -> fr_state .payload_length , fr -> fr_state .header .hfh_flags );
334- if (fr -> fr_state .by_type .headers_state .pesw_size >
335- fr -> fr_state .payload_length )
336- {
337- LSQ_INFO ("Invalid headers frame: payload length too small" );
338- errno = EBADMSG ;
339- return -1 ;
340- }
341- fr -> fr_state .reader_type = READER_PUSH_PROMISE ;
342- break ;
308+ return -1 ;
343309 case HTTP_FRAME_CONTINUATION :
344310 if (0 == (fr -> fr_flags & FRF_HAVE_PREV ))
345311 {
346312 LSQ_INFO ("Framing error: unexpected CONTINUATION" );
347313 return -1 ;
348314 }
349315 if (!(fr -> fr_prev_frame_type == HTTP_FRAME_HEADERS ||
350- fr -> fr_prev_frame_type == HTTP_FRAME_PUSH_PROMISE ||
351316 fr -> fr_prev_frame_type == HTTP_FRAME_CONTINUATION ))
352317 {
353318 LSQ_INFO ("Framing error: unexpected CONTINUATION" );
@@ -591,7 +556,7 @@ decode_and_pass_payload (struct lsquic_frame_reader *fr)
591556 }
592557 }
593558 hset = fr -> fr_hsi_if -> hsi_create_header_set (fr -> fr_hsi_ctx , target_stream ,
594- READER_PUSH_PROMISE == fr -> fr_state . reader_type );
559+ 0 );
595560 if (!hset )
596561 {
597562 err = FR_ERR_OTHER_ERROR ;
@@ -658,31 +623,17 @@ decode_and_pass_payload (struct lsquic_frame_reader *fr)
658623 sizeof (stream_id32 ));
659624 uh -> uh_stream_id = ntohl (stream_id32 );
660625 uh -> uh_oth_stream_id = hs -> oth_stream_id ;
661- if (HTTP_FRAME_HEADERS == fr -> fr_state .by_type .headers_state .frame_type )
662- {
663- uh -> uh_weight = hs -> weight ;
664- uh -> uh_exclusive = hs -> exclusive ;
665- uh -> uh_flags = 0 ;
666- }
667- else
668- {
669- assert (HTTP_FRAME_PUSH_PROMISE ==
670- fr -> fr_state .by_type .headers_state .frame_type );
671- uh -> uh_weight = 0 ; /* Zero unused value */
672- uh -> uh_exclusive = 0 ; /* Zero unused value */
673- uh -> uh_flags = UH_PP ;
674- }
626+ uh -> uh_weight = hs -> weight ;
627+ uh -> uh_exclusive = hs -> exclusive ;
628+ uh -> uh_flags = 0 ;
675629 if (fr -> fr_state .header .hfh_flags & HFHF_END_STREAM )
676630 uh -> uh_flags |= UH_FIN ;
677631 if (fr -> fr_hsi_if == lsquic_http1x_if )
678632 uh -> uh_flags |= UH_H1H ;
679633 uh -> uh_hset = hset ;
680634
681635 EV_LOG_HTTP_HEADERS_IN (LSQUIC_LOG_CONN_ID , fr -> fr_flags & FRF_SERVER , uh );
682- if (HTTP_FRAME_HEADERS == fr -> fr_state .by_type .headers_state .frame_type )
683- fr -> fr_callbacks -> frc_on_headers (fr -> fr_cb_ctx , uh );
684- else
685- fr -> fr_callbacks -> frc_on_push_promise (fr -> fr_cb_ctx , uh );
636+ fr -> fr_callbacks -> frc_on_headers (fr -> fr_cb_ctx , uh );
686637#if LSQUIC_CONN_STATS
687638 fr -> fr_conn_stats -> in .headers_comp += fr -> fr_header_block_sz ;
688639#endif
@@ -802,48 +753,6 @@ read_headers (struct lsquic_frame_reader *fr)
802753}
803754
804755
805- static int
806- read_push_promise_pesw (struct lsquic_frame_reader * fr )
807- {
808- struct headers_state * hs = & fr -> fr_state .by_type .headers_state ;
809- ssize_t nr = fr -> fr_read (fr -> fr_stream , hs -> pesw + hs -> pesw_nread ,
810- hs -> pesw_size - hs -> pesw_nread );
811- if (nr <= 0 )
812- RETURN_ERROR (nr );
813- hs -> pesw_nread += nr ;
814- if (hs -> pesw_nread == hs -> pesw_size )
815- {
816- unsigned char * p = hs -> pesw ;
817- if (fr -> fr_state .header .hfh_flags & HFHF_PADDED )
818- hs -> pad_length = * p ++ ;
819- p [0 ] &= ~0x80 ; /* Clear reserved bit. Note: modifying pesw buffer. */
820- memcpy (& hs -> oth_stream_id , p , sizeof (hs -> oth_stream_id ));
821- hs -> oth_stream_id = ntohl (hs -> oth_stream_id );
822- p += 4 ;
823- assert (p - hs -> pesw == hs -> pesw_size );
824- if (hs -> pesw_size + hs -> pad_length > fr -> fr_state .payload_length )
825- {
826- LSQ_INFO ("Invalid PUSH_PROMISE frame: pesw length and padding length "
827- "are larger than the payload length" );
828- errno = EBADMSG ;
829- return -1 ;
830- }
831- }
832- return 0 ;
833- }
834-
835-
836- static int
837- read_push_promise (struct lsquic_frame_reader * fr )
838- {
839- struct headers_state * hs = & fr -> fr_state .by_type .headers_state ;
840- if (hs -> pesw_nread < hs -> pesw_size )
841- return read_push_promise_pesw (fr );
842- else
843- return read_headers_block_fragment_and_padding (fr );
844- }
845-
846-
847756static int
848757read_contin (struct lsquic_frame_reader * fr )
849758{
@@ -954,8 +863,6 @@ read_payload (struct lsquic_frame_reader *fr)
954863 {
955864 case READER_HEADERS :
956865 return read_headers (fr );
957- case READER_PUSH_PROMISE :
958- return read_push_promise (fr );
959866 case READER_CONTIN :
960867 return read_contin (fr );
961868 case READER_SETTINGS :
0 commit comments