From 14d0ec933526c696eb6c91b9e9727be18f82721d Mon Sep 17 00:00:00 2001 From: akallabeth Date: Fri, 21 Jul 2023 14:12:53 +0200 Subject: [PATCH] [core] move http status to string to utils freerdp_http_status_string and freerdp_http_status_string_format are now exposed as public API functions to work with http status codes --- include/freerdp/utils/http.h | 47 ++++++++++++++ libfreerdp/core/gateway/arm.c | 2 +- libfreerdp/core/gateway/http.c | 96 ---------------------------- libfreerdp/core/gateway/http.h | 56 +--------------- libfreerdp/core/gateway/rdg.c | 6 +- libfreerdp/core/gateway/rpc_client.c | 2 +- libfreerdp/core/gateway/wst.c | 4 +- libfreerdp/utils/http.c | 96 ++++++++++++++++++++++++++++ 8 files changed, 151 insertions(+), 158 deletions(-) diff --git a/include/freerdp/utils/http.h b/include/freerdp/utils/http.h index 03b7561fb..9719402df 100644 --- a/include/freerdp/utils/http.h +++ b/include/freerdp/utils/http.h @@ -22,7 +22,54 @@ #include +typedef enum +{ + HTTP_STATUS_CONTINUE = 100, + HTTP_STATUS_SWITCH_PROTOCOLS = 101, + HTTP_STATUS_OK = 200, + HTTP_STATUS_CREATED = 201, + HTTP_STATUS_ACCEPTED = 202, + HTTP_STATUS_PARTIAL = 203, + HTTP_STATUS_NO_CONTENT = 204, + HTTP_STATUS_RESET_CONTENT = 205, + HTTP_STATUS_PARTIAL_CONTENT = 206, + HTTP_STATUS_WEBDAV_MULTI_STATUS = 207, + HTTP_STATUS_AMBIGUOUS = 300, + HTTP_STATUS_MOVED = 301, + HTTP_STATUS_REDIRECT = 302, + HTTP_STATUS_REDIRECT_METHOD = 303, + HTTP_STATUS_NOT_MODIFIED = 304, + HTTP_STATUS_USE_PROXY = 305, + HTTP_STATUS_REDIRECT_KEEP_VERB = 307, + HTTP_STATUS_BAD_REQUEST = 400, + HTTP_STATUS_DENIED = 401, + HTTP_STATUS_PAYMENT_REQ = 402, + HTTP_STATUS_FORBIDDEN = 403, + HTTP_STATUS_NOT_FOUND = 404, + HTTP_STATUS_BAD_METHOD = 405, + HTTP_STATUS_NONE_ACCEPTABLE = 406, + HTTP_STATUS_PROXY_AUTH_REQ = 407, + HTTP_STATUS_REQUEST_TIMEOUT = 408, + HTTP_STATUS_CONFLICT = 409, + HTTP_STATUS_GONE = 410, + HTTP_STATUS_LENGTH_REQUIRED = 411, + HTTP_STATUS_PRECOND_FAILED = 412, + HTTP_STATUS_REQUEST_TOO_LARGE = 413, + HTTP_STATUS_URI_TOO_LONG = 414, + HTTP_STATUS_UNSUPPORTED_MEDIA = 415, + HTTP_STATUS_RETRY_WITH = 449, + HTTP_STATUS_SERVER_ERROR = 500, + HTTP_STATUS_NOT_SUPPORTED = 501, + HTTP_STATUS_BAD_GATEWAY = 502, + HTTP_STATUS_SERVICE_UNAVAIL = 503, + HTTP_STATUS_GATEWAY_TIMEOUT = 504, + HTTP_STATUS_VERSION_NOT_SUP = 505 +} FREERDP_HTTP_STATUS; + FREERDP_API BOOL freerdp_http_request(const char* url, const char* body, long* status_code, BYTE** response, size_t* response_length); +FREERDP_API const char* freerdp_http_status_string(long status); +FREERDP_API char* freerdp_http_status_string_format(long status, char* buffer, size_t size); + #endif /* FREERDP_UTILS_HTTP_H */ diff --git a/libfreerdp/core/gateway/arm.c b/libfreerdp/core/gateway/arm.c index bb23d7a90..05459c713 100644 --- a/libfreerdp/core/gateway/arm.c +++ b/libfreerdp/core/gateway/arm.c @@ -424,7 +424,7 @@ BOOL arm_resolve_endpoint(rdpContext* context, DWORD timeout) { char buffer[64] = { 0 }; WLog_ERR(TAG, "Unexpected HTTP status: %s", - http_status_string_format(StatusCode, buffer, ARRAYSIZE(buffer))); + freerdp_http_status_string_format(StatusCode, buffer, ARRAYSIZE(buffer))); goto arm_error; } diff --git a/libfreerdp/core/gateway/http.c b/libfreerdp/core/gateway/http.c index 627eeedba..7ba8dda33 100644 --- a/libfreerdp/core/gateway/http.c +++ b/libfreerdp/core/gateway/http.c @@ -1532,99 +1532,3 @@ out: free(base64accept); return isWebsocket; } - -const char* http_status_string(long status) -{ - switch (status) - { - case HTTP_STATUS_CONTINUE: - return "HTTP_STATUS_CONTINUE"; - case HTTP_STATUS_SWITCH_PROTOCOLS: - return "HTTP_STATUS_SWITCH_PROTOCOLS"; - case HTTP_STATUS_OK: - return "HTTP_STATUS_OK"; - case HTTP_STATUS_CREATED: - return "HTTP_STATUS_CREATED"; - case HTTP_STATUS_ACCEPTED: - return "HTTP_STATUS_ACCEPTED"; - case HTTP_STATUS_PARTIAL: - return "HTTP_STATUS_PARTIAL"; - case HTTP_STATUS_NO_CONTENT: - return "HTTP_STATUS_NO_CONTENT"; - case HTTP_STATUS_RESET_CONTENT: - return "HTTP_STATUS_RESET_CONTENT"; - case HTTP_STATUS_PARTIAL_CONTENT: - return "HTTP_STATUS_PARTIAL_CONTENT"; - case HTTP_STATUS_WEBDAV_MULTI_STATUS: - return "HTTP_STATUS_WEBDAV_MULTI_STATUS"; - case HTTP_STATUS_AMBIGUOUS: - return "HTTP_STATUS_AMBIGUOUS"; - case HTTP_STATUS_MOVED: - return "HTTP_STATUS_MOVED"; - case HTTP_STATUS_REDIRECT: - return "HTTP_STATUS_REDIRECT"; - case HTTP_STATUS_REDIRECT_METHOD: - return "HTTP_STATUS_REDIRECT_METHOD"; - case HTTP_STATUS_NOT_MODIFIED: - return "HTTP_STATUS_NOT_MODIFIED"; - case HTTP_STATUS_USE_PROXY: - return "HTTP_STATUS_USE_PROXY"; - case HTTP_STATUS_REDIRECT_KEEP_VERB: - return "HTTP_STATUS_REDIRECT_KEEP_VERB"; - case HTTP_STATUS_BAD_REQUEST: - return "HTTP_STATUS_BAD_REQUEST"; - case HTTP_STATUS_DENIED: - return "HTTP_STATUS_DENIED"; - case HTTP_STATUS_PAYMENT_REQ: - return "HTTP_STATUS_PAYMENT_REQ"; - case HTTP_STATUS_FORBIDDEN: - return "HTTP_STATUS_FORBIDDEN"; - case HTTP_STATUS_NOT_FOUND: - return "HTTP_STATUS_NOT_FOUND"; - case HTTP_STATUS_BAD_METHOD: - return "HTTP_STATUS_BAD_METHOD"; - case HTTP_STATUS_NONE_ACCEPTABLE: - return "HTTP_STATUS_NONE_ACCEPTABLE"; - case HTTP_STATUS_PROXY_AUTH_REQ: - return "HTTP_STATUS_PROXY_AUTH_REQ"; - case HTTP_STATUS_REQUEST_TIMEOUT: - return "HTTP_STATUS_REQUEST_TIMEOUT"; - case HTTP_STATUS_CONFLICT: - return "HTTP_STATUS_CONFLICT"; - case HTTP_STATUS_GONE: - return "HTTP_STATUS_GONE"; - case HTTP_STATUS_LENGTH_REQUIRED: - return "HTTP_STATUS_LENGTH_REQUIRED"; - case HTTP_STATUS_PRECOND_FAILED: - return "HTTP_STATUS_PRECOND_FAILED"; - case HTTP_STATUS_REQUEST_TOO_LARGE: - return "HTTP_STATUS_REQUEST_TOO_LARGE"; - case HTTP_STATUS_URI_TOO_LONG: - return "HTTP_STATUS_URI_TOO_LONG"; - case HTTP_STATUS_UNSUPPORTED_MEDIA: - return "HTTP_STATUS_UNSUPPORTED_MEDIA"; - case HTTP_STATUS_RETRY_WITH: - return "HTTP_STATUS_RETRY_WITH"; - case HTTP_STATUS_SERVER_ERROR: - return "HTTP_STATUS_SERVER_ERROR"; - case HTTP_STATUS_NOT_SUPPORTED: - return "HTTP_STATUS_NOT_SUPPORTED"; - case HTTP_STATUS_BAD_GATEWAY: - return "HTTP_STATUS_BAD_GATEWAY"; - case HTTP_STATUS_SERVICE_UNAVAIL: - return "HTTP_STATUS_SERVICE_UNAVAIL"; - case HTTP_STATUS_GATEWAY_TIMEOUT: - return "HTTP_STATUS_GATEWAY_TIMEOUT"; - case HTTP_STATUS_VERSION_NOT_SUP: - return "HTTP_STATUS_VERSION_NOT_SUP"; - default: - return "HTTP_STATUS_UNKNOWN"; - } -} - -char* http_status_string_format(long status, char* buffer, size_t size) -{ - const char* code = http_status_string(status); - _snprintf(buffer, size, "%s [%ld]", code, status); - return buffer; -} diff --git a/libfreerdp/core/gateway/http.h b/libfreerdp/core/gateway/http.h index 43f36252c..64180cf69 100644 --- a/libfreerdp/core/gateway/http.h +++ b/libfreerdp/core/gateway/http.h @@ -23,61 +23,10 @@ #include #include +#include #include "../../crypto/tls.h" -typedef enum -{ - HTTP_STATUS_CONTINUE = 100, - HTTP_STATUS_SWITCH_PROTOCOLS = 101 - - , - HTTP_STATUS_OK = 200, - HTTP_STATUS_CREATED = 201, - HTTP_STATUS_ACCEPTED = 202, - HTTP_STATUS_PARTIAL = 203, - HTTP_STATUS_NO_CONTENT = 204, - HTTP_STATUS_RESET_CONTENT = 205, - HTTP_STATUS_PARTIAL_CONTENT = 206, - HTTP_STATUS_WEBDAV_MULTI_STATUS = 207 - - , - HTTP_STATUS_AMBIGUOUS = 300, - HTTP_STATUS_MOVED = 301, - HTTP_STATUS_REDIRECT = 302, - HTTP_STATUS_REDIRECT_METHOD = 303, - HTTP_STATUS_NOT_MODIFIED = 304, - HTTP_STATUS_USE_PROXY = 305, - HTTP_STATUS_REDIRECT_KEEP_VERB = 307 - - , - HTTP_STATUS_BAD_REQUEST = 400, - HTTP_STATUS_DENIED = 401, - HTTP_STATUS_PAYMENT_REQ = 402, - HTTP_STATUS_FORBIDDEN = 403, - HTTP_STATUS_NOT_FOUND = 404, - HTTP_STATUS_BAD_METHOD = 405, - HTTP_STATUS_NONE_ACCEPTABLE = 406, - HTTP_STATUS_PROXY_AUTH_REQ = 407, - HTTP_STATUS_REQUEST_TIMEOUT = 408, - HTTP_STATUS_CONFLICT = 409, - HTTP_STATUS_GONE = 410, - HTTP_STATUS_LENGTH_REQUIRED = 411, - HTTP_STATUS_PRECOND_FAILED = 412, - HTTP_STATUS_REQUEST_TOO_LARGE = 413, - HTTP_STATUS_URI_TOO_LONG = 414, - HTTP_STATUS_UNSUPPORTED_MEDIA = 415, - HTTP_STATUS_RETRY_WITH = 449 - - , - HTTP_STATUS_SERVER_ERROR = 500, - HTTP_STATUS_NOT_SUPPORTED = 501, - HTTP_STATUS_BAD_GATEWAY = 502, - HTTP_STATUS_SERVICE_UNAVAIL = 503, - HTTP_STATUS_GATEWAY_TIMEOUT = 504, - HTTP_STATUS_VERSION_NOT_SUP = 505 -} HTTP_STATUS; - typedef enum { TransferEncodingUnknown, @@ -163,9 +112,6 @@ FREERDP_LOCAL const char* http_response_get_setcookie(HttpResponse* response, co FREERDP_LOCAL TRANSFER_ENCODING http_response_get_transfer_encoding(HttpResponse* response); FREERDP_LOCAL BOOL http_response_is_websocket(HttpContext* http, HttpResponse* response); -FREERDP_LOCAL const char* http_status_string(long status); -FREERDP_LOCAL char* http_status_string_format(long status, char* buffer, size_t size); - /* chunked read helper */ FREERDP_LOCAL int http_chuncked_read(BIO* bio, BYTE* pBuffer, size_t size, http_encoding_chunked_context* encodingContext); diff --git a/libfreerdp/core/gateway/rdg.c b/libfreerdp/core/gateway/rdg.c index c9bfb39f2..df7606133 100644 --- a/libfreerdp/core/gateway/rdg.c +++ b/libfreerdp/core/gateway/rdg.c @@ -721,7 +721,7 @@ static BOOL rdg_recv_auth_token(rdpCredsspAuth* auth, HttpResponse* response) break; default: WLog_WARN(TAG, "Unexpected HTTP status: %s", - http_status_string_format(StatusCode, buffer, ARRAYSIZE(buffer))); + freerdp_http_status_string_format(StatusCode, buffer, ARRAYSIZE(buffer))); return FALSE; } @@ -1397,7 +1397,7 @@ static BOOL rdg_establish_data_connection(rdpRdg* rdg, rdpTls* tls, const char* isWebsocket = http_response_is_websocket(rdg->http, response); http_response_free(response); WLog_DBG(TAG, "%s authorization result: %s", method, - http_status_string_format(statusCode, buffer, ARRAYSIZE(buffer))); + freerdp_http_status_string_format(statusCode, buffer, ARRAYSIZE(buffer))); switch (statusCode) { @@ -1440,7 +1440,7 @@ static BOOL rdg_establish_data_connection(rdpRdg* rdg, rdpTls* tls, const char* return TRUE; default: WLog_WARN(TAG, "Unexpected HTTP status %s", - http_status_string_format(statusCode, buffer, ARRAYSIZE(buffer))); + freerdp_http_status_string_format(statusCode, buffer, ARRAYSIZE(buffer))); return FALSE; } diff --git a/libfreerdp/core/gateway/rpc_client.c b/libfreerdp/core/gateway/rpc_client.c index 0c7e7e592..c62d3ffba 100644 --- a/libfreerdp/core/gateway/rpc_client.c +++ b/libfreerdp/core/gateway/rpc_client.c @@ -605,7 +605,7 @@ static SSIZE_T rpc_client_default_out_channel_recv(rdpRpc* rpc) char buffer[64] = { 0 }; WLog_ERR(TAG, "error! Status Code: %s", - http_status_string_format(statusCode, buffer, ARRAYSIZE(buffer))); + freerdp_http_status_string_format(statusCode, buffer, ARRAYSIZE(buffer))); http_response_print(response); if (statusCode == HTTP_STATUS_DENIED) diff --git a/libfreerdp/core/gateway/wst.c b/libfreerdp/core/gateway/wst.c index 4726b8493..0218eeafe 100644 --- a/libfreerdp/core/gateway/wst.c +++ b/libfreerdp/core/gateway/wst.c @@ -180,7 +180,7 @@ static BOOL wst_recv_auth_token(rdpCredsspAuth* auth, HttpResponse* response) break; default: WLog_WARN(TAG, "Unexpected HTTP status: %s", - http_status_string_format(StatusCode, buffer, ARRAYSIZE(buffer))); + freerdp_http_status_string_format(StatusCode, buffer, ARRAYSIZE(buffer))); return FALSE; } @@ -500,7 +500,7 @@ BOOL wst_connect(rdpWst* wst, DWORD timeout) { char buffer[64] = { 0 }; WLog_ERR(TAG, "Unexpected HTTP status: %s", - http_status_string_format(StatusCode, buffer, ARRAYSIZE(buffer))); + freerdp_http_status_string_format(StatusCode, buffer, ARRAYSIZE(buffer))); } return FALSE; } diff --git a/libfreerdp/utils/http.c b/libfreerdp/utils/http.c index d2f242ce9..17da15af4 100644 --- a/libfreerdp/utils/http.c +++ b/libfreerdp/utils/http.c @@ -268,3 +268,99 @@ out: SSL_CTX_free(ssl_ctx); return ret; } + +const char* freerdp_http_status_string(long status) +{ + switch (status) + { + case HTTP_STATUS_CONTINUE: + return "HTTP_STATUS_CONTINUE"; + case HTTP_STATUS_SWITCH_PROTOCOLS: + return "HTTP_STATUS_SWITCH_PROTOCOLS"; + case HTTP_STATUS_OK: + return "HTTP_STATUS_OK"; + case HTTP_STATUS_CREATED: + return "HTTP_STATUS_CREATED"; + case HTTP_STATUS_ACCEPTED: + return "HTTP_STATUS_ACCEPTED"; + case HTTP_STATUS_PARTIAL: + return "HTTP_STATUS_PARTIAL"; + case HTTP_STATUS_NO_CONTENT: + return "HTTP_STATUS_NO_CONTENT"; + case HTTP_STATUS_RESET_CONTENT: + return "HTTP_STATUS_RESET_CONTENT"; + case HTTP_STATUS_PARTIAL_CONTENT: + return "HTTP_STATUS_PARTIAL_CONTENT"; + case HTTP_STATUS_WEBDAV_MULTI_STATUS: + return "HTTP_STATUS_WEBDAV_MULTI_STATUS"; + case HTTP_STATUS_AMBIGUOUS: + return "HTTP_STATUS_AMBIGUOUS"; + case HTTP_STATUS_MOVED: + return "HTTP_STATUS_MOVED"; + case HTTP_STATUS_REDIRECT: + return "HTTP_STATUS_REDIRECT"; + case HTTP_STATUS_REDIRECT_METHOD: + return "HTTP_STATUS_REDIRECT_METHOD"; + case HTTP_STATUS_NOT_MODIFIED: + return "HTTP_STATUS_NOT_MODIFIED"; + case HTTP_STATUS_USE_PROXY: + return "HTTP_STATUS_USE_PROXY"; + case HTTP_STATUS_REDIRECT_KEEP_VERB: + return "HTTP_STATUS_REDIRECT_KEEP_VERB"; + case HTTP_STATUS_BAD_REQUEST: + return "HTTP_STATUS_BAD_REQUEST"; + case HTTP_STATUS_DENIED: + return "HTTP_STATUS_DENIED"; + case HTTP_STATUS_PAYMENT_REQ: + return "HTTP_STATUS_PAYMENT_REQ"; + case HTTP_STATUS_FORBIDDEN: + return "HTTP_STATUS_FORBIDDEN"; + case HTTP_STATUS_NOT_FOUND: + return "HTTP_STATUS_NOT_FOUND"; + case HTTP_STATUS_BAD_METHOD: + return "HTTP_STATUS_BAD_METHOD"; + case HTTP_STATUS_NONE_ACCEPTABLE: + return "HTTP_STATUS_NONE_ACCEPTABLE"; + case HTTP_STATUS_PROXY_AUTH_REQ: + return "HTTP_STATUS_PROXY_AUTH_REQ"; + case HTTP_STATUS_REQUEST_TIMEOUT: + return "HTTP_STATUS_REQUEST_TIMEOUT"; + case HTTP_STATUS_CONFLICT: + return "HTTP_STATUS_CONFLICT"; + case HTTP_STATUS_GONE: + return "HTTP_STATUS_GONE"; + case HTTP_STATUS_LENGTH_REQUIRED: + return "HTTP_STATUS_LENGTH_REQUIRED"; + case HTTP_STATUS_PRECOND_FAILED: + return "HTTP_STATUS_PRECOND_FAILED"; + case HTTP_STATUS_REQUEST_TOO_LARGE: + return "HTTP_STATUS_REQUEST_TOO_LARGE"; + case HTTP_STATUS_URI_TOO_LONG: + return "HTTP_STATUS_URI_TOO_LONG"; + case HTTP_STATUS_UNSUPPORTED_MEDIA: + return "HTTP_STATUS_UNSUPPORTED_MEDIA"; + case HTTP_STATUS_RETRY_WITH: + return "HTTP_STATUS_RETRY_WITH"; + case HTTP_STATUS_SERVER_ERROR: + return "HTTP_STATUS_SERVER_ERROR"; + case HTTP_STATUS_NOT_SUPPORTED: + return "HTTP_STATUS_NOT_SUPPORTED"; + case HTTP_STATUS_BAD_GATEWAY: + return "HTTP_STATUS_BAD_GATEWAY"; + case HTTP_STATUS_SERVICE_UNAVAIL: + return "HTTP_STATUS_SERVICE_UNAVAIL"; + case HTTP_STATUS_GATEWAY_TIMEOUT: + return "HTTP_STATUS_GATEWAY_TIMEOUT"; + case HTTP_STATUS_VERSION_NOT_SUP: + return "HTTP_STATUS_VERSION_NOT_SUP"; + default: + return "HTTP_STATUS_UNKNOWN"; + } +} + +char* freerdp_http_status_string_format(long status, char* buffer, size_t size) +{ + const char* code = freerdp_http_status_string(status); + _snprintf(buffer, size, "%s [%ld]", code, status); + return buffer; +}