aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2014-05-25 14:06:09 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2014-05-25 14:06:09 +0300
commit448f2f1c7fcc2f84d2b70d035d4a5a49baf00719 (patch)
tree652b35911c28125edc47feb9d11810474c5f5c72
parent626e12cdce18fdafe48a27bb51d98267dabd8984 (diff)
downloadlibuvh-448f2f1c7fcc2f84d2b70d035d4a5a49baf00719.tar.gz
libuvh-448f2f1c7fcc2f84d2b70d035d4a5a49baf00719.zip
add streaming example
-rw-r--r--Makefile3
-rw-r--r--examples/chunked.c95
2 files changed, 98 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index dcf5e79..a8bbfe4 100644
--- a/Makefile
+++ b/Makefile
@@ -13,6 +13,9 @@ libuvh.a: src/uvh.o src/http_parser.o src/sds.o
hello: examples/hello.o libuvh.a
$(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+chunked: examples/chunked.o libuvh.a
+ $(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+
.PHONY: clean
clean:
rm -f src/*.o
diff --git a/examples/chunked.c b/examples/chunked.c
new file mode 100644
index 0000000..ba8f71b
--- /dev/null
+++ b/examples/chunked.c
@@ -0,0 +1,95 @@
+#include <uvh.h>
+
+#define MAX_CHUNK 100
+
+struct chunker
+{
+ FILE *fp;
+};
+
+int stream_cb(char **chunk, void *data)
+{
+ printf("%s\n", __FUNCTION__);
+
+ struct chunker *chunker = (struct chunker *) data;
+
+ if (!chunker->fp)
+ {
+ free(chunker);
+ return 0;
+ }
+
+ *chunk = malloc(MAX_CHUNK);
+ size_t read = fread(*chunk, 1, MAX_CHUNK, chunker->fp);
+
+ if (read < MAX_CHUNK || feof(chunker->fp))
+ {
+ fclose(chunker->fp);
+ chunker->fp = NULL;
+ }
+
+ if (read == 0)
+ {
+ free(chunker);
+ }
+
+ return read;
+}
+
+int request_handler(struct uvh_request *req)
+{
+ printf("%s\n", __FUNCTION__);
+
+ FILE *fp = fopen(req->url.path, "r");
+ if (!fp)
+ {
+ uvh_request_write_status(req, HTTP_NOT_FOUND);
+ uvh_request_end(req);
+ return;
+ }
+
+ struct chunker *chunker = calloc(1, sizeof(*chunker));
+ chunker->fp = fp;
+
+ uvh_request_stream(req, stream_cb, chunker);
+
+ return 0;
+}
+
+void ctrlc_handler(uv_signal_t *handle, int signum)
+{
+ struct uvh_server *server = handle->data;
+ uvh_server_stop(server);
+ uv_close((uv_handle_t *) handle, NULL);
+ (void) signum;
+}
+
+int main()
+{
+ uv_signal_t sig;
+ struct uvh_server *server = uvh_server_init(uv_default_loop(),
+ NULL, &request_handler);
+
+ if (!server)
+ goto error;
+
+ if (uvh_server_listen(server, "127.0.0.1", 9898))
+ goto error;
+
+ uv_signal_init(uv_default_loop(), &sig);
+ sig.data = server;
+ uv_signal_start(&sig, &ctrlc_handler, SIGINT);
+
+ uv_run(uv_default_loop(), UV_RUN_DEFAULT);
+
+ printf("done\n");
+
+ return 0;
+
+error:
+
+ fprintf(stderr, "error: %s\n",
+ uv_strerror(uv_last_error(uv_default_loop())));
+
+ return 1;
+}