@@ -1271,10 +1271,8 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
1271
1271
int n = 0 ;
1272
1272
char * buf ;
1273
1273
int buf_len ;
1274
- char recv_buf [SW_BUFFER_SIZE ];
1275
1274
1276
1275
swHttpRequest * request ;
1277
- swString tmp_package ;
1278
1276
swProtocol * protocol = & serv -> protocol ;
1279
1277
1280
1278
//new http request
@@ -1289,18 +1287,23 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
1289
1287
request = (swHttpRequest * ) conn -> object ;
1290
1288
}
1291
1289
1292
- recv_data :
1293
- if (request -> method == 0 )
1294
- {
1295
- buf = recv_buf ;
1296
- buf_len = SW_BUFFER_SIZE ;
1297
- }
1298
- else
1290
+ if (!request -> buffer )
1299
1291
{
1300
- buf = request -> buffer -> str + request -> buffer -> length ;
1301
- buf_len = request -> buffer -> size - request -> buffer -> length ;
1292
+ request -> buffer = swString_new (SW_HTTP_HEADER_MAX_SIZE );
1293
+ //alloc memory failed.
1294
+ if (!request -> buffer )
1295
+ {
1296
+ swReactorThread_onClose (reactor , event );
1297
+ return SW_ERR ;
1298
+ }
1302
1299
}
1303
1300
1301
+ swString * buffer = request -> buffer ;
1302
+
1303
+ recv_data :
1304
+ buf = buffer -> str + buffer -> length ;
1305
+ buf_len = buffer -> size - buffer -> length ;
1306
+
1304
1307
n = swConnection_recv (conn , buf , buf_len , 0 );
1305
1308
if (n < 0 )
1306
1309
{
@@ -1325,25 +1328,16 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
1325
1328
else
1326
1329
{
1327
1330
conn -> last_time = SwooleGS -> now ;
1328
-
1329
- swTrace ("receive %d bytes: %*s\n" , n , n , buf );
1330
-
1331
- if (request -> method == 0 )
1332
- {
1333
- bzero (& tmp_package , sizeof (tmp_package ));
1334
- tmp_package .str = recv_buf ;
1335
- tmp_package .size = SW_BUFFER_SIZE ;
1336
- request -> buffer = & tmp_package ;
1337
- }
1338
-
1339
- swString * buffer = request -> buffer ;
1340
1331
buffer -> length += n ;
1341
1332
1342
1333
if (request -> method == 0 && swHttpRequest_get_protocol (request ) < 0 )
1343
1334
{
1344
- swWarn ("get protocol failed." );
1345
- request -> buffer = NULL ;
1335
+ if (request -> buffer -> length < SW_HTTP_HEADER_MAX_SIZE )
1336
+ {
1337
+ return SW_OK ;
1338
+ }
1346
1339
1340
+ swWarn ("get protocol failed." );
1347
1341
#ifdef SW_HTTP_BAD_REQUEST
1348
1342
if (swConnection_send (conn , SW_STRL (SW_HTTP_BAD_REQUEST ) - 1 , 0 ) < 0 )
1349
1343
{
@@ -1384,12 +1378,6 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
1384
1378
//wait more data
1385
1379
else
1386
1380
{
1387
- wait_more_data : if (!conn -> http_buffered )
1388
- {
1389
- swTrace ("wait more data. content_length=%d, header_length=%d" , request -> content_length , request -> header_length );
1390
- request -> buffer = swString_dup2 (buffer );
1391
- conn -> http_buffered = 1 ;
1392
- }
1393
1381
goto recv_data ;
1394
1382
}
1395
1383
}
@@ -1408,40 +1396,39 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
1408
1396
}
1409
1397
else
1410
1398
{
1411
- goto wait_more_data ;
1399
+ goto recv_data ;
1412
1400
}
1413
1401
}
1414
- }
1415
- else if ( request -> content_length > protocol -> package_max_length )
1416
- {
1417
- swWarn ( "content-length more than the package_max_length[%d]." , protocol -> package_max_length ) ;
1418
- goto close_fd ;
1402
+ else if ( request -> content_length > protocol -> package_max_length )
1403
+ {
1404
+ swWarn ( "content-length more than the package_max_length[%d]." , protocol -> package_max_length );
1405
+ goto close_fd ;
1406
+ }
1419
1407
}
1420
1408
1409
+ uint32_t request_size = 0 ;
1421
1410
//http header is not the end
1422
1411
if (request -> header_length == 0 )
1423
1412
{
1424
- if (! conn -> http_buffered )
1413
+ if (buffer -> size == buffer -> length )
1425
1414
{
1426
- request -> buffer = swString_dup2 (buffer );
1427
- conn -> http_buffered = 1 ;
1428
- return SW_OK ;
1415
+ swWarn ("http header is too long." );
1416
+ goto close_fd ;
1429
1417
}
1430
- else
1418
+ if ( swHttpRequest_get_header_length ( request ) < 0 )
1431
1419
{
1432
- if (buffer -> size == buffer -> length )
1433
- {
1434
- swWarn ("http header is too long." );
1435
- goto close_fd ;
1436
- }
1437
- if (swHttpRequest_get_header_length (request ) < 0 )
1438
- {
1439
- return SW_OK ;
1440
- }
1420
+ goto recv_data ;
1421
+ }
1422
+ request_size = request -> content_length + request -> header_length ;
1423
+ if (request_size > buffer -> size && swString_extend (buffer , request_size ) < 0 )
1424
+ {
1425
+ goto close_fd ;
1441
1426
}
1442
1427
}
1443
-
1444
- uint32_t request_size = request -> content_length + request -> header_length ;
1428
+ else
1429
+ {
1430
+ request_size = request -> content_length + request -> header_length ;
1431
+ }
1445
1432
1446
1433
//discard the redundant data
1447
1434
if (buffer -> length > request_size )
@@ -1488,19 +1475,7 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
1488
1475
request -> content_length , buffer -> length , request -> header_length );
1489
1476
}
1490
1477
#endif
1491
- if (conn -> http_buffered )
1492
- {
1493
- if (request -> content_length > buffer -> size && swString_extend (buffer , request -> content_length ) < 0 )
1494
- {
1495
- swWarn ("malloc failed." );
1496
- return SW_OK ;
1497
- }
1498
- }
1499
- else
1500
- {
1501
- buffer -> size = request_size ;
1502
- }
1503
- goto wait_more_data ;
1478
+ goto recv_data ;
1504
1479
}
1505
1480
}
1506
1481
else
0 commit comments