diff options
author | Andreas Huber <andih@google.com> | 2010-05-11 11:10:21 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-05-11 11:10:21 -0700 |
commit | ba7c35717116e4dcb8242644f6ccf07c25c7b251 (patch) | |
tree | cabacf8bb7efd7d22fa408c8a3aacc8d476eee87 | |
parent | adbda96f6a05507788bb4163d7fbe8a95948f0a5 (diff) | |
download | frameworks_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.h | 1 | ||||
-rw-r--r-- | media/libstagefright/HTTPDataSource.cpp | 17 | ||||
-rw-r--r-- | media/libstagefright/HTTPStream.cpp | 17 | ||||
-rw-r--r-- | media/libstagefright/include/HTTPStream.h | 3 |
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, |