diff options
| -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 f3b44fde757e..0400bea728fc 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 8e26c37e1ada..f72a6ccd22e0 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 6145ec225157..9c99866f9e02 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 5d638f386d45..35b086566040 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, |