summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-05-11 11:10:21 -0700
committerAndreas Huber <andih@google.com>2010-05-11 11:10:21 -0700
commitba7c35717116e4dcb8242644f6ccf07c25c7b251 (patch)
treecabacf8bb7efd7d22fa408c8a3aacc8d476eee87
parentadbda96f6a05507788bb4163d7fbe8a95948f0a5 (diff)
downloadframeworks_av-ba7c35717116e4dcb8242644f6ccf07c25c7b251.zip
frameworks_av-ba7c35717116e4dcb8242644f6ccf07c25c7b251.tar.gz
frameworks_av-ba7c35717116e4dcb8242644f6ccf07c25c7b251.tar.bz2
Support for customizable socket-read timeouts through the HTTP response.
Specify a response header of "X-SocketTimeout: 15" to override the default timeout of 5 secs with a timeout of 15 seconds. Specify a negative value to disable the timeout altogether. Change-Id: I545adf3d8b3f7efe5f8d081a641c6404440a77db related-to-bug: 2675721
-rw-r--r--include/media/stagefright/HTTPDataSource.h1
-rw-r--r--media/libstagefright/HTTPDataSource.cpp17
-rw-r--r--media/libstagefright/HTTPStream.cpp17
-rw-r--r--media/libstagefright/include/HTTPStream.h3
4 files changed, 34 insertions, 4 deletions
diff --git a/include/media/stagefright/HTTPDataSource.h b/include/media/stagefright/HTTPDataSource.h
index f3b44fd..0400bea 100644
--- a/include/media/stagefright/HTTPDataSource.h
+++ b/include/media/stagefright/HTTPDataSource.h
@@ -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 &);
diff --git a/media/libstagefright/HTTPDataSource.cpp b/media/libstagefright/HTTPDataSource.cpp
index 8e26c37..f72a6cc 100644
--- a/media/libstagefright/HTTPDataSource.cpp
+++ b/media/libstagefright/HTTPDataSource.cpp
@@ -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));
diff --git a/media/libstagefright/HTTPStream.cpp b/media/libstagefright/HTTPStream.cpp
index 6145ec2..9c99866 100644
--- a/media/libstagefright/HTTPStream.cpp
+++ b/media/libstagefright/HTTPStream.cpp
@@ -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
diff --git a/media/libstagefright/include/HTTPStream.h b/media/libstagefright/include/HTTPStream.h
index 5d638f3..35b0865 100644
--- a/media/libstagefright/include/HTTPStream.h
+++ b/media/libstagefright/include/HTTPStream.h
@@ -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,