connection: add api: close
close low level TCP connection Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>main^2
parent
2f951e5166
commit
6e84f2a738
|
@ -40,6 +40,9 @@ static void conn_done(struct uh_connection *conn)
|
||||||
struct uh_connection_internal *conni = (struct uh_connection_internal *)conn;
|
struct uh_connection_internal *conni = (struct uh_connection_internal *)conn;
|
||||||
struct ev_loop *loop = conni->srv->loop;
|
struct ev_loop *loop = conni->srv->loop;
|
||||||
|
|
||||||
|
if (conni->flags & CONN_F_CLOSED)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!http_should_keep_alive(&conni->parser))
|
if (!http_should_keep_alive(&conni->parser))
|
||||||
conni->flags |= CONN_F_SEND_AND_CLOSE;
|
conni->flags |= CONN_F_SEND_AND_CLOSE;
|
||||||
|
|
||||||
|
@ -58,6 +61,9 @@ static void conn_send(struct uh_connection *conn, const void *data, ssize_t len)
|
||||||
{
|
{
|
||||||
struct uh_connection_internal *conni = (struct uh_connection_internal *)conn;
|
struct uh_connection_internal *conni = (struct uh_connection_internal *)conn;
|
||||||
|
|
||||||
|
if (conni->flags & CONN_F_CLOSED)
|
||||||
|
return;
|
||||||
|
|
||||||
buffer_put_data(&conni->wb, data, len);
|
buffer_put_data(&conni->wb, data, len);
|
||||||
ev_io_start(conni->srv->loop, &conni->iow);
|
ev_io_start(conni->srv->loop, &conni->iow);
|
||||||
}
|
}
|
||||||
|
@ -69,6 +75,9 @@ static void conn_send_file(struct uh_connection *conn, const char *path, off_t o
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
if (conni->flags & CONN_F_CLOSED)
|
||||||
|
return;
|
||||||
|
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -109,6 +118,9 @@ static void conn_printf(struct uh_connection *conn, const char *format, ...)
|
||||||
struct buffer *wb = &conni->wb;
|
struct buffer *wb = &conni->wb;
|
||||||
va_list arg;
|
va_list arg;
|
||||||
|
|
||||||
|
if (conni->flags & CONN_F_CLOSED)
|
||||||
|
return;
|
||||||
|
|
||||||
va_start(arg, format);
|
va_start(arg, format);
|
||||||
buffer_put_vprintf(wb, format, arg);
|
buffer_put_vprintf(wb, format, arg);
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
|
@ -120,6 +132,9 @@ static void conn_vprintf(struct uh_connection *conn, const char *format, va_list
|
||||||
{
|
{
|
||||||
struct uh_connection_internal *conni = (struct uh_connection_internal *)conn;
|
struct uh_connection_internal *conni = (struct uh_connection_internal *)conn;
|
||||||
|
|
||||||
|
if (conni->flags & CONN_F_CLOSED)
|
||||||
|
return;
|
||||||
|
|
||||||
buffer_put_vprintf(&conni->wb, format, arg);
|
buffer_put_vprintf(&conni->wb, format, arg);
|
||||||
ev_io_start(conni->srv->loop, &conni->iow);
|
ev_io_start(conni->srv->loop, &conni->iow);
|
||||||
}
|
}
|
||||||
|
@ -334,6 +349,15 @@ static struct uh_str conn_extract_body(struct uh_connection *conn)
|
||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void conn_close(struct uh_connection *conn)
|
||||||
|
{
|
||||||
|
struct uh_connection_internal *conni = (struct uh_connection_internal *)conn;
|
||||||
|
|
||||||
|
http_parser_pause(&conni->parser, true);
|
||||||
|
|
||||||
|
conni->flags |= CONN_F_CLOSED;
|
||||||
|
}
|
||||||
|
|
||||||
static int on_message_begin_cb(struct http_parser *parser)
|
static int on_message_begin_cb(struct http_parser *parser)
|
||||||
{
|
{
|
||||||
struct uh_connection_internal *conn = (struct uh_connection_internal *)parser->data;
|
struct uh_connection_internal *conn = (struct uh_connection_internal *)parser->data;
|
||||||
|
@ -548,6 +572,10 @@ static void conn_http_parse(struct uh_connection_internal *conn)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
nparsed = http_parser_execute(parser, &settings, (const char *)data, length);
|
nparsed = http_parser_execute(parser, &settings, (const char *)data, length);
|
||||||
|
if (conn->flags & CONN_F_CLOSED) {
|
||||||
|
conn_free(conn);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (parser->http_errno) {
|
switch (parser->http_errno) {
|
||||||
case HPE_PAUSED:
|
case HPE_PAUSED:
|
||||||
|
@ -762,6 +790,8 @@ static void conn_init_cb(struct uh_connection *conn)
|
||||||
conn->get_content_length = conn_get_content_length;
|
conn->get_content_length = conn_get_content_length;
|
||||||
conn->get_body = conn_get_body;
|
conn->get_body = conn_get_body;
|
||||||
conn->extract_body = conn_extract_body;
|
conn->extract_body = conn_extract_body;
|
||||||
|
|
||||||
|
conn->close = conn_close;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct uh_connection_internal *uh_new_connection(struct uh_server_internal *srv, int sock, struct sockaddr *addr)
|
struct uh_connection_internal *uh_new_connection(struct uh_server_internal *srv, int sock, struct sockaddr *addr)
|
||||||
|
|
|
@ -34,7 +34,8 @@
|
||||||
#define UHTTPD_MAX_HEADER_NUM 50
|
#define UHTTPD_MAX_HEADER_NUM 50
|
||||||
|
|
||||||
#define CONN_F_SEND_AND_CLOSE (1 << 0) /* Push remaining data and close */
|
#define CONN_F_SEND_AND_CLOSE (1 << 0) /* Push remaining data and close */
|
||||||
#define CONN_F_SSL_HANDSHAKE_DONE (1 << 1) /* SSL hanshake has completed */
|
#define CONN_F_CLOSED (1 << 1) /* closed */
|
||||||
|
#define CONN_F_SSL_HANDSHAKE_DONE (1 << 2) /* SSL hanshake has completed */
|
||||||
|
|
||||||
struct uh_server_internal;
|
struct uh_server_internal;
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,7 @@ struct uh_connection {
|
||||||
struct uh_str (*get_body)(struct uh_connection *conn);
|
struct uh_str (*get_body)(struct uh_connection *conn);
|
||||||
/* The remain body data will be discurd after this function called */
|
/* The remain body data will be discurd after this function called */
|
||||||
struct uh_str (*extract_body)(struct uh_connection *conn);
|
struct uh_str (*extract_body)(struct uh_connection *conn);
|
||||||
|
void (*close)(struct uh_connection *conn); /* close low level TCP connection */
|
||||||
void *userdata;
|
void *userdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue