diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2014-05-25 13:03:43 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2014-05-25 13:03:43 +0300 |
| commit | 8af69e5e4065612d1f011ad497b837d779e5f67f (patch) | |
| tree | 270f2d1beae798de282c63a0b378d02e46f1b535 /src | |
| parent | b31fc450e0e67f8d48cf5d28dfa7d98eff79e5ac (diff) | |
| download | libuvh-8af69e5e4065612d1f011ad497b837d779e5f67f.tar.gz libuvh-8af69e5e4065612d1f011ad497b837d779e5f67f.zip | |
buffer writes and send when uvh_request_end() is called
Diffstat (limited to 'src')
| -rw-r--r-- | src/uvh.c | 61 | ||||
| -rw-r--r-- | src/uvh.h | 2 |
2 files changed, 58 insertions, 5 deletions
@@ -74,6 +74,10 @@ struct uvh_request_private sds header_name; sds header_value; int header_state; + char keepalive; + int send_status; + sds send_headers; + sds send_body; }; struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data, @@ -157,6 +161,10 @@ static void on_connection(uv_stream_t *stream, int status) req->req.server = &priv->server; req->header_state = 0; + req->send_body = sdsempty(); + req->send_headers = sdsempty(); + req->send_status = HTTP_OK; + http_parser_init(&req->parser, HTTP_REQUEST); req->parser.data = req; @@ -395,6 +403,8 @@ static int on_message_complete(http_parser *parser) LOG_DEBUG("on_message_complete"); + priv->keepalive = http_should_keep_alive(parser); + if (priv->req.content) priv->req.content_length = sdslen((sds) priv->req.content); else @@ -431,6 +441,7 @@ static void uvh_request_write_sds(struct uvh_request *req, sds data) { struct uvh_request_private *p = container_of(req, struct uvh_request_private, req); + struct uvh_write_request *wreq = calloc(1, sizeof(*wreq)); wreq->buf.base = (char *) data; @@ -445,11 +456,17 @@ static void uvh_request_write_sds(struct uvh_request *req, sds data) void uvh_request_write(struct uvh_request *req, const char *data, size_t len) { - uvh_request_write_sds(req, sdsnewlen(data, len)); + struct uvh_request_private *p = container_of(req, + struct uvh_request_private, req); + + p->send_body = sdscatlen(p->send_body, data, len); } void uvh_request_writef(struct uvh_request *req, const char *fmt, ...) { + struct uvh_request_private *p = container_of(req, + struct uvh_request_private, req); + va_list ap; sds result; @@ -457,19 +474,25 @@ void uvh_request_writef(struct uvh_request *req, const char *fmt, ...) result = sdscatvprintf(sdsempty(), fmt, ap); va_end(ap); - uvh_request_write_sds(req, result); + p->send_body = sdscatsds(p->send_body, result); + sdsfree(result); } void uvh_request_write_status(struct uvh_request *req, int status) { - uvh_request_writef(req, "%s %d %s\r\n", req->version, status, - http_status_code_str(status)); + struct uvh_request_private *p = container_of(req, + struct uvh_request_private, req); + + p->send_status = status; } void uvh_request_write_header(struct uvh_request *req, const char *name, const char *value) { - uvh_request_writef(req, "%s: %s\r\n", name, value); + struct uvh_request_private *p = container_of(req, + struct uvh_request_private, req); + + p->send_headers = sdscatprintf(p->send_headers, "%s: %s\r\n", name, value); } const char *http_status_code_str(int code) @@ -500,3 +523,31 @@ const char *uvh_request_get_header(struct uvh_request *req, return NULL; } + +void uvh_request_end(struct uvh_request *req) +{ + LOG_DEBUG("%s", __FUNCTION__); + + struct uvh_request_private *p = container_of(req, + struct uvh_request_private, req); + + uvh_request_write_sds(req, sdscatprintf(sdsempty(), + "%s %d %s\r\n", p->req.version, p->send_status, + http_status_code_str(p->send_status))); + + sds content_len = sdscatprintf(sdsempty(), "%d", (int)sdslen(p->send_body)); + uvh_request_write_header(req, "Content-Length", content_len); + sdsfree(content_len); + + LOG_DEBUG("keepalive: %d", p->keepalive); + + if (!p->keepalive) + { + uvh_request_write_header(req, "Connection", "close"); + // uv_close at some point? + } + + uvh_request_write_sds(req, p->send_headers); + uvh_request_write_sds(req, sdsnew("\r\n")); + uvh_request_write_sds(req, p->send_body); +} @@ -126,4 +126,6 @@ const char *http_status_code_str(int code); const char *uvh_request_get_header(struct uvh_request *req, const char *name); +void uvh_request_end(struct uvh_request *req); + #endif /* UVH_H */ |
