From 1548fe5c98d2d8035f578c5fb65644e1c4211c8c Mon Sep 17 00:00:00 2001 From: Fred Gylys-Colwell Date: Wed, 20 Sep 2023 15:11:14 -0700 Subject: [PATCH] Fix url parsing in test code Bug: 300696974 Change-Id: Ic9a158ed0c2e7434d3a4b669a7d301999f29449e --- libwvdrmengine/cdm/core/test/http_socket.cpp | 41 ++++++++++++++------ libwvdrmengine/cdm/core/test/http_socket.h | 5 +-- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/libwvdrmengine/cdm/core/test/http_socket.cpp b/libwvdrmengine/cdm/core/test/http_socket.cpp index 51d0436d..f1a8649e 100644 --- a/libwvdrmengine/cdm/core/test/http_socket.cpp +++ b/libwvdrmengine/cdm/core/test/http_socket.cpp @@ -165,12 +165,25 @@ bool HttpSocket::ParseUrl(const std::string& url, std::string* scheme, return false; } + // Strip off the domain name and port. In the url it will be terminated by + // either a splash or a question mark: + // like this example.com?key=value + // or this example.com/path/to/resource if (!Tokenize(url, "/", offset, domain_name, &offset)) { - // The rest of the URL belongs to the domain name. - domain_name->assign(url, offset, std::string::npos); - // No explicit path after the domain name. - path->assign("/"); + if (Tokenize(url, "?", offset, domain_name, &offset)) { + // url had no '/', but it did have '?'. Use the default path but + // keep the extra parameters. i.e. turn '?extra' into '/?extra'. + path->assign("/"); + path->append(url, offset - 1, std::string::npos); + } else { + // url had no '/' or '?'. + // The rest of the URL belongs to the domain name. + domain_name->assign(url, offset, std::string::npos); + // Use the default path. + path->assign("/"); + } } else { + // url had a '/'. // The rest of the URL, including the preceding slash, belongs to the path. path->assign(url, offset - 1, std::string::npos); } @@ -192,7 +205,7 @@ bool HttpSocket::ParseUrl(const std::string& url, std::string* scheme, } HttpSocket::HttpSocket(const std::string& url) - : socket_fd_(-1), ssl_(nullptr), ssl_ctx_(nullptr) { + : url_(url), socket_fd_(-1), ssl_(nullptr), ssl_ctx_(nullptr) { valid_url_ = ParseUrl(url, &scheme_, &secure_connect_, &domain_name_, &port_, &resource_path_); create_time_ = @@ -280,10 +293,12 @@ bool HttpSocket::Connect(int timeout_in_ms) { if (ret == EAI_SYSTEM) { // EAI_SYSTEM implies an underlying system issue. Error is // specified by |errno|. - LOGE("getaddrinfo failed due to system error: errno = %d", GetError()); + LOGE("getaddrinfo %s (port %s) failed due to system error: errno = %d", + domain_name_.c_str(), port_.c_str(), GetError()); } else { // Error is specified by return value. - LOGE("getaddrinfo failed: ret = %d", ret); + LOGE("getaddrinfo %s (port %s) failed: ret = %d", domain_name_.c_str(), + port_.c_str(), ret); } return false; } @@ -292,7 +307,8 @@ bool HttpSocket::Connect(int timeout_in_ms) { socket_fd_ = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); if (socket_fd_ < 0) { - LOGE("Cannot open socket: errno = %d", GetError()); + LOGE("Cannot open socket %s (port %s): errno = %d", domain_name_.c_str(), + port_.c_str(), GetError()); return false; } @@ -300,19 +316,22 @@ bool HttpSocket::Connect(int timeout_in_ms) { #ifdef _WIN32 u_long mode = 1; // Non-blocking mode. if (ioctlsocket(socket_fd_, FIONBIO, &mode) != 0) { - LOGE("ioctlsocket error, wsa error = %d", WSAGetLastError()); + LOGE("ioctlsocket error %s (port %s), wsa error = %d", domain_name_.c_str(), + port_.c_str(), WSAGetLastError()); CloseSocket(); return false; } #else const int original_flags = fcntl(socket_fd_, F_GETFL, 0); if (original_flags == -1) { - LOGE("fcntl error, errno = %d", errno); + LOGE("fcntl error %s (port %s), errno = %d", domain_name_.c_str(), + port_.c_str(), errno); CloseSocket(); return false; } if (fcntl(socket_fd_, F_SETFL, original_flags | O_NONBLOCK) == -1) { - LOGE("fcntl error, errno = %d", errno); + LOGE("fcntl error %s (port %s), errno = %d", domain_name_.c_str(), + port_.c_str(), errno); CloseSocket(); return false; } diff --git a/libwvdrmengine/cdm/core/test/http_socket.h b/libwvdrmengine/cdm/core/test/http_socket.h index ae5761d6..72c5f0f9 100644 --- a/libwvdrmengine/cdm/core/test/http_socket.h +++ b/libwvdrmengine/cdm/core/test/http_socket.h @@ -32,9 +32,7 @@ class HttpSocket { const std::string& domain_name() const { return domain_name_; } int port() const { return atoi(port_.c_str()); } const std::string& resource_path() const { return resource_path_; } - std::string url() const { - return scheme_ + "://" + domain_name_ + ":" + port_ + resource_path_; - } + const std::string& url() const { return url_; } int ReadAndLogErrors(char* data, int len, int timeout_in_ms); int WriteAndLogErrors(const char* data, int len, int timeout_in_ms); @@ -57,6 +55,7 @@ class HttpSocket { bool Wait(bool for_read, int timeout_in_ms); FRIEND_TEST(HttpSocketTest, ParseUrlTest); + std::string url_; std::string scheme_; bool secure_connect_; std::string domain_name_;