Fix url parsing in test code
Bug: 300696974 Change-Id: Ic9a158ed0c2e7434d3a4b669a7d301999f29449e
This commit is contained in:
committed by
Robert Shih
parent
386ca20974
commit
1548fe5c98
@@ -165,12 +165,25 @@ bool HttpSocket::ParseUrl(const std::string& url, std::string* scheme,
|
|||||||
return false;
|
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)) {
|
if (!Tokenize(url, "/", offset, domain_name, &offset)) {
|
||||||
// The rest of the URL belongs to the domain name.
|
if (Tokenize(url, "?", offset, domain_name, &offset)) {
|
||||||
domain_name->assign(url, offset, std::string::npos);
|
// url had no '/', but it did have '?'. Use the default path but
|
||||||
// No explicit path after the domain name.
|
// keep the extra parameters. i.e. turn '?extra' into '/?extra'.
|
||||||
path->assign("/");
|
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 {
|
} else {
|
||||||
|
// url had a '/'.
|
||||||
// The rest of the URL, including the preceding slash, belongs to the path.
|
// The rest of the URL, including the preceding slash, belongs to the path.
|
||||||
path->assign(url, offset - 1, std::string::npos);
|
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)
|
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_,
|
valid_url_ = ParseUrl(url, &scheme_, &secure_connect_, &domain_name_, &port_,
|
||||||
&resource_path_);
|
&resource_path_);
|
||||||
create_time_ =
|
create_time_ =
|
||||||
@@ -280,10 +293,12 @@ bool HttpSocket::Connect(int timeout_in_ms) {
|
|||||||
if (ret == EAI_SYSTEM) {
|
if (ret == EAI_SYSTEM) {
|
||||||
// EAI_SYSTEM implies an underlying system issue. Error is
|
// EAI_SYSTEM implies an underlying system issue. Error is
|
||||||
// specified by |errno|.
|
// 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 {
|
} else {
|
||||||
// Error is specified by return value.
|
// 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;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -292,7 +307,8 @@ bool HttpSocket::Connect(int timeout_in_ms) {
|
|||||||
socket_fd_ = socket(addr_info->ai_family, addr_info->ai_socktype,
|
socket_fd_ = socket(addr_info->ai_family, addr_info->ai_socktype,
|
||||||
addr_info->ai_protocol);
|
addr_info->ai_protocol);
|
||||||
if (socket_fd_ < 0) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,19 +316,22 @@ bool HttpSocket::Connect(int timeout_in_ms) {
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
u_long mode = 1; // Non-blocking mode.
|
u_long mode = 1; // Non-blocking mode.
|
||||||
if (ioctlsocket(socket_fd_, FIONBIO, &mode) != 0) {
|
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();
|
CloseSocket();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
const int original_flags = fcntl(socket_fd_, F_GETFL, 0);
|
const int original_flags = fcntl(socket_fd_, F_GETFL, 0);
|
||||||
if (original_flags == -1) {
|
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();
|
CloseSocket();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (fcntl(socket_fd_, F_SETFL, original_flags | O_NONBLOCK) == -1) {
|
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();
|
CloseSocket();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,9 +32,7 @@ class HttpSocket {
|
|||||||
const std::string& domain_name() const { return domain_name_; }
|
const std::string& domain_name() const { return domain_name_; }
|
||||||
int port() const { return atoi(port_.c_str()); }
|
int port() const { return atoi(port_.c_str()); }
|
||||||
const std::string& resource_path() const { return resource_path_; }
|
const std::string& resource_path() const { return resource_path_; }
|
||||||
std::string url() const {
|
const std::string& url() const { return url_; }
|
||||||
return scheme_ + "://" + domain_name_ + ":" + port_ + resource_path_;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ReadAndLogErrors(char* data, int len, int timeout_in_ms);
|
int ReadAndLogErrors(char* data, int len, int timeout_in_ms);
|
||||||
int WriteAndLogErrors(const 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);
|
bool Wait(bool for_read, int timeout_in_ms);
|
||||||
FRIEND_TEST(HttpSocketTest, ParseUrlTest);
|
FRIEND_TEST(HttpSocketTest, ParseUrlTest);
|
||||||
|
|
||||||
|
std::string url_;
|
||||||
std::string scheme_;
|
std::string scheme_;
|
||||||
bool secure_connect_;
|
bool secure_connect_;
|
||||||
std::string domain_name_;
|
std::string domain_name_;
|
||||||
|
|||||||
Reference in New Issue
Block a user