@@ -503,43 +503,61 @@ static PHP_METHOD(swoole_http_server_coro, onAccept)
503
503
504
504
while (true )
505
505
{
506
- hs->receivers .push_front (sock);
507
- auto receiver = hs->receivers .begin ();
508
- ssize_t retval = sock->recv (buffer->str + total_bytes + buffer->offset , buffer->size - total_bytes - buffer->offset );
509
- hs->receivers .erase (receiver);
510
-
511
- if (sw_unlikely (retval <= 0 ))
506
+ ssize_t retval;
507
+ if (ctx != nullptr || total_bytes == 0 )
512
508
{
513
- break ;
514
- }
515
- total_bytes += retval;
509
+ hs->receivers .push_front (sock);
510
+ auto receiver = hs->receivers .begin ();
511
+ retval = sock->recv (buffer->str + total_bytes, buffer->size - total_bytes);
512
+ hs->receivers .erase (receiver);
516
513
517
- if (!ctx )
518
- {
519
- ctx = hs-> create_context (sock, zconn) ;
520
- }
514
+ if (sw_unlikely (retval <= 0 ) )
515
+ {
516
+ break ;
517
+ }
521
518
522
- if (total_bytes > sock->protocol .package_max_length )
519
+ if (!ctx)
520
+ {
521
+ ctx = hs->create_context (sock, zconn);
522
+ }
523
+
524
+ if (total_bytes + retval > sock->protocol .package_max_length )
525
+ {
526
+ ctx->response .status = SW_HTTP_REQUEST_ENTITY_TOO_LARGE;
527
+ break ;
528
+ }
529
+ }
530
+ else
523
531
{
524
- ctx->response .status = 413 ;
525
- _error:
526
- zval_dtor (ctx->request .zobject );
527
- zval_dtor (ctx->response .zobject );
528
- break ;
532
+ /* redundant data from previous packet */
533
+ retval = total_bytes;
534
+ total_bytes = 0 ;
535
+
536
+ if (!ctx)
537
+ {
538
+ ctx = hs->create_context (sock, zconn);
539
+ }
529
540
}
530
541
531
- size_t parsed_n = swoole_http_requset_parse (ctx, buffer->str + total_bytes - retval, retval);
542
+ size_t parsed_n = swoole_http_requset_parse (ctx, buffer->str + total_bytes, retval);
543
+ size_t total_parsed_n = total_bytes + parsed_n;
544
+ total_bytes += retval;
532
545
533
546
swTraceLog (SW_TRACE_CO_HTTP_SERVER, " parsed_n=%ld, retval=%ld, total_bytes=%ld, completed=%d" , parsed_n, retval, total_bytes, ctx->completed );
534
547
535
548
if (!ctx->completed )
536
549
{
550
+ if (ctx->parser .state == s_dead)
551
+ {
552
+ ctx->response .status = SW_HTTP_BAD_REQUEST;
553
+ break ;
554
+ }
537
555
if (total_bytes == buffer->size )
538
556
{
539
557
if (swString_extend (buffer, buffer->size * 2 ) != SW_OK)
540
558
{
541
- ctx->response .status = 503 ;
542
- goto _error ;
559
+ ctx->response .status = SW_HTTP_SERVICE_UNAVAILABLE ;
560
+ break ;
543
561
}
544
562
}
545
563
continue ;
@@ -549,26 +567,31 @@ static PHP_METHOD(swoole_http_server_coro, onAccept)
549
567
if (ctx->parser .method == PHP_HTTP_NOT_IMPLEMENTED
550
568
&& memcmp (buffer->str , SW_HTTP2_PRI_STRING, sizeof (SW_HTTP2_PRI_STRING) - 1 ) == 0 )
551
569
{
552
- buffer->length = retval - (sizeof (SW_HTTP2_PRI_STRING) - 1 );
553
- buffer->offset = buffer->length == 0 ? 0 : parsed_n ;
570
+ buffer->length = total_bytes - (sizeof (SW_HTTP2_PRI_STRING) - 1 );
571
+ buffer->offset = buffer->length == 0 ? 0 : ( sizeof (SW_HTTP2_PRI_STRING) - 1 ) ;
554
572
hs->recv_http2_frame (ctx);
555
573
break ;
556
574
}
557
575
#endif
558
576
559
- if (retval > (ssize_t ) parsed_n)
577
+ ZVAL_STRINGL (&ctx->request .zdata , buffer->str , total_parsed_n);
578
+
579
+ /* handle more packages */
580
+ if ((size_t ) retval > parsed_n)
560
581
{
561
- buffer->offset = retval - parsed_n;
562
- memmove (buffer->str , buffer->str + total_bytes + parsed_n, buffer->offset );
582
+ total_bytes = retval - parsed_n;
583
+ memmove (buffer->str , buffer->str + total_parsed_n, total_bytes);
584
+ if (ctx->websocket )
585
+ {
586
+ /* for recv_packet */
587
+ buffer->length = total_bytes;
588
+ }
563
589
}
564
590
else
565
591
{
566
- buffer-> offset = 0 ;
592
+ total_bytes = 0 ;
567
593
}
568
594
569
- ZVAL_STRINGL (&ctx->request .zdata , buffer->str , total_bytes);
570
- total_bytes = 0 ;
571
-
572
595
zval *zserver = ctx->request .zserver ;
573
596
add_assoc_long (zserver, " server_port" , hs->socket ->get_bind_port ());
574
597
add_assoc_long (zserver, " remote_port" , (zend_long) hs->socket ->get_port ());
@@ -595,18 +618,19 @@ static PHP_METHOD(swoole_http_server_coro, onAccept)
595
618
596
619
zval_dtor (&args[0 ]);
597
620
zval_dtor (&args[1 ]);
621
+ ctx = nullptr ;
598
622
599
- if (hs->running && keep_alive)
600
- {
601
- swTraceLog (SW_TRACE_CO_HTTP_SERVER, " http_server_coro keepalive" );
602
- ctx = nullptr ;
603
- continue ;
604
- }
605
- else
623
+ if (!hs->running || !keep_alive)
606
624
{
607
625
break ;
608
626
}
609
627
}
628
+
629
+ if (ctx)
630
+ {
631
+ zval_dtor (ctx->request .zobject );
632
+ zval_dtor (ctx->response .zobject );
633
+ }
610
634
}
611
635
612
636
static PHP_METHOD (swoole_http_server_coro, shutdown)
0 commit comments