3737
3838#define CALLBACK2 (FOR ) \
3939do { \
40- if (settings. on_##FOR) { \
41- if (0 != settings. on_##FOR(parser)) return (p - data); \
40+ if (settings-> on_##FOR) { \
41+ if (0 != settings-> on_##FOR(parser)) return (p - data); \
4242 } \
4343} while (0)
4444
5555 if (parser->FOR##_mark) { \
5656 parser->FOR##_size += p - parser->FOR##_mark; \
5757 if (parser->FOR##_size > MAX_FIELD_SIZE) return (p - data); \
58- if (settings. on_##FOR) { \
59- if (0 != settings. on_##FOR(parser, \
58+ if (settings-> on_##FOR) { \
59+ if (0 != settings-> on_##FOR(parser, \
6060 parser->FOR##_mark, \
6161 p - parser->FOR##_mark)) \
6262 { \
@@ -232,6 +232,7 @@ enum flags
232232 , F_CONNECTION_CLOSE = 1 << 2
233233 , F_TRAILING = 1 << 3
234234 , F_UPGRADE = 1 << 4
235+ , F_SKIPBODY = 1 << 5
235236 };
236237
237238
@@ -282,7 +283,7 @@ enum flags
282283
283284
284285size_t http_parser_execute (http_parser * parser ,
285- http_parser_settings settings ,
286+ const http_parser_settings * settings ,
286287 const char * data ,
287288 size_t len )
288289{
@@ -1327,15 +1328,36 @@ size_t http_parser_execute (http_parser *parser,
13271328
13281329 if (parser -> flags & F_UPGRADE ) parser -> upgrade = 1 ;
13291330
1330- CALLBACK2 (headers_complete );
1331+ /* Here we call the headers_complete callback. This is somewhat
1332+ * different than other callbacks because if the user returns 1, we
1333+ * will interpret that as saying that this message has no body. This
1334+ * is needed for the annoying case of recieving a response to a HEAD
1335+ * request.
1336+ */
1337+ if (settings -> on_headers_complete ) {
1338+ switch (settings -> on_headers_complete (parser )) {
1339+ case 0 :
1340+ break ;
1341+
1342+ case 1 :
1343+ parser -> flags |= F_SKIPBODY ;
1344+ break ;
1345+
1346+ default :
1347+ return p - data ; /* Error */
1348+ }
1349+ }
13311350
13321351 // Exit, the rest of the connect is in a different protocol.
13331352 if (parser -> flags & F_UPGRADE ) {
13341353 CALLBACK2 (message_complete );
13351354 return (p - data );
13361355 }
13371356
1338- if (parser -> flags & F_CHUNKED ) {
1357+ if (parser -> flags & F_SKIPBODY ) {
1358+ CALLBACK2 (message_complete );
1359+ state = NEW_MESSAGE ();
1360+ } else if (parser -> flags & F_CHUNKED ) {
13391361 /* chunked encoding - ignore Content-Length header */
13401362 state = s_chunk_size_start ;
13411363 } else {
@@ -1364,7 +1386,7 @@ size_t http_parser_execute (http_parser *parser,
13641386 case s_body_identity :
13651387 to_read = MIN (pe - p , (ssize_t )(parser -> content_length - parser -> body_read ));
13661388 if (to_read > 0 ) {
1367- if (settings . on_body ) settings . on_body (parser , p , to_read );
1389+ if (settings -> on_body ) settings -> on_body (parser , p , to_read );
13681390 p += to_read - 1 ;
13691391 parser -> body_read += to_read ;
13701392 if (parser -> body_read == parser -> content_length ) {
@@ -1378,7 +1400,7 @@ size_t http_parser_execute (http_parser *parser,
13781400 case s_body_identity_eof :
13791401 to_read = pe - p ;
13801402 if (to_read > 0 ) {
1381- if (settings . on_body ) settings . on_body (parser , p , to_read );
1403+ if (settings -> on_body ) settings -> on_body (parser , p , to_read );
13821404 p += to_read - 1 ;
13831405 parser -> body_read += to_read ;
13841406 }
@@ -1451,7 +1473,7 @@ size_t http_parser_execute (http_parser *parser,
14511473 to_read = MIN (pe - p , (ssize_t )(parser -> content_length ));
14521474
14531475 if (to_read > 0 ) {
1454- if (settings . on_body ) settings . on_body (parser , p , to_read );
1476+ if (settings -> on_body ) settings -> on_body (parser , p , to_read );
14551477 p += to_read - 1 ;
14561478 }
14571479
0 commit comments