Merge "Support for customizable socket-read timeouts through the HTTP response." into froyo
This commit is contained in:
committed by
Android (Google) Code Review
commit
e0dc80f878
@ -91,6 +91,7 @@ private:
|
|||||||
void initHeaders(const KeyedVector<String8, String8> *overrides);
|
void initHeaders(const KeyedVector<String8, String8> *overrides);
|
||||||
|
|
||||||
status_t connectWithRedirectsAndRange(off_t rangeStart);
|
status_t connectWithRedirectsAndRange(off_t rangeStart);
|
||||||
|
void applyTimeoutResponse();
|
||||||
|
|
||||||
HTTPDataSource(const HTTPDataSource &);
|
HTTPDataSource(const HTTPDataSource &);
|
||||||
HTTPDataSource &operator=(const HTTPDataSource &);
|
HTTPDataSource &operator=(const HTTPDataSource &);
|
||||||
|
@ -84,6 +84,7 @@ status_t HTTPDataSource::connectWithRedirectsAndRange(off_t rangeStart) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (httpStatus >= 200 && httpStatus < 300) {
|
if (httpStatus >= 200 && httpStatus < 300) {
|
||||||
|
applyTimeoutResponse();
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,6 +134,22 @@ status_t HTTPDataSource::connectWithRedirectsAndRange(off_t rangeStart) {
|
|||||||
return ERROR_IO;
|
return ERROR_IO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HTTPDataSource::applyTimeoutResponse() {
|
||||||
|
string timeout;
|
||||||
|
if (mHttp->find_header_value("X-SocketTimeout", &timeout)) {
|
||||||
|
const char *s = timeout.c_str();
|
||||||
|
char *end;
|
||||||
|
long tmp = strtol(s, &end, 10);
|
||||||
|
if (end == s || *end != '\0') {
|
||||||
|
LOGW("Illegal X-SocketTimeout value given.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGI("overriding default timeout, new timeout is %ld seconds", tmp);
|
||||||
|
mHttp->setReceiveTimeout(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HTTPDataSource::HTTPDataSource(
|
HTTPDataSource::HTTPDataSource(
|
||||||
const char *uri, const KeyedVector<String8, String8> *headers) {
|
const char *uri, const KeyedVector<String8, String8> *headers) {
|
||||||
CHECK(!strncasecmp("http://", uri, 7));
|
CHECK(!strncasecmp("http://", uri, 7));
|
||||||
|
@ -68,10 +68,7 @@ status_t HTTPStream::connect(const char *server, int port) {
|
|||||||
return UNKNOWN_ERROR;
|
return UNKNOWN_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct timeval tv;
|
setReceiveTimeout(5); // Time out reads after 5 secs by default
|
||||||
tv.tv_usec = 0;
|
|
||||||
tv.tv_sec = 5;
|
|
||||||
CHECK_EQ(0, setsockopt(mSocket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)));
|
|
||||||
|
|
||||||
mState = CONNECTING;
|
mState = CONNECTING;
|
||||||
|
|
||||||
@ -329,5 +326,17 @@ bool HTTPStream::find_header_value(const string &key, string *value) const {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HTTPStream::setReceiveTimeout(int seconds) {
|
||||||
|
if (seconds < 0) {
|
||||||
|
// Disable the timeout.
|
||||||
|
seconds = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct timeval tv;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
tv.tv_sec = seconds;
|
||||||
|
CHECK_EQ(0, setsockopt(mSocket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace android
|
} // namespace android
|
||||||
|
|
||||||
|
@ -52,6 +52,9 @@ public:
|
|||||||
bool find_header_value(
|
bool find_header_value(
|
||||||
const string &key, string *value) const;
|
const string &key, string *value) const;
|
||||||
|
|
||||||
|
// Pass a negative value to disable the timeout.
|
||||||
|
void setReceiveTimeout(int seconds);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum State {
|
enum State {
|
||||||
READY,
|
READY,
|
||||||
|
Reference in New Issue
Block a user