void initHeaders(const KeyedVector<String8, String8> *overrides);
status_t connectWithRedirectsAndRange(off_t rangeStart);
+ void applyTimeoutResponse();
HTTPDataSource(const HTTPDataSource &);
HTTPDataSource &operator=(const HTTPDataSource &);
}
if (httpStatus >= 200 && httpStatus < 300) {
+ applyTimeoutResponse();
return OK;
}
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));
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;
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