50
50
#define HEADER_TERMINATOR_LEN (sizeof("\r\n") - 1)
51
51
#define MIN_REQUEST_SIZE (sizeof("GET / HTTP/1.1\r\n\r\n") - 1)
52
52
53
- static const char * next_request_empty = "" ;
54
-
55
53
enum lwan_read_finalizer {
56
54
FINALIZER_DONE ,
57
55
FINALIZER_TRY_AGAIN ,
@@ -948,25 +946,20 @@ static enum lwan_http_status client_read(
948
946
int n_packets = 0 ;
949
947
950
948
if (helper -> next_request ) {
951
- if (UNLIKELY (helper -> next_request == next_request_empty )) {
949
+ const size_t next_request_len =
950
+ (size_t )(helper -> next_request - buffer -> value );
951
+ size_t new_len ;
952
+
953
+ if (__builtin_sub_overflow (buffer -> len , next_request_len , & new_len )) {
952
954
helper -> next_request = NULL ;
953
- } else {
954
- const size_t next_request_len =
955
- (size_t )(helper -> next_request - buffer -> value );
956
- size_t new_len ;
957
-
958
- if (__builtin_sub_overflow (buffer -> len , next_request_len ,
959
- & new_len )) {
960
- helper -> next_request = NULL ;
961
- } else if (new_len ) {
962
- /* FIXME: This memmove() could be eventually removed if a better
963
- * stucture (maybe a ringbuffer, reading with readv(), and each
964
- * pointer is coro_strdup() if they wrap around?) were used for
965
- * the request buffer. */
966
- buffer -> len = new_len ;
967
- memmove (buffer -> value , helper -> next_request , new_len );
968
- goto try_to_finalize ;
969
- }
955
+ } else if (new_len ) {
956
+ /* FIXME: This memmove() could be eventually removed if a better
957
+ * stucture (maybe a ringbuffer, reading with readv(), and each
958
+ * pointer is coro_strdup() if they wrap around?) were used for
959
+ * the request buffer. */
960
+ buffer -> len = new_len ;
961
+ memmove (buffer -> value , helper -> next_request , new_len );
962
+ goto try_to_finalize ;
970
963
}
971
964
}
972
965
@@ -1297,7 +1290,7 @@ get_remaining_body_data_length(struct lwan_request *request,
1297
1290
if (UNLIKELY ((size_t )parsed_size >= max_size ))
1298
1291
return HTTP_TOO_LARGE ;
1299
1292
if (UNLIKELY (!parsed_size )) {
1300
- helper -> next_request = ( char * ) next_request_empty ;
1293
+ helper -> next_request = NULL ;
1301
1294
* total = * have = 0 ;
1302
1295
} else {
1303
1296
* total = (size_t )parsed_size ;
@@ -1313,11 +1306,12 @@ get_remaining_body_data_length(struct lwan_request *request,
1313
1306
1314
1307
if (* have < * total )
1315
1308
return HTTP_PARTIAL_CONTENT ;
1309
+
1310
+ helper -> next_request += * total ;
1316
1311
}
1317
1312
1318
1313
helper -> body_data .value = helper -> next_request ;
1319
1314
helper -> body_data .len = * total ;
1320
- helper -> next_request += * total ;
1321
1315
return HTTP_OK ;
1322
1316
}
1323
1317
0 commit comments