diff options
author | Matthijs Kooijman <matthijs@stdin.nl> | 2010-02-21 21:46:06 +0100 |
---|---|---|
committer | Colin Guthrie <colin@mageia.org> | 2011-04-15 20:32:16 +0200 |
commit | 4f677758b5771933b44743d1a97e1e99e891e26e (patch) | |
tree | a1adc66d8c3a476069b575ffae1cf210c64cc8e0 | |
parent | 93e7a19ee67f172980f96447d50beca996fcfc8c (diff) |
http: support HTTP HEAD
http://pulseaudio.org/ticket/781
-rw-r--r-- | src/pulsecore/protocol-http.c | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/src/pulsecore/protocol-http.c b/src/pulsecore/protocol-http.c index c09e5348..83067f85 100644 --- a/src/pulsecore/protocol-http.c +++ b/src/pulsecore/protocol-http.c @@ -80,6 +80,11 @@ enum state { STATE_DATA }; +enum method { + METHOD_GET, + METHOD_HEAD +}; + struct connection { pa_http_protocol *protocol; pa_iochannel *io; @@ -89,6 +94,7 @@ struct connection { pa_client *client; enum state state; char *url; + enum method method; pa_module *module; }; @@ -327,6 +333,11 @@ static void html_response( http_response(c, code, msg, MIME_HTML); + if (c->method == METHOD_HEAD) { + pa_ioline_defer_close(c->line); + return; + } + if (!text) text = msg; @@ -363,6 +374,11 @@ static void handle_root(struct connection *c) { http_response(c, 200, "OK", MIME_HTML); + if (c->method == METHOD_HEAD) { + pa_ioline_defer_close(c->line); + return; + } + pa_ioline_puts(c->line, HTML_HEADER(PACKAGE_NAME" "PACKAGE_VERSION) "<h1>"PACKAGE_NAME" "PACKAGE_VERSION"</h1>\n" @@ -402,6 +418,11 @@ static void handle_css(struct connection *c) { http_response(c, 200, "OK", MIME_CSS); + if (c->method == METHOD_HEAD) { + pa_ioline_defer_close(c->line); + return; + } + pa_ioline_puts(c->line, "body { color: black; background-color: white; }\n" "a:link, a:visited { color: #900000; }\n" @@ -420,6 +441,12 @@ static void handle_status(struct connection *c) { pa_assert(c); http_response(c, 200, "OK", MIME_TEXT); + + if (c->method == METHOD_HEAD) { + pa_ioline_defer_close(c->line); + return; + } + r = pa_full_status_string(c->protocol->core); pa_ioline_puts(c->line, r); pa_xfree(r); @@ -439,6 +466,11 @@ static void handle_listen(struct connection *c) { "<h2>Sinks</h2>\n" "<p>\n"); + if (c->method == METHOD_HEAD) { + pa_ioline_defer_close(c->line); + return; + } + PA_IDXSET_FOREACH(sink, c->protocol->core->sinks, idx) { char *t, *m; @@ -566,6 +598,10 @@ static void handle_listen_prefix(struct connection *c, const char *source_name) http_response(c, 200, "OK", t); pa_xfree(t); + if(c->method == METHOD_HEAD) { + connection_unlink(c); + return; + } pa_ioline_set_callback(c->line, NULL, NULL); if (pa_ioline_is_drained(c->line)) @@ -606,10 +642,15 @@ static void line_callback(pa_ioline *line, const char *s, void *userdata) { switch (c->state) { case STATE_REQUEST_LINE: { - if (!pa_startswith(s, "GET ")) + if (pa_startswith(s, "GET ")) { + c->method = METHOD_GET; + s +=4; + } else if (pa_startswith(s, "HEAD ")) { + c->method = METHOD_HEAD; + s +=5; + } else { goto fail; - - s +=4; + } c->url = pa_xstrndup(s, strcspn(s, " \r\n\t?")); c->state = STATE_MIME_HEADER; |