Disconnect the HTTP connection on unrecoverable error
authorJuho Vähä-Herttua <juhovh@iki.fi>
Sun, 31 Mar 2013 19:39:12 +0000 (22:39 +0300)
committerJuho Vähä-Herttua <juhovh@iki.fi>
Sun, 31 Mar 2013 19:39:12 +0000 (22:39 +0300)
src/lib/http_response.c
src/lib/http_response.h
src/lib/httpd.c
src/lib/raop.c

index 49166ccbc03490adfbddcea96a6eb453d4ebf05d..41989756e837515be46f96d8cfd52e8fc0dfee8a 100644 (file)
@@ -22,6 +22,7 @@
 
 struct http_response_s {
        int complete;
+       int disconnect;
 
        char *data;
        int data_size;
@@ -136,6 +137,22 @@ http_response_finish(http_response_t *response, const char *data, int datalen)
        response->complete = 1;
 }
 
+void
+http_response_set_disconnect(http_response_t *response, int disconnect)
+{
+       assert(response);
+
+       response->disconnect = !!disconnect;
+}
+
+int
+http_response_get_disconnect(http_response_t *response)
+{
+       assert(response);
+
+       return response->disconnect;
+}
+
 const char *
 http_response_get_data(http_response_t *response, int *datalen)
 {
index 15b4d2716ddecd56b66ef317c1aa00197d506c0d..43e112852b31765999c6b31a39bc81c3f6410a7d 100644 (file)
@@ -22,6 +22,9 @@ http_response_t *http_response_init(const char *protocol, int code, const char *
 void http_response_add_header(http_response_t *response, const char *name, const char *value);
 void http_response_finish(http_response_t *response, const char *data, int datalen);
 
+void http_response_set_disconnect(http_response_t *response, int disconnect);
+int http_response_get_disconnect(http_response_t *response);
+
 const char *http_response_get_data(http_response_t *response, int *datalen);
 
 void http_response_destroy(http_response_t *response);
index 757f05064ae49b9cb14b9b95cbc3c2e86487d7c0..1d9e7e2eb454334efec4f6e7ba106a7f9c9104a7 100644 (file)
@@ -304,6 +304,11 @@ httpd_thread(void *arg)
                                                }
                                                written += ret;
                                        }
+
+                                       if (http_response_get_disconnect(response)) {
+                                               logger_log(httpd->logger, LOGGER_INFO, "Disconnecting on software request");
+                                               httpd_remove_connection(httpd, connection);
+                                       }
                                } else {
                                        logger_log(httpd->logger, LOGGER_INFO, "Didn't get response");
                                }
index 57de71fd880967bc7b3472d8698a4315d130aa1b..f3cc399b6a5f99fc13e5a9d97e0973ddec7bc812 100644 (file)
@@ -231,6 +231,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response)
                        conn->raop_rtp = raop_rtp_init(raop->logger, &raop->callbacks, remotestr, rtpmapstr, fmtpstr, aeskey, aesiv);
                        if (!conn->raop_rtp) {
                                logger_log(conn->raop->logger, LOGGER_ERR, "Error initializing the audio decoder");
+                               http_response_set_disconnect(res, 1);
                        }
                        sdp_destroy(sdp);
                }
@@ -272,7 +273,8 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response)
                if (conn->raop_rtp) {
                        raop_rtp_start(conn->raop_rtp, use_udp, remote_cport, remote_tport, &cport, &tport, &dport);
                } else {
-                       logger_log(conn->raop->logger, LOGGER_CRIT, "RAOP not initialized at SETUP, playing will fail!");
+                       logger_log(conn->raop->logger, LOGGER_ERR, "RAOP not initialized at SETUP, playing will fail!");
+                       http_response_set_disconnect(res, 1);
                }
 
                memset(buffer, 0, sizeof(buffer));
@@ -351,7 +353,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response)
        }
        http_response_finish(res, NULL, 0);
 
-       logger_log(conn->raop->logger, LOGGER_DEBUG, "Got request %s with URL %s", method, http_request_get_url(request));
+       logger_log(conn->raop->logger, LOGGER_DEBUG, "Handled request %s with URL %s", method, http_request_get_url(request));
        *response = res;
 }