diff --git a/lib/http_request.c b/lib/http_request.c index e259a60..15bf49d 100644 --- a/lib/http_request.c +++ b/lib/http_request.c @@ -29,6 +29,7 @@ struct http_request_s { const char *method; char *url; + char protocol[9]; char **headers; int headers_size; @@ -51,6 +52,9 @@ on_url(llhttp_t *parser, const char *at, size_t length) request->url[urllen] = '\0'; strncat(request->url, at, length); + + strncpy(request->protocol, at + length + 1, 8); + return 0; } @@ -230,6 +234,13 @@ http_request_get_url(http_request_t *request) return request->url; } +const char * +http_request_get_protocol(http_request_t *request) +{ + assert(request); + return request->protocol; +} + const char * http_request_get_header(http_request_t *request, const char *name) { diff --git a/lib/http_request.h b/lib/http_request.h index e8ebfd7..d72a6f1 100644 --- a/lib/http_request.h +++ b/lib/http_request.h @@ -28,6 +28,7 @@ const char *http_request_get_error_name(http_request_t *request); const char *http_request_get_error_description(http_request_t *request); const char *http_request_get_method(http_request_t *request); const char *http_request_get_url(http_request_t *request); +const char *http_request_get_protocol(http_request_t *request); const char *http_request_get_header(http_request_t *request, const char *name); const char *http_request_get_data(http_request_t *request, int *datalen); int http_request_get_header_string(http_request_t *request, char **header_str); diff --git a/lib/raop.c b/lib/raop.c index 9a249bc..fa16cba 100644 --- a/lib/raop.c +++ b/lib/raop.c @@ -155,18 +155,18 @@ conn_init(void *opaque, unsigned char *local, int locallen, unsigned char *remot static void conn_request(void *ptr, http_request_t *request, http_response_t **response) { - raop_conn_t *conn = ptr; - const char *method; - const char *url; - const char *cseq; char *response_data = NULL; int response_datalen = 0; - logger_log(conn->raop->logger, LOGGER_DEBUG, "conn_request"); - bool logger_debug = (logger_get_level(conn->raop->logger) >= LOGGER_DEBUG); + raop_conn_t *conn = ptr; - method = http_request_get_method(request); - url = http_request_get_url(request); - cseq = http_request_get_header(request, "CSeq"); + logger_log(conn->raop->logger, LOGGER_DEBUG, "conn_request"); + + const char *method = http_request_get_method(request); + const char *url = http_request_get_url(request); + const char *protocol = http_request_get_protocol(request); + const char *cseq = http_request_get_header(request, "CSeq"); + + bool logger_debug = (logger_get_level(conn->raop->logger) >= LOGGER_DEBUG); if (!conn->have_active_remote) { const char *active_remote = http_request_get_header(request, "Active-Remote"); if (active_remote) { @@ -178,10 +178,16 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) { } } - if (!method || !cseq) { + if (!method) { return; } - logger_log(conn->raop->logger, LOGGER_DEBUG, "\n%s %s RTSP/1.0", method, url); + + /* this rejects unsupported messages from _airplay._tcp for video streaming protocol*/ + if (!cseq) { + return; + } + + logger_log(conn->raop->logger, LOGGER_DEBUG, "\n%s %s %s", method, url, protocol); char *header_str= NULL; http_request_get_header_string(request, &header_str); if (header_str) { @@ -215,7 +221,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) { } } - *response = http_response_init("RTSP/1.0", 200, "OK"); + *response = http_response_init(protocol, 200, "OK"); http_response_add_header(*response, "CSeq", cseq); //http_response_add_header(*response, "Apple-Jack-Status", "connected; type=analog");