aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2014-05-28 20:49:41 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2014-05-28 20:49:41 +0300
commit645b43c2333d9abaea0299575beed965913bc75f (patch)
tree7c7fe3ef0492e047495e8bffb19e28d248bed501
parent52968a7f0addba58f9050f84ef3dbb9297afde7d (diff)
downloadlibuvh-645b43c2333d9abaea0299575beed965913bc75f.tar.gz
libuvh-645b43c2333d9abaea0299575beed965913bc75f.zip
rename uvh_server_private -> uvh_server
-rw-r--r--examples/fileserver.c6
-rw-r--r--src/uvh.c85
-rw-r--r--src/uvh.h9
3 files changed, 43 insertions, 57 deletions
diff --git a/examples/fileserver.c b/examples/fileserver.c
index 0223371..92d344c 100644
--- a/examples/fileserver.c
+++ b/examples/fileserver.c
@@ -84,7 +84,7 @@ void handle_dir(struct uvh_request *req, sds req_path, sds real_path)
{
struct dirreq *dirreq = calloc(1, sizeof(*dirreq));
- dirreq->fileserver = (struct fileserver *) req->server->data;
+ dirreq->fileserver = (struct fileserver *) req->data;
dirreq->req = req;
dirreq->readdir_req.data = dirreq;
dirreq->real_path = real_path;
@@ -158,7 +158,7 @@ void handle_file(struct uvh_request *req, sds req_path, sds real_path)
chunker->real_path = real_path;
chunker->req_path = req_path;
chunker->req = req;
- chunker->fileserver = (struct fileserver *) req->server->data;
+ chunker->fileserver = (struct fileserver *) req->data;
uv_fs_open(uv_default_loop(), &chunker->open_req, chunker->real_path,
O_RDONLY, 0, &on_open);
@@ -172,7 +172,7 @@ int request_handler(struct uvh_request *req)
sds real_path;
sds req_path;
- fileserver = (struct fileserver *) req->server->data;
+ fileserver = (struct fileserver *) req->data;
req_path = sdsnew(req->url.path);
sds req_path2 = sdsnew(req_path+1);
diff --git a/src/uvh.c b/src/uvh.c
index aae6060..c26bdbe 100644
--- a/src/uvh.c
+++ b/src/uvh.c
@@ -59,15 +59,16 @@ static int on_message_complete(http_parser *parser);
static void uvh_request_write_chunk(struct uvh_request *req, sds chunk);
-struct uvh_server_private
+struct uvh_server
{
- struct uvh_server server;
struct sockaddr_storage addr;
socklen_t addr_len;
uv_loop_t *loop;
struct http_parser_settings http_parser_settings;
uv_tcp_t stream;
char stop;
+ uvh_request_handler_cb request_handler;
+ void *userdata;
};
struct uvh_request_private
@@ -90,7 +91,7 @@ struct uvh_request_private
UVH_EXTERN struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data,
uvh_request_handler_cb request_handler)
{
- struct uvh_server_private *server;
+ struct uvh_server *server;
int rc;
server = calloc(1, sizeof(*server));
@@ -99,8 +100,8 @@ UVH_EXTERN struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data,
goto error;
server->loop = loop;
- server->server.data = data;
- server->server.request_handler = request_handler;
+ server->userdata = data;
+ server->request_handler = request_handler;
rc = uv_tcp_init(loop, &server->stream);
@@ -118,7 +119,7 @@ UVH_EXTERN struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data,
server->http_parser_settings.on_body = on_body;
server->http_parser_settings.on_message_complete = on_message_complete;
- return &server->server;
+ return server;
error:
@@ -132,24 +133,20 @@ error:
UVH_EXTERN void uvh_server_free(struct uvh_server *server)
{
- struct uvh_server_private *p = container_of(server,
- struct uvh_server_private, server);
- free(p);
+ free(server);
}
UVH_EXTERN int uvh_server_listen(struct uvh_server *server, const char *address,
short port)
{
- struct uvh_server_private *serverp = container_of(server,
- struct uvh_server_private, server);
struct sockaddr_in addr = uv_ip4_addr(address, port);
- memcpy(&serverp->addr, &addr, sizeof(addr));
- serverp->addr_len = sizeof(addr);
+ memcpy(&server->addr, &addr, sizeof(addr));
+ server->addr_len = sizeof(addr);
- uv_tcp_bind(&serverp->stream, addr);
+ uv_tcp_bind(&server->stream, addr);
- int r = uv_listen((uv_stream_t *) &serverp->stream, 128,
+ int r = uv_listen((uv_stream_t *) &server->stream, 128,
on_connection);
if (r)
@@ -165,13 +162,8 @@ static void on_server_close(uv_handle_t *handle)
UVH_EXTERN void uvh_server_stop(struct uvh_server *server)
{
- struct uvh_server_private *p;
-
- p = container_of(server, struct uvh_server_private, server);
-
- p->stop = 1;
-
- uv_close((uv_handle_t *) &p->stream, &on_server_close);
+ server->stop = 1;
+ uv_close((uv_handle_t *) &server->stream, &on_server_close);
}
void request_init(struct uvh_request_private *req, struct uvh_server *server)
@@ -222,6 +214,7 @@ void request_init(struct uvh_request_private *req, struct uvh_server *server)
memset(&req->req, 0, sizeof(req->req));
req->req.server = server;
+ req->req.data = server->userdata;
req->header_state = 0;
@@ -239,8 +232,8 @@ void request_init(struct uvh_request_private *req, struct uvh_server *server)
static void on_connection(uv_stream_t *stream, int status)
{
- struct uvh_server_private *priv = container_of((uv_tcp_t *) stream,
- struct uvh_server_private, stream);
+ struct uvh_server *server = container_of((uv_tcp_t *) stream,
+ struct uvh_server, stream);
LOG_DEBUG("%s", __FUNCTION__);
@@ -250,20 +243,20 @@ static void on_connection(uv_stream_t *stream, int status)
return;
}
- if (priv->stop)
+ if (server->stop)
{
LOG_WARNING("on_connection: stop bit set");
uv_tcp_t *client = calloc(1, sizeof(*client));
- uv_tcp_init(priv->loop, client);
+ uv_tcp_init(server->loop, client);
uv_accept(stream, (uv_stream_t *) client);
uv_close((uv_handle_t *) client, NULL);
return;
}
struct uvh_request_private *req = calloc(1, sizeof(*req));
- request_init(req, &priv->server);
+ request_init(req, server);
- if (uv_tcp_init(priv->loop, &req->stream))
+ if (uv_tcp_init(server->loop, &req->stream))
{
LOG_WARNING("failed to initialize uv_tcp_t");
goto error;
@@ -302,41 +295,35 @@ static uv_buf_t alloc_cb(uv_handle_t *handle, size_t size)
static void read_cb(uv_stream_t *stream, ssize_t nread, uv_buf_t buf)
{
struct uvh_request_private *req;
- struct uvh_server_private *serverp;
+ struct uvh_server *server;
+ int nparsed;
req = (struct uvh_request_private *) stream->data;
- serverp = container_of(req->req.server, struct uvh_server_private,
- server);
+ server = req->req.server;
LOG_DEBUG("read_cb: nread: %d, buf.len: %d", (int)nread, (int)buf.len);
+ if (nread == 0)
+ goto out;
+
if (nread < 0)
{
uv_err_t err = uv_last_error(stream->loop);
- if (buf.base)
- free(buf.base);
-
if (err.code == UV_EOF)
{
LOG_DEBUG("EOF");
- http_parser_execute(&req->parser,
- &serverp->http_parser_settings, NULL, 0);
+ nread = 0;
+ }
+ else
+ {
+ uv_close((uv_handle_t *) stream, &close_cb);
+ goto out;
}
-
- uv_close((uv_handle_t *) stream, &close_cb);
-
- return;
- }
-
- if (nread == 0)
- {
- free(buf.base);
- return;
}
- int nparsed = http_parser_execute(&req->parser,
- &serverp->http_parser_settings,
+ nparsed = http_parser_execute(&req->parser,
+ &server->http_parser_settings,
buf.base, nread);
LOG_DEBUG("nparsed:%d", nparsed);
@@ -347,6 +334,8 @@ static void read_cb(uv_stream_t *stream, ssize_t nread, uv_buf_t buf)
uv_close((uv_handle_t *) stream, &close_cb);
}
+out:
+
free(buf.base);
}
diff --git a/src/uvh.h b/src/uvh.h
index ee94fdb..b74f226 100644
--- a/src/uvh.h
+++ b/src/uvh.h
@@ -84,15 +84,10 @@ enum
};
struct uvh_request;
+struct uvh_server;
typedef int (*uvh_request_handler_cb)(struct uvh_request *);
-struct uvh_server
-{
- void *data;
- uvh_request_handler_cb request_handler;
-};
-
struct uvh_request
{
struct uvh_server *server;
@@ -122,6 +117,8 @@ struct uvh_request
const char *content;
int content_length;
+
+ void *data;
};
UVH_EXTERN struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data,