diff options
| author | Matthijs Kooijman <matthijs@stdin.nl> | 2010-02-21 21:46:06 +0100 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2010-02-21 21:46:06 +0100 | 
| commit | f8aceafb1321fb2254f6cafea25c14f07a78ad49 (patch) | |
| tree | 1218aa9f6a330b2b124be33958fd4355e682a1c3 /src | |
| parent | ebf2116810fa8f18baf1fa693eaf35a8a83109ee (diff) | |
http: support HTTP HEAD
http://pulseaudio.org/ticket/781
Diffstat (limited to 'src')
| -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; | 
