STATE_DATA
};
+enum method {
+ METHOD_GET,
+ METHOD_HEAD
+};
+
struct connection {
pa_http_protocol *protocol;
pa_iochannel *io;
pa_client *client;
enum state state;
char *url;
+ enum method method;
pa_module *module;
};
http_response(c, code, msg, MIME_HTML);
+ if (c->method == METHOD_HEAD) {
+ pa_ioline_defer_close(c->line);
+ return;
+ }
+
if (!text)
text = msg;
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"
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"
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);
"<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;
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))
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;