parent
8fe3f9b330
commit
0a7a38a467
|
@ -38,15 +38,19 @@
|
||||||
|
|
||||||
static void conn_done(struct uh_connection *conn)
|
static void conn_done(struct uh_connection *conn)
|
||||||
{
|
{
|
||||||
|
struct ev_loop *loop = conn->srv->loop;
|
||||||
|
|
||||||
buffer_pull(&conn->rb, NULL, buffer_length(&conn->rb));
|
buffer_pull(&conn->rb, NULL, buffer_length(&conn->rb));
|
||||||
|
|
||||||
if (!http_should_keep_alive(&conn->parser))
|
if (!http_should_keep_alive(&conn->parser))
|
||||||
conn->flags |= CONN_F_SEND_AND_CLOSE;
|
conn->flags |= CONN_F_SEND_AND_CLOSE;
|
||||||
|
|
||||||
if (conn->flags & CONN_F_SEND_AND_CLOSE)
|
if (conn->flags & CONN_F_SEND_AND_CLOSE)
|
||||||
ev_io_stop(conn->srv->loop, &conn->ior);
|
ev_io_stop(loop, &conn->ior);
|
||||||
|
|
||||||
ev_io_start(conn->srv->loop, &conn->iow);
|
ev_io_start(loop, &conn->iow);
|
||||||
|
|
||||||
|
ev_timer_stop(loop, &conn->timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void conn_send(struct uh_connection *conn, const void *data, ssize_t len)
|
static void conn_send(struct uh_connection *conn, const void *data, ssize_t len)
|
||||||
|
@ -148,6 +152,9 @@ static void conn_send_head(struct uh_connection *conn, int code, int content_len
|
||||||
|
|
||||||
static void conn_error(struct uh_connection *conn, int code, const char *reason)
|
static void conn_error(struct uh_connection *conn, int code, const char *reason)
|
||||||
{
|
{
|
||||||
|
if (conn->flags & CONN_F_SEND_AND_CLOSE)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!reason)
|
if (!reason)
|
||||||
reason = http_status_str(code);
|
reason = http_status_str(code);
|
||||||
conn_send_head(conn, code, strlen(reason), "Content-Type: text/plain\r\nConnection: close\r\n");
|
conn_send_head(conn, code, strlen(reason), "Content-Type: text/plain\r\nConnection: close\r\n");
|
||||||
|
@ -360,7 +367,7 @@ static int on_headers_complete(struct http_parser *parser)
|
||||||
while (h) {
|
while (h) {
|
||||||
if (strlen(h->path) == path.len && !strncmp(path.p, h->path, path.len)) {
|
if (strlen(h->path) == path.len && !strncmp(path.p, h->path, path.len)) {
|
||||||
conn->handler = h->handler;
|
conn->handler = h->handler;
|
||||||
return 0;
|
goto done;
|
||||||
}
|
}
|
||||||
h = h->next;
|
h = h->next;
|
||||||
}
|
}
|
||||||
|
@ -368,11 +375,20 @@ static int on_headers_complete(struct http_parser *parser)
|
||||||
while (p) {
|
while (p) {
|
||||||
if (strlen(p->h->path) == path.len && !strncmp(path.p, p->h->path, path.len)) {
|
if (strlen(p->h->path) == path.len && !strncmp(path.p, p->h->path, path.len)) {
|
||||||
conn->handler = p->h->handler;
|
conn->handler = p->h->handler;
|
||||||
return 0;
|
goto done;
|
||||||
}
|
}
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (!conn->handler)
|
||||||
|
conn->handler = srv->default_handler;
|
||||||
|
|
||||||
|
if (!conn->handler) {
|
||||||
|
conn_error(conn, HTTP_STATUS_NOT_FOUND, NULL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,17 +396,15 @@ static int on_body_cb(struct http_parser *parser, const char *at, size_t length)
|
||||||
{
|
{
|
||||||
struct uh_connection *conn = (struct uh_connection *)parser->data;
|
struct uh_connection *conn = (struct uh_connection *)parser->data;
|
||||||
struct uh_request *req = &conn->req;
|
struct uh_request *req = &conn->req;
|
||||||
struct uh_server *srv = conn->srv;
|
|
||||||
int event = UH_EV_BODY;
|
|
||||||
|
|
||||||
if (req->body.offset == 0)
|
if (req->body.offset == 0)
|
||||||
req->body.offset = ROF(conn, at);
|
req->body.offset = ROF(conn, at);
|
||||||
req->body.length += length;
|
req->body.length += length;
|
||||||
|
|
||||||
if (conn->handler)
|
conn->handler(conn, UH_EV_BODY);
|
||||||
conn->handler(conn, event);
|
|
||||||
else if (srv->default_handler)
|
if (conn->flags & CONN_F_SEND_AND_CLOSE)
|
||||||
srv->default_handler(conn, event);
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -399,16 +413,10 @@ static int on_message_complete_cb(struct http_parser *parser)
|
||||||
{
|
{
|
||||||
struct uh_connection *conn = (struct uh_connection *)parser->data;
|
struct uh_connection *conn = (struct uh_connection *)parser->data;
|
||||||
struct uh_server *srv = conn->srv;
|
struct uh_server *srv = conn->srv;
|
||||||
int event = UH_EV_COMPLETE;
|
|
||||||
|
|
||||||
ev_timer_stop(srv->loop, &conn->timer);
|
ev_timer_stop(srv->loop, &conn->timer);
|
||||||
|
|
||||||
if (conn->handler)
|
conn->handler(conn, UH_EV_COMPLETE);
|
||||||
conn->handler(conn, event);
|
|
||||||
else if (srv->default_handler)
|
|
||||||
srv->default_handler(conn, event);
|
|
||||||
else
|
|
||||||
conn_error(conn, HTTP_STATUS_NOT_FOUND, NULL);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue