diff --git a/xbmc/network/WebServer.cpp b/xbmc/network/WebServer.cpp index 7834042..a1c6923 100644 --- a/xbmc/network/WebServer.cpp +++ b/xbmc/network/WebServer.cpp @@ -36,14 +36,18 @@ #define MAX_POST_BUFFER_SIZE 2048 -#define PAGE_FILE_NOT_FOUND "File not foundFile not found" -#define NOT_SUPPORTED "Not SupportedThe method you are trying to use is not supported by this server" +#define PAGE_FILE_NOT_FOUND \ + "File not foundFile not found" +#define NOT_SUPPORTED \ + "Not SupportedThe method you are trying to use is not " \ + "supported by this server" #define HEADER_VALUE_NO_CACHE "no-cache" -#define HEADER_NEWLINE "\r\n" +#define HEADER_NEWLINE "\r\n" -typedef struct { +typedef struct +{ std::shared_ptr file; CHttpRanges ranges; size_t rangeCountTotal; @@ -62,7 +66,7 @@ CWebServer::CWebServer() m_cert() { #if defined(TARGET_DARWIN) - void *stack_addr; + void* stack_addr; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_getstack(&attr, &stack_addr, &m_thread_stacksize); @@ -86,16 +90,16 @@ static MHD_Response* create_response(size_t size, const void* data, int free, in return MHD_create_response_from_buffer(size, const_cast(data), mode); } -int CWebServer::AskForAuthentication(const HTTPRequest& request) const +MHD_RESULT CWebServer::AskForAuthentication(const HTTPRequest& request) const { - struct MHD_Response *response = create_response(0, nullptr, MHD_NO, MHD_NO); + struct MHD_Response* response = create_response(0, nullptr, MHD_NO, MHD_NO); if (!response) { CLog::Log(LOGERROR, "CWebServer[%hu]: unable to create HTTP Unauthorized response", m_port); return MHD_NO; } - int ret = AddHeader(response, MHD_HTTP_HEADER_CONNECTION, "close"); + MHD_RESULT ret = AddHeader(response, MHD_HTTP_HEADER_CONNECTION, "close"); if (!ret) { CLog::Log(LOGERROR, "CWebServer[%hu]: unable to prepare HTTP Unauthorized response", m_port); @@ -105,7 +109,10 @@ int CWebServer::AskForAuthentication(const HTTPRequest& request) const LogResponse(request, MHD_HTTP_UNAUTHORIZED); - ret = MHD_queue_basic_auth_fail_response(request.connection, "XBMC", response); + // This MHD_RESULT cast is only necessary for libmicrohttpd 0.9.71 + // The return type of MHD_queue_basic_auth_fail_response was fixed for future versions + // See https://git.gnunet.org/libmicrohttpd.git/commit/?id=860b42e9180da4dcd7e8690a3fcdb4e37e5772c5 + ret = (MHD_RESULT) MHD_queue_basic_auth_fail_response(request.connection, "XBMC", response); MHD_destroy_response(response); return ret; @@ -135,10 +142,14 @@ bool CWebServer::IsAuthenticated(const HTTPRequest& request) const return authenticated; } -int CWebServer::AnswerToConnection(void *cls, struct MHD_Connection *connection, - const char *url, const char *method, - const char *version, const char *upload_data, - size_t *upload_data_size, void **con_cls) +MHD_RESULT CWebServer::AnswerToConnection(void* cls, + struct MHD_Connection* connection, + const char* url, + const char* method, + const char* version, + const char* upload_data, + size_t* upload_data_size, + void** con_cls) { if (cls == nullptr || con_cls == nullptr || *con_cls == nullptr) { @@ -146,7 +157,7 @@ int CWebServer::AnswerToConnection(void *cls, struct MHD_Connection *connection, return MHD_NO; } - CWebServer *webServer = reinterpret_cast(cls); + CWebServer* webServer = reinterpret_cast(cls); if (webServer == nullptr) { CLog::Log(LOGERROR, "CWebServer[unknown]: invalid request received"); @@ -155,15 +166,22 @@ int CWebServer::AnswerToConnection(void *cls, struct MHD_Connection *connection, ConnectionHandler* connectionHandler = reinterpret_cast(*con_cls); HTTPMethod methodType = GetHTTPMethod(method); - HTTPRequest request = { webServer, connection, connectionHandler->fullUri, url, methodType, version }; + HTTPRequest request = {webServer, connection, connectionHandler->fullUri, + url, methodType, version}; if (connectionHandler->isNew) webServer->LogRequest(request); - return webServer->HandlePartialRequest(connection, connectionHandler, request, upload_data, upload_data_size, con_cls); + return webServer->HandlePartialRequest(connection, connectionHandler, request, upload_data, + upload_data_size, con_cls); } -int CWebServer::HandlePartialRequest(struct MHD_Connection *connection, ConnectionHandler* connectionHandler, const HTTPRequest& request, const char *upload_data, size_t *upload_data_size, void **con_cls) +MHD_RESULT CWebServer::HandlePartialRequest(struct MHD_Connection* connection, + ConnectionHandler* connectionHandler, + const HTTPRequest& request, + const char* upload_data, + size_t* upload_data_size, + void** con_cls) { std::unique_ptr conHandler(connectionHandler); @@ -196,17 +214,18 @@ int CWebServer::HandlePartialRequest(struct MHD_Connection *connection, Connecti if (handler->GetLastModifiedDate(lastModified) && lastModified.IsValid()) { // handle If-Modified-Since or If-Unmodified-Since - std::string ifModifiedSince = HTTPRequestHandlerUtils::GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_MODIFIED_SINCE); - std::string ifUnmodifiedSince = HTTPRequestHandlerUtils::GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_UNMODIFIED_SINCE); + std::string ifModifiedSince = HTTPRequestHandlerUtils::GetRequestHeaderValue( + connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_MODIFIED_SINCE); + std::string ifUnmodifiedSince = HTTPRequestHandlerUtils::GetRequestHeaderValue( + connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_UNMODIFIED_SINCE); CDateTime ifModifiedSinceDate; CDateTime ifUnmodifiedSinceDate; // handle If-Modified-Since (but only if the response is cacheable) - if (cacheable && - ifModifiedSinceDate.SetFromRFC1123DateTime(ifModifiedSince) && - lastModified.GetAsUTCDateTime() <= ifModifiedSinceDate) + if (cacheable && ifModifiedSinceDate.SetFromRFC1123DateTime(ifModifiedSince) && + lastModified.GetAsUTCDateTime() <= ifModifiedSinceDate) { - struct MHD_Response *response = create_response(0, nullptr, MHD_NO, MHD_NO); + struct MHD_Response* response = create_response(0, nullptr, MHD_NO, MHD_NO); if (response == nullptr) { CLog::Log(LOGERROR, "CWebServer[%hu]: failed to create a HTTP 304 response", m_port); @@ -217,7 +236,7 @@ int CWebServer::HandlePartialRequest(struct MHD_Connection *connection, Connecti } // handle If-Unmodified-Since else if (ifUnmodifiedSinceDate.SetFromRFC1123DateTime(ifUnmodifiedSince) && - lastModified.GetAsUTCDateTime() > ifUnmodifiedSinceDate) + lastModified.GetAsUTCDateTime() > ifUnmodifiedSinceDate) return SendErrorResponse(request, MHD_HTTP_PRECONDITION_FAILED, request.method); } @@ -231,7 +250,8 @@ int CWebServer::HandlePartialRequest(struct MHD_Connection *connection, Connecti // as ownership of the connection handler is passed to libmicrohttpd we must not destroy it SetupPostDataProcessing(request, conHandler.get(), handler, con_cls); - // as ownership of the connection handler has been passed to libmicrohttpd we must not destroy it + // as ownership of the connection handler has been passed to libmicrohttpd we must not + // destroy it conHandler.release(); return MHD_YES; @@ -249,7 +269,8 @@ int CWebServer::HandlePartialRequest(struct MHD_Connection *connection, Connecti // process additional / remaining POST data if (ProcessPostData(request, conHandler.get(), upload_data, upload_data_size, con_cls)) { - // as ownership of the connection handler has been passed to libmicrohttpd we must not destroy it + // as ownership of the connection handler has been passed to libmicrohttpd we must not + // destroy it conHandler.release(); return MHD_YES; @@ -266,7 +287,8 @@ int CWebServer::HandlePartialRequest(struct MHD_Connection *connection, Connecti return HandleRequest(conHandler->requestHandler); } - // it's unusual to get more than one call to AnswerToConnection for none-POST requests, but let's handle it anyway + // it's unusual to get more than one call to AnswerToConnection for none-POST requests, but + // let's handle it anyway auto requestHandler = FindRequestHandler(request); if (requestHandler != nullptr) return HandleRequest(requestHandler); @@ -276,15 +298,20 @@ int CWebServer::HandlePartialRequest(struct MHD_Connection *connection, Connecti return SendErrorResponse(request, MHD_HTTP_NOT_FOUND, request.method); } -int CWebServer::HandlePostField(void *cls, enum MHD_ValueKind kind, const char *key, - const char *filename, const char *content_type, - const char *transfer_encoding, const char *data, uint64_t off, - size_t size) +MHD_RESULT CWebServer::HandlePostField(void* cls, + enum MHD_ValueKind kind, + const char* key, + const char* filename, + const char* content_type, + const char* transfer_encoding, + const char* data, + uint64_t off, + size_t size) { - ConnectionHandler *conHandler = (ConnectionHandler *)cls; + ConnectionHandler* conHandler = (ConnectionHandler*)cls; - if (conHandler == nullptr || conHandler->requestHandler == nullptr || - key == nullptr || data == nullptr || size == 0) + if (conHandler == nullptr || conHandler->requestHandler == nullptr || key == nullptr || + data == nullptr || size == 0) { CLog::Log(LOGERROR, "CWebServer: unable to handle HTTP POST field"); return MHD_NO; @@ -294,21 +321,21 @@ int CWebServer::HandlePostField(void *cls, enum MHD_ValueKind kind, const char * return MHD_YES; } -int CWebServer::HandleRequest(const std::shared_ptr& handler) +MHD_RESULT CWebServer::HandleRequest(const std::shared_ptr& handler) { if (handler == nullptr) return MHD_NO; HTTPRequest request = handler->GetRequest(); - int ret = handler->HandleRequest(); + MHD_RESULT ret = handler->HandleRequest(); if (ret == MHD_NO) { CLog::Log(LOGERROR, "CWebServer[%hu]: failed to handle HTTP request for %s", m_port, request.pathUrl.c_str()); return SendErrorResponse(request, MHD_HTTP_INTERNAL_SERVER_ERROR, request.method); } - const HTTPResponseDetails &responseDetails = handler->GetResponseDetails(); - struct MHD_Response *response = nullptr; + const HTTPResponseDetails& responseDetails = handler->GetResponseDetails(); + struct MHD_Response* response = nullptr; switch (responseDetails.type) { case HTTPNone: @@ -331,7 +358,8 @@ int CWebServer::HandleRequest(const std::shared_ptr& handle break; case HTTPError: - ret = CreateErrorResponse(request.connection, responseDetails.status, request.method, response); + ret = + CreateErrorResponse(request.connection, responseDetails.status, request.method, response); break; default: @@ -348,13 +376,15 @@ int CWebServer::HandleRequest(const std::shared_ptr& handle return FinalizeRequest(handler, responseDetails.status, response); } -int CWebServer::FinalizeRequest(const std::shared_ptr& handler, int responseStatus, struct MHD_Response *response) +MHD_RESULT CWebServer::FinalizeRequest(const std::shared_ptr& handler, + int responseStatus, + struct MHD_Response* response) { if (handler == nullptr || response == nullptr) return MHD_NO; - const HTTPRequest &request = handler->GetRequest(); - const HTTPResponseDetails &responseDetails = handler->GetResponseDetails(); + const HTTPRequest& request = handler->GetRequest(); + const HTTPResponseDetails& responseDetails = handler->GetResponseDetails(); // if the request handler has set a content type and it hasn't been set as a header, add it if (!responseDetails.contentType.empty()) @@ -380,7 +410,8 @@ int CWebServer::FinalizeRequest(const std::shared_ptr& hand // if the response can't be cached or the maximum age is 0 force the client not to cache if (!handler->CanBeCached() || maxAge == 0) - handler->AddResponseHeader(MHD_HTTP_HEADER_CACHE_CONTROL, "private, max-age=0, " HEADER_VALUE_NO_CACHE); + handler->AddResponseHeader(MHD_HTTP_HEADER_CACHE_CONTROL, + "private, max-age=0, " HEADER_VALUE_NO_CACHE); else { // create the value of the Cache-Control header @@ -416,14 +447,14 @@ int CWebServer::FinalizeRequest(const std::shared_ptr& hand return SendResponse(request, responseStatus, response); } -std::shared_ptr CWebServer::FindRequestHandler(const HTTPRequest& request) const +std::shared_ptr CWebServer::FindRequestHandler( + const HTTPRequest& request) const { // look for a IHTTPRequestHandler which can take care of the current request auto requestHandlerIt = std::find_if(m_requestHandlers.cbegin(), m_requestHandlers.cend(), - [&request](const IHTTPRequestHandler* requestHandler) - { - return requestHandler->CanHandleRequest(request); - }); + [&request](const IHTTPRequestHandler* requestHandler) { + return requestHandler->CanHandleRequest(request); + }); // we found a matching IHTTPRequestHandler so let's get a new instance for this request if (requestHandlerIt != m_requestHandlers.cend()) @@ -435,7 +466,8 @@ std::shared_ptr CWebServer::FindRequestHandler(const HTTPRe bool CWebServer::IsRequestCacheable(const HTTPRequest& request) const { // handle Cache-Control - std::string cacheControl = HTTPRequestHandlerUtils::GetRequestHeaderValue(request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CACHE_CONTROL); + std::string cacheControl = HTTPRequestHandlerUtils::GetRequestHeaderValue( + request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CACHE_CONTROL); if (!cacheControl.empty()) { std::vector cacheControls = StringUtils::Split(cacheControl, ","); @@ -450,23 +482,26 @@ bool CWebServer::IsRequestCacheable(const HTTPRequest& request) const } // handle Pragma - std::string pragma = HTTPRequestHandlerUtils::GetRequestHeaderValue(request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_PRAGMA); + std::string pragma = HTTPRequestHandlerUtils::GetRequestHeaderValue( + request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_PRAGMA); if (pragma.compare(HEADER_VALUE_NO_CACHE) == 0) return false; return true; } -bool CWebServer::IsRequestRanged(const HTTPRequest& request, const CDateTime &lastModified) const +bool CWebServer::IsRequestRanged(const HTTPRequest& request, const CDateTime& lastModified) const { // parse the Range header and store it in the request object CHttpRanges ranges; - bool ranged = ranges.Parse(HTTPRequestHandlerUtils::GetRequestHeaderValue(request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_RANGE)); + bool ranged = ranges.Parse(HTTPRequestHandlerUtils::GetRequestHeaderValue( + request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_RANGE)); // handle If-Range header but only if the Range header is present if (ranged && lastModified.IsValid()) { - std::string ifRange = HTTPRequestHandlerUtils::GetRequestHeaderValue(request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_RANGE); + std::string ifRange = HTTPRequestHandlerUtils::GetRequestHeaderValue( + request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_RANGE); if (!ifRange.empty() && lastModified.IsValid()) { CDateTime ifRangeDate; @@ -482,25 +517,33 @@ bool CWebServer::IsRequestRanged(const HTTPRequest& request, const CDateTime &la return !ranges.IsEmpty(); } -void CWebServer::SetupPostDataProcessing(const HTTPRequest& request, ConnectionHandler *connectionHandler, std::shared_ptr handler, void **con_cls) const +void CWebServer::SetupPostDataProcessing(const HTTPRequest& request, + ConnectionHandler* connectionHandler, + std::shared_ptr handler, + void** con_cls) const { connectionHandler->requestHandler = handler; - // we might need to handle the POST data ourselves which is done in the next call to AnswerToConnection + // we might need to handle the POST data ourselves which is done in the next call to + // AnswerToConnection *con_cls = connectionHandler; // get the content-type of the POST data - const auto contentType = HTTPRequestHandlerUtils::GetRequestHeaderValue(request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CONTENT_TYPE); + const auto contentType = HTTPRequestHandlerUtils::GetRequestHeaderValue( + request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CONTENT_TYPE); if (contentType.empty()) return; - // if the content-type is neither application/x-ww-form-urlencoded nor multipart/form-data we need to handle it ourselves + // if the content-type is neither application/x-ww-form-urlencoded nor multipart/form-data we need + // to handle it ourselves if (!StringUtils::EqualsNoCase(contentType, MHD_HTTP_POST_ENCODING_FORM_URLENCODED) && !StringUtils::EqualsNoCase(contentType, MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA)) return; // otherwise we can use MHD's POST processor - connectionHandler->postprocessor = MHD_create_post_processor(request.connection, MAX_POST_BUFFER_SIZE, &CWebServer::HandlePostField, static_cast(connectionHandler)); + connectionHandler->postprocessor = MHD_create_post_processor( + request.connection, MAX_POST_BUFFER_SIZE, &CWebServer::HandlePostField, + static_cast(connectionHandler)); // MHD doesn't seem to be able to handle this post request if (connectionHandler->postprocessor == nullptr) @@ -510,7 +553,11 @@ void CWebServer::SetupPostDataProcessing(const HTTPRequest& request, ConnectionH } } -bool CWebServer::ProcessPostData(const HTTPRequest& request, ConnectionHandler *connectionHandler, const char *upload_data, size_t *upload_data_size, void **con_cls) const +bool CWebServer::ProcessPostData(const HTTPRequest& request, + ConnectionHandler* connectionHandler, + const char* upload_data, + size_t* upload_data_size, + void** con_cls) const { if (connectionHandler->requestHandler == nullptr) { @@ -531,10 +578,12 @@ bool CWebServer::ProcessPostData(const HTTPRequest& request, ConnectionHandler * bool postDataHandled = false; // either use MHD's POST processor if (connectionHandler->postprocessor != nullptr) - postDataHandled = MHD_post_process(connectionHandler->postprocessor, upload_data, *upload_data_size) == MHD_YES; + postDataHandled = MHD_post_process(connectionHandler->postprocessor, upload_data, + *upload_data_size) == MHD_YES; // or simply copy the data to the handler else if (connectionHandler->requestHandler != nullptr) - postDataHandled = connectionHandler->requestHandler->AddPostData(upload_data, *upload_data_size); + postDataHandled = + connectionHandler->requestHandler->AddPostData(upload_data, *upload_data_size); // abort if the received POST data couldn't be handled if (!postDataHandled) @@ -554,7 +603,7 @@ bool CWebServer::ProcessPostData(const HTTPRequest& request, ConnectionHandler * return true; } -void CWebServer::FinalizePostDataProcessing(ConnectionHandler *connectionHandler) const +void CWebServer::FinalizePostDataProcessing(ConnectionHandler* connectionHandler) const { if (connectionHandler->postprocessor == nullptr) return; @@ -562,13 +611,14 @@ void CWebServer::FinalizePostDataProcessing(ConnectionHandler *connectionHandler MHD_destroy_post_processor(connectionHandler->postprocessor); } -int CWebServer::CreateMemoryDownloadResponse(const std::shared_ptr& handler, struct MHD_Response *&response) const +MHD_RESULT CWebServer::CreateMemoryDownloadResponse( + const std::shared_ptr& handler, struct MHD_Response*& response) const { if (handler == nullptr) return MHD_NO; - const HTTPRequest &request = handler->GetRequest(); - const HTTPResponseDetails &responseDetails = handler->GetResponseDetails(); + const HTTPRequest& request = handler->GetRequest(); + const HTTPResponseDetails& responseDetails = handler->GetResponseDetails(); HttpResponseRanges responseRanges = handler->GetResponseData(); // check if the response is completely empty @@ -577,7 +627,7 @@ int CWebServer::CreateMemoryDownloadResponse(const std::shared_ptr 1) || - (!request.ranges.IsEmpty() && responseRanges.size() > request.ranges.Size())) + (!request.ranges.IsEmpty() && responseRanges.size() > request.ranges.Size())) { CLog::Log(LOGWARNING, "CWebServer[%hu]: response contains more ranges (%d) than the request asked for (%d)", m_port, (int)responseRanges.size(), (int)request.ranges.Size()); return SendErrorResponse(request, MHD_HTTP_INTERNAL_SERVER_ERROR, request.method); @@ -600,33 +650,38 @@ int CWebServer::CreateMemoryDownloadResponse(const std::shared_ptr& handler, struct MHD_Response *&response) const +MHD_RESULT CWebServer::CreateRangedMemoryDownloadResponse( + const std::shared_ptr& handler, struct MHD_Response*& response) const { if (handler == nullptr) return MHD_NO; - const HTTPRequest &request = handler->GetRequest(); - const HTTPResponseDetails &responseDetails = handler->GetResponseDetails(); + const HTTPRequest& request = handler->GetRequest(); + const HTTPResponseDetails& responseDetails = handler->GetResponseDetails(); HttpResponseRanges responseRanges = handler->GetResponseData(); // if there's no or only one range this is not the right place @@ -658,8 +713,10 @@ int CWebServer::CreateRangedMemoryDownloadResponse(const std::shared_ptrSetResponseStatus(MHD_HTTP_PARTIAL_CONTENT); // add Content-Range header - handler->AddResponseHeader(MHD_HTTP_HEADER_CONTENT_RANGE, - HttpRangeUtils::GenerateContentRangeHeaderValue(firstRangePosition, lastRangePosition, responseDetails.totalLength)); + handler->AddResponseHeader( + MHD_HTTP_HEADER_CONTENT_RANGE, + HttpRangeUtils::GenerateContentRangeHeaderValue(firstRangePosition, lastRangePosition, + responseDetails.totalLength)); // generate a multipart boundary std::string multipartBoundary = HttpRangeUtils::GenerateMultipartBoundary(); @@ -670,7 +727,8 @@ int CWebServer::CreateRangedMemoryDownloadResponse(const std::shared_ptrAddResponseHeader(MHD_HTTP_HEADER_CONTENT_TYPE, contentType); // generate the multipart boundary with the Content-Type header field - std::string multipartBoundaryWithHeader = HttpRangeUtils::GenerateMultipartBoundaryWithHeader(multipartBoundary, contentType); + std::string multipartBoundaryWithHeader = + HttpRangeUtils::GenerateMultipartBoundaryWithHeader(multipartBoundary, contentType); std::string result; // add all the ranges to the result @@ -680,14 +738,18 @@ int CWebServer::CreateRangedMemoryDownloadResponse(const std::shared_ptr(range->GetData()), static_cast(range->GetLength())); + result.append(static_cast(range->GetData()), + static_cast(range->GetLength())); // check if we need to free the range data - if (responseDetails.type == HTTPMemoryDownloadFreeNoCopy || responseDetails.type == HTTPMemoryDownloadFreeCopy) + if (responseDetails.type == HTTPMemoryDownloadFreeNoCopy || + responseDetails.type == HTTPMemoryDownloadFreeCopy) free(const_cast(range->GetData())); } @@ -697,10 +759,13 @@ int CWebServer::CreateRangedMemoryDownloadResponse(const std::shared_ptrAddResponseHeader(MHD_HTTP_HEADER_CONTENT_LENGTH, StringUtils::Format("%" PRIu64, static_cast(result.size()))); // finally create the response - return CreateMemoryDownloadResponse(request.connection, result.c_str(), result.size(), false, true, response); + return CreateMemoryDownloadResponse(request.connection, result.c_str(), result.size(), false, + true, response); } -int CWebServer::CreateRedirect(struct MHD_Connection *connection, const std::string &strURL, struct MHD_Response *&response) const +MHD_RESULT CWebServer::CreateRedirect(struct MHD_Connection* connection, + const std::string& strURL, + struct MHD_Response*& response) const { response = create_response(0, nullptr, MHD_NO, MHD_NO); if (response == nullptr) @@ -713,13 +778,14 @@ int CWebServer::CreateRedirect(struct MHD_Connection *connection, const std::str return MHD_YES; } -int CWebServer::CreateFileDownloadResponse(const std::shared_ptr& handler, struct MHD_Response *&response) const +MHD_RESULT CWebServer::CreateFileDownloadResponse( + const std::shared_ptr& handler, struct MHD_Response*& response) const { if (handler == nullptr) return MHD_NO; - const HTTPRequest &request = handler->GetRequest(); - const HTTPResponseDetails &responseDetails = handler->GetResponseDetails(); + const HTTPRequest& request = handler->GetRequest(); + const HTTPResponseDetails& responseDetails = handler->GetResponseDetails(); HttpResponseRanges responseRanges = handler->GetResponseData(); std::shared_ptr file = std::make_shared(); @@ -761,7 +827,8 @@ int CWebServer::CreateFileDownloadResponse(const std::shared_ptrranges = request.ranges; else - HTTPRequestHandlerUtils::GetRequestedRanges(request.connection, fileLength, context->ranges); + HTTPRequestHandlerUtils::GetRequestedRanges(request.connection, fileLength, + context->ranges); } uint64_t firstPosition = 0; @@ -773,7 +840,8 @@ int CWebServer::CreateFileDownloadResponse(const std::shared_ptrSetResponseStatus(MHD_HTTP_PARTIAL_CONTENT); - // we need to remember that we are ranged because the range length might change and won't be reliable anymore for length comparisons + // we need to remember that we are ranged because the range length might change and won't be + // reliable anymore for length comparisons ranged = true; context->ranges.GetFirstPosition(firstPosition); @@ -785,7 +853,8 @@ int CWebServer::CreateFileDownloadResponse(const std::shared_ptrranges.GetLength(); - // adjust the MIME type and range length in case of multiple ranges which requires multipart boundaries + // adjust the MIME type and range length in case of multiple ranges which requires multipart + // boundaries if (context->rangeCountTotal > 1) { context->boundary = HttpRangeUtils::GenerateMultipartBoundary(); @@ -793,14 +862,19 @@ int CWebServer::CreateFileDownloadResponse(const std::shared_ptr\r\nContent-Type: \r\n - context->boundaryWithHeader = HttpRangeUtils::GenerateMultipartBoundaryWithHeader(context->boundary, context->contentType); + context->boundaryWithHeader = HttpRangeUtils::GenerateMultipartBoundaryWithHeader( + context->boundary, context->contentType); context->boundaryEnd = HttpRangeUtils::GenerateMultipartBoundaryEnd(context->boundary); // for every range, we need to add a boundary with header - for (HttpRanges::const_iterator range = context->ranges.Begin(); range != context->ranges.End(); ++range) + for (HttpRanges::const_iterator range = context->ranges.Begin(); + range != context->ranges.End(); ++range) { - // we need to temporarily add the Content-Range header to the boundary to be able to determine the length - std::string completeBoundaryWithHeader = HttpRangeUtils::GenerateMultipartBoundaryWithHeader(context->boundaryWithHeader, &*range); + // we need to temporarily add the Content-Range header to the boundary to be able to + // determine the length + std::string completeBoundaryWithHeader = + HttpRangeUtils::GenerateMultipartBoundaryWithHeader(context->boundaryWithHeader, + &*range); totalLength += completeBoundaryWithHeader.size(); // add a newline before any new multipart boundary @@ -815,10 +889,9 @@ int CWebServer::CreateFileDownloadResponse(const std::shared_ptrranges.GetFirstPosition(context->writePosition); // create the response object - response = MHD_create_response_from_callback(totalLength, 2048, - &CWebServer::ContentReaderCallback, - context.get(), - &CWebServer::ContentReaderFreeCallback); + response = + MHD_create_response_from_callback(totalLength, 2048, &CWebServer::ContentReaderCallback, + context.get(), &CWebServer::ContentReaderFreeCallback); if (response == nullptr) { CLog::Log(LOGERROR, "CWebServer[%hu]: failed to create a HTTP response for %s to be filled from %s", m_port, request.pathUrl.c_str(), filePath.c_str()); @@ -829,7 +902,9 @@ int CWebServer::CreateFileDownloadResponse(const std::shared_ptrAddResponseHeader(MHD_HTTP_HEADER_CONTENT_RANGE, HttpRangeUtils::GenerateContentRangeHeaderValue(firstPosition, lastPosition, fileLength)); + handler->AddResponseHeader( + MHD_HTTP_HEADER_CONTENT_RANGE, + HttpRangeUtils::GenerateContentRangeHeaderValue(firstPosition, lastPosition, fileLength)); } else { @@ -850,10 +925,13 @@ int CWebServer::CreateFileDownloadResponse(const std::shared_ptr(data), free ? MHD_YES : MHD_NO, copy ? MHD_YES : MHD_NO); + response = create_response(size, const_cast(data), free ? MHD_YES : MHD_NO, + copy ? MHD_YES : MHD_NO); if (response == nullptr) { CLog::Log(LOGERROR, "CWebServer[%hu]: failed to create a HTTP download response", m_port); @@ -893,29 +977,33 @@ int CWebServer::CreateMemoryDownloadResponse(struct MHD_Connection *connection, return MHD_YES; } -int CWebServer::SendResponse(const HTTPRequest& request, int responseStatus, MHD_Response *response) const +MHD_RESULT CWebServer::SendResponse(const HTTPRequest& request, + int responseStatus, + MHD_Response* response) const { LogResponse(request, responseStatus); - int ret = MHD_queue_response(request.connection, responseStatus, response); + MHD_RESULT ret = MHD_queue_response(request.connection, responseStatus, response); MHD_destroy_response(response); return ret; } -int CWebServer::SendErrorResponse(const HTTPRequest& request, int errorType, HTTPMethod method) const +MHD_RESULT CWebServer::SendErrorResponse(const HTTPRequest& request, + int errorType, + HTTPMethod method) const { - struct MHD_Response *response = nullptr; - int ret = CreateErrorResponse(request.connection, errorType, method, response); + struct MHD_Response* response = nullptr; + MHD_RESULT ret = CreateErrorResponse(request.connection, errorType, method, response); if (ret == MHD_NO) return MHD_NO; return SendResponse(request, errorType, response); } -void* CWebServer::UriRequestLogger(void *cls, const char *uri) +void* CWebServer::UriRequestLogger(void* cls, const char* uri) { - CWebServer *webServer = reinterpret_cast(cls); + CWebServer* webServer = reinterpret_cast(cls); // log the full URI if (webServer == nullptr) @@ -935,9 +1023,9 @@ void CWebServer::LogRequest(const char* uri) const CLog::Log(LOGDEBUG, "CWebServer[%hu]: request received for %s", m_port, uri); } -ssize_t CWebServer::ContentReaderCallback(void *cls, uint64_t pos, char *buf, size_t max) +ssize_t CWebServer::ContentReaderCallback(void* cls, uint64_t pos, char* buf, size_t max) { - HttpFileDownloadContext *context = (HttpFileDownloadContext *)cls; + HttpFileDownloadContext* context = (HttpFileDownloadContext*)cls; if (context == nullptr || context->file == nullptr) return -1; @@ -978,7 +1066,8 @@ ssize_t CWebServer::ContentReaderCallback(void *cls, uint64_t pos, char *buf, si } // put together the boundary for the current range - std::string boundary = HttpRangeUtils::GenerateMultipartBoundaryWithHeader(context->boundaryWithHeader, &range); + std::string boundary = + HttpRangeUtils::GenerateMultipartBoundaryWithHeader(context->boundaryWithHeader, &range); // copy the boundary into the buffer memcpy(buf, boundary.c_str(), boundary.size()); @@ -999,7 +1088,8 @@ ssize_t CWebServer::ContentReaderCallback(void *cls, uint64_t pos, char *buf, si maximum = std::min(maximum, end - context->writePosition + 1); // seek to the position if necessary - if (context->file->GetPosition() < 0 || context->writePosition != static_cast(context->file->GetPosition())) + if (context->file->GetPosition() < 0 || + context->writePosition != static_cast(context->file->GetPosition())) context->file->Seek(context->writePosition); // read data from the file @@ -1026,16 +1116,19 @@ ssize_t CWebServer::ContentReaderCallback(void *cls, uint64_t pos, char *buf, si return written; } -void CWebServer::ContentReaderFreeCallback(void *cls) +void CWebServer::ContentReaderFreeCallback(void* cls) { - HttpFileDownloadContext *context = (HttpFileDownloadContext *)cls; + HttpFileDownloadContext* context = (HttpFileDownloadContext*)cls; delete context; CLog::Log(LOGDEBUG, LOGWEBSERVER, "CWebServer [OUT] done"); } // local helper -static void panicHandlerForMHD(void* unused, const char* file, unsigned int line, const char *reason) +static void panicHandlerForMHD(void* unused, + const char* file, + unsigned int line, + const char* reason) { CLog::Log(LOGSEVERE, "CWebServer: MHD serious error: reason \"%s\" in file \"%s\" at line %ui", reason ? reason : "", file ? file : "", line); @@ -1063,7 +1156,7 @@ static void logFromMHD(void* unused, const char* fmt, va_list ap) } } -bool CWebServer::LoadCert(std::string &skey, std::string &scert) +bool CWebServer::LoadCert(std::string& skey, std::string& scert) { XFILE::CFile file; XFILE::auto_buffer buf; @@ -1106,63 +1199,52 @@ struct MHD_Daemon* CWebServer::StartMHD(unsigned int flags, int port) MHD_set_panic_func(&panicHandlerForMHD, nullptr); - if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_SERVICES_WEBSERVERSSL) && - MHD_is_feature_supported(MHD_FEATURE_SSL) == MHD_YES && - LoadCert(m_key, m_cert)) + if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_SERVICES_WEBSERVERSSL) && + MHD_is_feature_supported(MHD_FEATURE_SSL) == MHD_YES && LoadCert(m_key, m_cert)) // SSL enabled - return MHD_start_daemon(flags | - // one thread per connection - // WARNING: set MHD_OPTION_CONNECTION_TIMEOUT to something higher than 1 - // otherwise on libmicrohttpd 0.4.4-1 it spins a busy loop - MHD_USE_THREAD_PER_CONNECTION + return MHD_start_daemon( + flags | + // one thread per connection + // WARNING: set MHD_OPTION_CONNECTION_TIMEOUT to something higher than 1 + // otherwise on libmicrohttpd 0.4.4-1 it spins a busy loop + MHD_USE_THREAD_PER_CONNECTION #if (MHD_VERSION >= 0x00095207) - | MHD_USE_INTERNAL_POLLING_THREAD /* MHD_USE_THREAD_PER_CONNECTION must be used only with MHD_USE_INTERNAL_POLLING_THREAD since 0.9.54 */ + | + MHD_USE_INTERNAL_POLLING_THREAD /* MHD_USE_THREAD_PER_CONNECTION must be used only with + MHD_USE_INTERNAL_POLLING_THREAD since 0.9.54 */ #endif - | MHD_USE_DEBUG /* Print MHD error messages to log */ - | MHD_USE_SSL - , - port, - 0, - 0, - &CWebServer::AnswerToConnection, - this, - - MHD_OPTION_CONNECTION_LIMIT, 512, - MHD_OPTION_CONNECTION_TIMEOUT, timeout, - MHD_OPTION_URI_LOG_CALLBACK, &CWebServer::UriRequestLogger, this, - MHD_OPTION_EXTERNAL_LOGGER, &logFromMHD, 0, - MHD_OPTION_THREAD_STACK_SIZE, m_thread_stacksize, - MHD_OPTION_HTTPS_MEM_KEY, m_key.c_str(), - MHD_OPTION_HTTPS_MEM_CERT, m_cert.c_str(), - MHD_OPTION_HTTPS_PRIORITIES, ciphers, - MHD_OPTION_END); + | MHD_USE_DEBUG /* Print MHD error messages to log */ + | MHD_USE_SSL, + port, 0, 0, &CWebServer::AnswerToConnection, this, + + MHD_OPTION_CONNECTION_LIMIT, 512, MHD_OPTION_CONNECTION_TIMEOUT, timeout, + MHD_OPTION_URI_LOG_CALLBACK, &CWebServer::UriRequestLogger, this, + MHD_OPTION_EXTERNAL_LOGGER, &logFromMHD, 0, MHD_OPTION_THREAD_STACK_SIZE, + m_thread_stacksize, MHD_OPTION_HTTPS_MEM_KEY, m_key.c_str(), MHD_OPTION_HTTPS_MEM_CERT, + m_cert.c_str(), MHD_OPTION_HTTPS_PRIORITIES, ciphers, MHD_OPTION_END); // No SSL - return MHD_start_daemon(flags | - // one thread per connection - // WARNING: set MHD_OPTION_CONNECTION_TIMEOUT to something higher than 1 - // otherwise on libmicrohttpd 0.4.4-1 it spins a busy loop - MHD_USE_THREAD_PER_CONNECTION + return MHD_start_daemon( + flags | + // one thread per connection + // WARNING: set MHD_OPTION_CONNECTION_TIMEOUT to something higher than 1 + // otherwise on libmicrohttpd 0.4.4-1 it spins a busy loop + MHD_USE_THREAD_PER_CONNECTION #if (MHD_VERSION >= 0x00095207) - | MHD_USE_INTERNAL_POLLING_THREAD /* MHD_USE_THREAD_PER_CONNECTION must be used only with MHD_USE_INTERNAL_POLLING_THREAD since 0.9.54 */ + | MHD_USE_INTERNAL_POLLING_THREAD /* MHD_USE_THREAD_PER_CONNECTION must be used only with + MHD_USE_INTERNAL_POLLING_THREAD since 0.9.54 */ #endif - | MHD_USE_DEBUG /* Print MHD error messages to log */ - , - port, - 0, - 0, - &CWebServer::AnswerToConnection, - this, - - MHD_OPTION_CONNECTION_LIMIT, 512, - MHD_OPTION_CONNECTION_TIMEOUT, timeout, - MHD_OPTION_URI_LOG_CALLBACK, &CWebServer::UriRequestLogger, this, - MHD_OPTION_EXTERNAL_LOGGER, &logFromMHD, 0, - MHD_OPTION_THREAD_STACK_SIZE, m_thread_stacksize, - MHD_OPTION_END); + | MHD_USE_DEBUG /* Print MHD error messages to log */ + , + port, 0, 0, &CWebServer::AnswerToConnection, this, + + MHD_OPTION_CONNECTION_LIMIT, 512, MHD_OPTION_CONNECTION_TIMEOUT, timeout, + MHD_OPTION_URI_LOG_CALLBACK, &CWebServer::UriRequestLogger, this, MHD_OPTION_EXTERNAL_LOGGER, + &logFromMHD, 0, MHD_OPTION_THREAD_STACK_SIZE, m_thread_stacksize, MHD_OPTION_END); } -bool CWebServer::Start(uint16_t port, const std::string &username, const std::string &password) +bool CWebServer::Start(uint16_t port, const std::string& username, const std::string& password) { SetCredentials(username, password); if (!m_running) @@ -1216,7 +1298,7 @@ bool CWebServer::WebServerSupportsSSL() return MHD_is_feature_supported(MHD_FEATURE_SSL) == MHD_YES; } -void CWebServer::SetCredentials(const std::string &username, const std::string &password) +void CWebServer::SetCredentials(const std::string& username, const std::string& password) { CSingleLock lock(m_critSection); @@ -1225,7 +1307,7 @@ void CWebServer::SetCredentials(const std::string &username, const std::string & m_authenticationRequired = !m_authenticationPassword.empty(); } -void CWebServer::RegisterRequestHandler(IHTTPRequestHandler *handler) +void CWebServer::RegisterRequestHandler(IHTTPRequestHandler* handler) { if (handler == nullptr) return; @@ -1236,15 +1318,18 @@ void CWebServer::RegisterRequestHandler(IHTTPRequestHandler *handler) m_requestHandlers.push_back(handler); std::sort(m_requestHandlers.begin(), m_requestHandlers.end(), - [](IHTTPRequestHandler* lhs, IHTTPRequestHandler* rhs) { return rhs->GetPriority() < lhs->GetPriority(); }); + [](IHTTPRequestHandler* lhs, IHTTPRequestHandler* rhs) { + return rhs->GetPriority() < lhs->GetPriority(); + }); } -void CWebServer::UnregisterRequestHandler(IHTTPRequestHandler *handler) +void CWebServer::UnregisterRequestHandler(IHTTPRequestHandler* handler) { if (handler == nullptr) return; - m_requestHandlers.erase(std::remove(m_requestHandlers.begin(), m_requestHandlers.end(), handler), m_requestHandlers.end()); + m_requestHandlers.erase(std::remove(m_requestHandlers.begin(), m_requestHandlers.end(), handler), + m_requestHandlers.end()); } void CWebServer::LogRequest(const HTTPRequest& request) const @@ -1253,9 +1338,11 @@ void CWebServer::LogRequest(const HTTPRequest& request) const return; std::multimap headerValues; - HTTPRequestHandlerUtils::GetRequestHeaderValues(request.connection, MHD_HEADER_KIND, headerValues); + HTTPRequestHandlerUtils::GetRequestHeaderValues(request.connection, MHD_HEADER_KIND, + headerValues); std::multimap getValues; - HTTPRequestHandlerUtils::GetRequestHeaderValues(request.connection, MHD_GET_ARGUMENT_KIND, getValues); + HTTPRequestHandlerUtils::GetRequestHeaderValues(request.connection, MHD_GET_ARGUMENT_KIND, + getValues); CLog::Log(LOGDEBUG, "CWebServer[%hu] [IN] %s %s %s", m_port, request.version.c_str(), GetHTTPMethod(request.method).c_str(), request.pathUrlFull.c_str()); @@ -1278,7 +1365,8 @@ void CWebServer::LogResponse(const HTTPRequest& request, int responseStatus) con return; std::multimap headerValues; - HTTPRequestHandlerUtils::GetRequestHeaderValues(request.connection, MHD_HEADER_KIND, headerValues); + HTTPRequestHandlerUtils::GetRequestHeaderValues(request.connection, MHD_HEADER_KIND, + headerValues); CLog::Log(LOGDEBUG, "CWebServer[%hu] [OUT] %s %d %s", m_port, request.version.c_str(), responseStatus, request.pathUrlFull.c_str()); @@ -1286,7 +1374,7 @@ void CWebServer::LogResponse(const HTTPRequest& request, int responseStatus) con CLog::Log(LOGDEBUG, "CWebServer[%hu] [OUT] %s: %s", m_port, header.first.c_str(), header.second.c_str()); } -std::string CWebServer::CreateMimeTypeFromExtension(const char *ext) +std::string CWebServer::CreateMimeTypeFromExtension(const char* ext) { if (strcmp(ext, ".kar") == 0) return "audio/midi"; @@ -1296,10 +1384,12 @@ std::string CWebServer::CreateMimeTypeFromExtension(const char *ext) return CMime::GetMimeType(ext); } -int CWebServer::AddHeader(struct MHD_Response *response, const std::string &name, const std::string &value) const +MHD_RESULT CWebServer::AddHeader(struct MHD_Response* response, + const std::string& name, + const std::string& value) const { if (response == nullptr || name.empty()) - return 0; + return MHD_NO; CLog::Log(LOGDEBUG, LOGWEBSERVER, "CWebServer[%hu] [OUT] %s: %s", m_port, name.c_str(), value.c_str()); diff --git a/xbmc/network/WebServer.h b/xbmc/network/WebServer.h index c7a9093..1274a2e 100644 --- a/xbmc/network/WebServer.h +++ b/xbmc/network/WebServer.h @@ -56,17 +56,17 @@ protected: virtual void LogRequest(const char* uri) const; - virtual int HandlePartialRequest(struct MHD_Connection *connection, ConnectionHandler* connectionHandler, const HTTPRequest& request, + virtual MHD_RESULT HandlePartialRequest(struct MHD_Connection *connection, ConnectionHandler* connectionHandler, const HTTPRequest& request, const char *upload_data, size_t *upload_data_size, void **con_cls); - virtual int HandleRequest(const std::shared_ptr& handler); - virtual int FinalizeRequest(const std::shared_ptr& handler, int responseStatus, struct MHD_Response *response); + virtual MHD_RESULT HandleRequest(const std::shared_ptr& handler); + virtual MHD_RESULT FinalizeRequest(const std::shared_ptr& handler, int responseStatus, struct MHD_Response *response); private: struct MHD_Daemon* StartMHD(unsigned int flags, int port); std::shared_ptr FindRequestHandler(const HTTPRequest& request) const; - int AskForAuthentication(const HTTPRequest& request) const; + MHD_RESULT AskForAuthentication(const HTTPRequest& request) const; bool IsAuthenticated(const HTTPRequest& request) const; bool IsRequestCacheable(const HTTPRequest& request) const; @@ -76,18 +76,18 @@ private: bool ProcessPostData(const HTTPRequest& request, ConnectionHandler *connectionHandler, const char *upload_data, size_t *upload_data_size, void **con_cls) const; void FinalizePostDataProcessing(ConnectionHandler *connectionHandler) const; - int CreateMemoryDownloadResponse(const std::shared_ptr& handler, struct MHD_Response *&response) const; - int CreateRangedMemoryDownloadResponse(const std::shared_ptr& handler, struct MHD_Response *&response) const; + MHD_RESULT CreateMemoryDownloadResponse(const std::shared_ptr& handler, struct MHD_Response *&response) const; + MHD_RESULT CreateRangedMemoryDownloadResponse(const std::shared_ptr& handler, struct MHD_Response *&response) const; - int CreateRedirect(struct MHD_Connection *connection, const std::string &strURL, struct MHD_Response *&response) const; - int CreateFileDownloadResponse(const std::shared_ptr& handler, struct MHD_Response *&response) const; - int CreateErrorResponse(struct MHD_Connection *connection, int responseType, HTTPMethod method, struct MHD_Response *&response) const; - int CreateMemoryDownloadResponse(struct MHD_Connection *connection, const void *data, size_t size, bool free, bool copy, struct MHD_Response *&response) const; + MHD_RESULT CreateRedirect(struct MHD_Connection *connection, const std::string &strURL, struct MHD_Response *&response) const; + MHD_RESULT CreateFileDownloadResponse(const std::shared_ptr& handler, struct MHD_Response *&response) const; + MHD_RESULT CreateErrorResponse(struct MHD_Connection *connection, int responseType, HTTPMethod method, struct MHD_Response *&response) const; + MHD_RESULT CreateMemoryDownloadResponse(struct MHD_Connection *connection, const void *data, size_t size, bool free, bool copy, struct MHD_Response *&response) const; - int SendResponse(const HTTPRequest& request, int responseStatus, MHD_Response *response) const; - int SendErrorResponse(const HTTPRequest& request, int errorType, HTTPMethod method) const; + MHD_RESULT SendResponse(const HTTPRequest& request, int responseStatus, MHD_Response *response) const; + MHD_RESULT SendErrorResponse(const HTTPRequest& request, int errorType, HTTPMethod method) const; - int AddHeader(struct MHD_Response *response, const std::string &name, const std::string &value) const; + MHD_RESULT AddHeader(struct MHD_Response *response, const std::string &name, const std::string &value) const; void LogRequest(const HTTPRequest& request) const; void LogResponse(const HTTPRequest& request, int responseStatus) const; @@ -100,11 +100,11 @@ private: static ssize_t ContentReaderCallback (void *cls, uint64_t pos, char *buf, size_t max); static void ContentReaderFreeCallback(void *cls); - static int AnswerToConnection (void *cls, struct MHD_Connection *connection, + static MHD_RESULT AnswerToConnection (void *cls, struct MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls); - static int HandlePostField(void *cls, enum MHD_ValueKind kind, const char *key, + static MHD_RESULT HandlePostField(void *cls, enum MHD_ValueKind kind, const char *key, const char *filename, const char *content_type, const char *transfer_encoding, const char *data, uint64_t off, size_t size); diff --git a/xbmc/network/httprequesthandler/HTTPFileHandler.cpp b/xbmc/network/httprequesthandler/HTTPFileHandler.cpp index 2101d49..26e5390 100644 --- a/xbmc/network/httprequesthandler/HTTPFileHandler.cpp +++ b/xbmc/network/httprequesthandler/HTTPFileHandler.cpp @@ -23,7 +23,7 @@ CHTTPFileHandler::CHTTPFileHandler(const HTTPRequest &request) m_lastModified() { } -int CHTTPFileHandler::HandleRequest() +MHD_RESULT CHTTPFileHandler::HandleRequest() { return !m_url.empty() ? MHD_YES : MHD_NO; } diff --git a/xbmc/network/httprequesthandler/HTTPFileHandler.h b/xbmc/network/httprequesthandler/HTTPFileHandler.h index 3c74b52..6121315 100644 --- a/xbmc/network/httprequesthandler/HTTPFileHandler.h +++ b/xbmc/network/httprequesthandler/HTTPFileHandler.h @@ -19,7 +19,7 @@ class CHTTPFileHandler : public IHTTPRequestHandler public: ~CHTTPFileHandler() override = default; - int HandleRequest() override; + MHD_RESULT HandleRequest() override; bool CanHandleRanges() const override { return m_canHandleRanges; } bool CanBeCached() const override { return m_canBeCached; } diff --git a/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.cpp b/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.cpp index de42e7f..6902be0 100644 --- a/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.cpp +++ b/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.cpp @@ -104,7 +104,7 @@ bool CHTTPImageTransformationHandler::CanHandleRequest(const HTTPRequest &reques options.find(TRANSFORMATION_OPTION_HEIGHT) != options.end()); } -int CHTTPImageTransformationHandler::HandleRequest() +MHD_RESULT CHTTPImageTransformationHandler::HandleRequest() { if (m_response.type == HTTPError) return MHD_YES; diff --git a/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.h b/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.h index c55015e..0d17afc 100644 --- a/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.h +++ b/xbmc/network/httprequesthandler/HTTPImageTransformationHandler.h @@ -23,7 +23,7 @@ public: IHTTPRequestHandler* Create(const HTTPRequest &request) const override { return new CHTTPImageTransformationHandler(request); } bool CanHandleRequest(const HTTPRequest &request)const override; - int HandleRequest() override; + MHD_RESULT HandleRequest() override; bool CanHandleRanges() const override { return true; } bool CanBeCached() const override { return true; } diff --git a/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp b/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp index e8e2fa3..a4c3c19 100644 --- a/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp +++ b/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.cpp @@ -25,7 +25,7 @@ bool CHTTPJsonRpcHandler::CanHandleRequest(const HTTPRequest &request) const return (request.pathUrl.compare("/jsonrpc") == 0); } -int CHTTPJsonRpcHandler::HandleRequest() +MHD_RESULT CHTTPJsonRpcHandler::HandleRequest() { CHTTPClient client(m_request.method); bool isRequest = false; diff --git a/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.h b/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.h index 67c14b6..2659fd5 100644 --- a/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.h +++ b/xbmc/network/httprequesthandler/HTTPJsonRpcHandler.h @@ -24,7 +24,7 @@ public: IHTTPRequestHandler* Create(const HTTPRequest &request) const override { return new CHTTPJsonRpcHandler(request); } bool CanHandleRequest(const HTTPRequest &request) const override; - int HandleRequest() override; + MHD_RESULT HandleRequest() override; HttpResponseRanges GetResponseData() const override; diff --git a/xbmc/network/httprequesthandler/HTTPPythonHandler.cpp b/xbmc/network/httprequesthandler/HTTPPythonHandler.cpp index 5f9aeef..a07ef0d 100644 --- a/xbmc/network/httprequesthandler/HTTPPythonHandler.cpp +++ b/xbmc/network/httprequesthandler/HTTPPythonHandler.cpp @@ -112,7 +112,7 @@ bool CHTTPPythonHandler::CanHandleRequest(const HTTPRequest &request) const return true; } -int CHTTPPythonHandler::HandleRequest() +MHD_RESULT CHTTPPythonHandler::HandleRequest() { if (m_response.type == HTTPError || m_response.type == HTTPRedirect) return MHD_YES; diff --git a/xbmc/network/httprequesthandler/HTTPPythonHandler.h b/xbmc/network/httprequesthandler/HTTPPythonHandler.h index 03c1506..166430e 100644 --- a/xbmc/network/httprequesthandler/HTTPPythonHandler.h +++ b/xbmc/network/httprequesthandler/HTTPPythonHandler.h @@ -25,7 +25,7 @@ public: bool CanBeCached() const override { return false; } bool GetLastModifiedDate(CDateTime &lastModified) const override; - int HandleRequest() override; + MHD_RESULT HandleRequest() override; HttpResponseRanges GetResponseData() const override { return m_responseRanges; } diff --git a/xbmc/network/httprequesthandler/HTTPRequestHandlerUtils.cpp b/xbmc/network/httprequesthandler/HTTPRequestHandlerUtils.cpp index 80d1d67..f2ea1f2 100644 --- a/xbmc/network/httprequesthandler/HTTPRequestHandlerUtils.cpp +++ b/xbmc/network/httprequesthandler/HTTPRequestHandlerUtils.cpp @@ -61,7 +61,7 @@ bool HTTPRequestHandlerUtils::GetRequestedRanges(struct MHD_Connection *connecti return ranges.Parse(GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_RANGE), totalLength); } -int HTTPRequestHandlerUtils::FillArgumentMap(void *cls, enum MHD_ValueKind kind, const char *key, const char *value) +MHD_RESULT HTTPRequestHandlerUtils::FillArgumentMap(void *cls, enum MHD_ValueKind kind, const char *key, const char *value) { if (cls == nullptr || key == nullptr) return MHD_NO; @@ -72,7 +72,7 @@ int HTTPRequestHandlerUtils::FillArgumentMap(void *cls, enum MHD_ValueKind kind, return MHD_YES; } -int HTTPRequestHandlerUtils::FillArgumentMultiMap(void *cls, enum MHD_ValueKind kind, const char *key, const char *value) +MHD_RESULT HTTPRequestHandlerUtils::FillArgumentMultiMap(void *cls, enum MHD_ValueKind kind, const char *key, const char *value) { if (cls == nullptr || key == nullptr) return MHD_NO; diff --git a/xbmc/network/httprequesthandler/HTTPRequestHandlerUtils.h b/xbmc/network/httprequesthandler/HTTPRequestHandlerUtils.h index 9a07801..0ec5ed1 100644 --- a/xbmc/network/httprequesthandler/HTTPRequestHandlerUtils.h +++ b/xbmc/network/httprequesthandler/HTTPRequestHandlerUtils.h @@ -25,6 +25,6 @@ public: private: HTTPRequestHandlerUtils() = delete; - static int FillArgumentMap(void *cls, enum MHD_ValueKind kind, const char *key, const char *value); - static int FillArgumentMultiMap(void *cls, enum MHD_ValueKind kind, const char *key, const char *value); + static MHD_RESULT FillArgumentMap(void *cls, enum MHD_ValueKind kind, const char *key, const char *value); + static MHD_RESULT FillArgumentMultiMap(void *cls, enum MHD_ValueKind kind, const char *key, const char *value); }; diff --git a/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.cpp b/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.cpp index 01a6b50..0716a5d 100644 --- a/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.cpp +++ b/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.cpp @@ -18,7 +18,7 @@ bool CHTTPWebinterfaceAddonsHandler::CanHandleRequest(const HTTPRequest &request return (request.pathUrl.compare("/addons") == 0 || request.pathUrl.compare("/addons/") == 0); } -int CHTTPWebinterfaceAddonsHandler::HandleRequest() +MHD_RESULT CHTTPWebinterfaceAddonsHandler::HandleRequest() { m_responseData = ADDON_HEADER; ADDON::VECADDONS addons; diff --git a/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.h b/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.h index e9b1c6d..23cea36 100644 --- a/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.h +++ b/xbmc/network/httprequesthandler/HTTPWebinterfaceAddonsHandler.h @@ -21,7 +21,7 @@ public: IHTTPRequestHandler* Create(const HTTPRequest &request) const override { return new CHTTPWebinterfaceAddonsHandler(request); } bool CanHandleRequest(const HTTPRequest &request) const override; - int HandleRequest() override; + MHD_RESULT HandleRequest() override; HttpResponseRanges GetResponseData() const override; diff --git a/xbmc/network/httprequesthandler/IHTTPRequestHandler.h b/xbmc/network/httprequesthandler/IHTTPRequestHandler.h index 4b1e40a..8f605ad 100644 --- a/xbmc/network/httprequesthandler/IHTTPRequestHandler.h +++ b/xbmc/network/httprequesthandler/IHTTPRequestHandler.h @@ -22,6 +22,12 @@ #include "utils/HttpRangeUtils.h" +#if MHD_VERSION >= 0x00097002 +#define MHD_RESULT enum MHD_Result +#else +#define MHD_RESULT int +#endif + class CDateTime; class CWebServer; @@ -114,7 +120,7 @@ public: * * \return MHD_NO if a severe error has occurred otherwise MHD_YES. */ - virtual int HandleRequest() = 0; + virtual MHD_RESULT HandleRequest() = 0; /*! * \brief Whether the HTTP response could also be provided in ranges.