OSDN Git Service

Support for customizable socket-read timeouts through the HTTP response.
authorAndreas Huber <andih@google.com>
Tue, 11 May 2010 18:10:21 +0000 (11:10 -0700)
committerAndreas Huber <andih@google.com>
Tue, 11 May 2010 18:10:21 +0000 (11:10 -0700)
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

include/media/stagefright/HTTPDataSource.h
media/libstagefright/HTTPDataSource.cpp
media/libstagefright/HTTPStream.cpp
media/libstagefright/include/HTTPStream.h

index f3b44fd..0400bea 100644 (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 &);
index 8e26c37..f72a6cc 100644 (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));
index 6145ec2..9c99866 100644 (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
 
index 5d638f3..35b0865 100644 (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,