Merge "Support for customizable socket-read timeouts through the HTTP response." into froyo

This commit is contained in:
Andreas Huber
2010-05-11 12:21:14 -07:00
committed by Android (Google) Code Review
4 changed files with 34 additions and 4 deletions

View File

@ -91,6 +91,7 @@ private:
void initHeaders(const KeyedVector<String8, String8> *overrides);
status_t connectWithRedirectsAndRange(off_t rangeStart);
void applyTimeoutResponse();
HTTPDataSource(const HTTPDataSource &);
HTTPDataSource &operator=(const HTTPDataSource &);

View File

@ -84,6 +84,7 @@ status_t HTTPDataSource::connectWithRedirectsAndRange(off_t rangeStart) {
}
if (httpStatus >= 200 && httpStatus < 300) {
applyTimeoutResponse();
return OK;
}
@ -133,6 +134,22 @@ status_t HTTPDataSource::connectWithRedirectsAndRange(off_t rangeStart) {
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(
const char *uri, const KeyedVector<String8, String8> *headers) {
CHECK(!strncasecmp("http://", uri, 7));

View File

@ -68,10 +68,7 @@ status_t HTTPStream::connect(const char *server, int port) {
return UNKNOWN_ERROR;
}
struct timeval tv;
tv.tv_usec = 0;
tv.tv_sec = 5;
CHECK_EQ(0, setsockopt(mSocket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)));
setReceiveTimeout(5); // Time out reads after 5 secs by default
mState = CONNECTING;
@ -329,5 +326,17 @@ bool HTTPStream::find_header_value(const string &key, string *value) const {
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

View File

@ -52,6 +52,9 @@ public:
bool find_header_value(
const string &key, string *value) const;
// Pass a negative value to disable the timeout.
void setReceiveTimeout(int seconds);
private:
enum State {
READY,