From: Juho Vähä-Herttua Date: Sun, 31 Mar 2013 19:39:12 +0000 (+0300) Subject: Disconnect the HTTP connection on unrecoverable error X-Git-Tag: upstream/0.9.0~4^2~38 X-Git-Url: https://git.piment-noir.org/?p=deb_shairplay.git;a=commitdiff_plain;h=c5f6526802d1bf48635941f564552ef059dbc1f4 Disconnect the HTTP connection on unrecoverable error --- diff --git a/src/lib/http_response.c b/src/lib/http_response.c index 49166cc..4198975 100644 --- a/src/lib/http_response.c +++ b/src/lib/http_response.c @@ -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) { diff --git a/src/lib/http_response.h b/src/lib/http_response.h index 15b4d27..43e1128 100644 --- a/src/lib/http_response.h +++ b/src/lib/http_response.h @@ -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); diff --git a/src/lib/httpd.c b/src/lib/httpd.c index 757f050..1d9e7e2 100644 --- a/src/lib/httpd.c +++ b/src/lib/httpd.c @@ -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"); } diff --git a/src/lib/raop.c b/src/lib/raop.c index 57de71f..f3cc399 100644 --- a/src/lib/raop.c +++ b/src/lib/raop.c @@ -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; }