Skip to content

Commit 25ffa0b

Browse files
committed
add header buffer for http_server
1 parent b19768c commit 25ffa0b

File tree

3 files changed

+42
-71
lines changed

3 files changed

+42
-71
lines changed

include/swoole.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,8 +394,6 @@ typedef struct _swConnection
394394
uint32_t tcp_nopush :1;
395395
uint32_t tcp_nodelay :1;
396396

397-
uint32_t http_buffered :1;
398-
399397
uint32_t ssl_want_read :1;
400398
uint32_t ssl_want_write :1;
401399

src/network/ReactorThread.c

Lines changed: 41 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,10 +1271,8 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
12711271
int n = 0;
12721272
char *buf;
12731273
int buf_len;
1274-
char recv_buf[SW_BUFFER_SIZE];
12751274

12761275
swHttpRequest *request;
1277-
swString tmp_package;
12781276
swProtocol *protocol = &serv->protocol;
12791277

12801278
//new http request
@@ -1289,18 +1287,23 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
12891287
request = (swHttpRequest *) conn->object;
12901288
}
12911289

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)
12991291
{
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+
}
13021299
}
13031300

1301+
swString *buffer = request->buffer;
1302+
1303+
recv_data:
1304+
buf = buffer->str + buffer->length;
1305+
buf_len = buffer->size - buffer->length;
1306+
13041307
n = swConnection_recv(conn, buf, buf_len, 0);
13051308
if (n < 0)
13061309
{
@@ -1325,25 +1328,16 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
13251328
else
13261329
{
13271330
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;
13401331
buffer->length += n;
13411332

13421333
if (request->method == 0 && swHttpRequest_get_protocol(request) < 0)
13431334
{
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+
}
13461339

1340+
swWarn("get protocol failed.");
13471341
#ifdef SW_HTTP_BAD_REQUEST
13481342
if (swConnection_send(conn, SW_STRL(SW_HTTP_BAD_REQUEST) - 1, 0) < 0)
13491343
{
@@ -1384,12 +1378,6 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
13841378
//wait more data
13851379
else
13861380
{
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-
}
13931381
goto recv_data;
13941382
}
13951383
}
@@ -1408,40 +1396,39 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
14081396
}
14091397
else
14101398
{
1411-
goto wait_more_data;
1399+
goto recv_data;
14121400
}
14131401
}
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+
}
14191407
}
14201408

1409+
uint32_t request_size = 0;
14211410
//http header is not the end
14221411
if (request->header_length == 0)
14231412
{
1424-
if (!conn->http_buffered)
1413+
if (buffer->size == buffer->length)
14251414
{
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;
14291417
}
1430-
else
1418+
if (swHttpRequest_get_header_length(request) < 0)
14311419
{
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;
14411426
}
14421427
}
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+
}
14451432

14461433
//discard the redundant data
14471434
if (buffer->length > request_size)
@@ -1488,19 +1475,7 @@ static int swReactorThread_onReceive_http_request(swReactor *reactor, swEvent *e
14881475
request->content_length, buffer->length, request->header_length);
14891476
}
14901477
#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;
15041479
}
15051480
}
15061481
else

src/protocol/Http.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,9 @@ int swHttpRequest_get_protocol(swHttpRequest *request)
113113

114114
void swHttpRequest_free(swConnection *conn, swHttpRequest *request)
115115
{
116-
if (conn->http_buffered && request->buffer)
116+
if (request->buffer)
117117
{
118-
swTrace("RequestShutdown. free buffer=%p, request=%p\n", request->buffer, request);
119118
swString_free(request->buffer);
120-
conn->http_buffered = 0;
121119
}
122120
if (request)
123121
{

0 commit comments

Comments
 (0)