Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e0dc80f8 authored by Andreas Huber's avatar Andreas Huber Committed by Android (Google) Code Review
Browse files

Merge "Support for customizable socket-read timeouts through the HTTP response." into froyo

parents d6ad7c85 e67c1607
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 &);
+17 −0
Original line number Diff line number Diff line
@@ -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));
+13 −4
Original line number Diff line number Diff line
@@ -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
+3 −0
Original line number Diff line number Diff line
@@ -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,