summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/NuHTTPDataSource.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-06-11 09:57:46 -0700
committerAndreas Huber <andih@google.com>2010-06-11 09:57:46 -0700
commit3a53dc5ad9c2fa808b87195cfde9f3a065d6fa5b (patch)
treeebb7ba6f18a2f24ecf188435cc4871b4d7a52954 /media/libstagefright/NuHTTPDataSource.cpp
parentb8bb78f54b48868465a9d69d65fda08524ab5ae1 (diff)
downloadframeworks_base-3a53dc5ad9c2fa808b87195cfde9f3a065d6fa5b.zip
frameworks_base-3a53dc5ad9c2fa808b87195cfde9f3a065d6fa5b.tar.gz
frameworks_base-3a53dc5ad9c2fa808b87195cfde9f3a065d6fa5b.tar.bz2
Restore feature parity with the old HTTPDataSource as far as support for extra headers (cookies?) and socket-timeout are concerned.
Change-Id: I506dc501faec60e974bf4968d8ba661df7a49aa8
Diffstat (limited to 'media/libstagefright/NuHTTPDataSource.cpp')
-rw-r--r--media/libstagefright/NuHTTPDataSource.cpp85
1 files changed, 79 insertions, 6 deletions
diff --git a/media/libstagefright/NuHTTPDataSource.cpp b/media/libstagefright/NuHTTPDataSource.cpp
index 8587c1b..ab9285d 100644
--- a/media/libstagefright/NuHTTPDataSource.cpp
+++ b/media/libstagefright/NuHTTPDataSource.cpp
@@ -4,6 +4,7 @@
#include "include/NuHTTPDataSource.h"
+#include <cutils/properties.h>
#include <media/stagefright/MediaDebug.h>
#include <media/stagefright/MediaErrors.h>
@@ -72,18 +73,33 @@ NuHTTPDataSource::NuHTTPDataSource()
NuHTTPDataSource::~NuHTTPDataSource() {
}
-status_t NuHTTPDataSource::connect(const char *uri, off_t offset) {
+status_t NuHTTPDataSource::connect(
+ const char *uri,
+ const KeyedVector<String8, String8> *overrides,
+ off_t offset) {
+ String8 headers;
+ MakeFullHeaders(overrides, &headers);
+
+ return connect(uri, headers, offset);
+}
+
+status_t NuHTTPDataSource::connect(
+ const char *uri,
+ const String8 &headers,
+ off_t offset) {
String8 host, path;
unsigned port;
if (!ParseURL(uri, &host, &port, &path)) {
return ERROR_MALFORMED;
}
- return connect(host, port, path, offset);
+ return connect(host, port, path, headers, offset);
}
status_t NuHTTPDataSource::connect(
- const char *host, unsigned port, const char *path, off_t offset) {
+ const char *host, unsigned port, const char *path,
+ const String8 &headers,
+ off_t offset) {
LOGI("connect to %s:%u%s @%ld", host, port, path, offset);
bool needsToReconnect = true;
@@ -99,6 +115,7 @@ status_t NuHTTPDataSource::connect(
mHost = host;
mPort = port;
mPath = path;
+ mHeaders = headers;
status_t err = OK;
@@ -133,6 +150,7 @@ status_t NuHTTPDataSource::connect(
request.append(rangeHeader);
}
+ request.append(mHeaders);
request.append("\r\n");
int httpStatus;
@@ -151,10 +169,17 @@ status_t NuHTTPDataSource::connect(
mHTTP.disconnect();
- return connect(value.c_str());
+ return connect(value.c_str(), headers, offset);
}
- CHECK(httpStatus >= 200 && httpStatus < 300);
+ if (httpStatus < 200 || httpStatus >= 300) {
+ mState = DISCONNECTED;
+ mHTTP.disconnect();
+
+ return ERROR_IO;
+ }
+
+ applyTimeoutResponse();
if (offset == 0) {
string value;
@@ -200,7 +225,8 @@ ssize_t NuHTTPDataSource::readAt(off_t offset, void *data, size_t size) {
if (offset != mOffset) {
String8 host = mHost;
String8 path = mPath;
- status_t err = connect(host, mPort, path, offset);
+ String8 headers = mHeaders;
+ status_t err = connect(host, mPort, path, headers, offset);
if (err != OK) {
return err;
@@ -262,4 +288,51 @@ uint32_t NuHTTPDataSource::flags() {
return kWantsPrefetching;
}
+// static
+void NuHTTPDataSource::MakeFullHeaders(
+ const KeyedVector<String8, String8> *overrides, String8 *headers) {
+ headers->setTo("");
+
+ headers->append("User-Agent: stagefright/1.1 (Linux;Android ");
+
+#if (PROPERTY_VALUE_MAX < 8)
+#error "PROPERTY_VALUE_MAX must be at least 8"
+#endif
+
+ char value[PROPERTY_VALUE_MAX];
+ property_get("ro.build.version.release", value, "Unknown");
+ headers->append(value);
+ headers->append(")\r\n");
+
+ if (overrides == NULL) {
+ return;
+ }
+
+ for (size_t i = 0; i < overrides->size(); ++i) {
+ String8 line;
+ line.append(overrides->keyAt(i));
+ line.append(": ");
+ line.append(overrides->valueAt(i));
+ line.append("\r\n");
+
+ headers->append(line);
+ }
+}
+
+void NuHTTPDataSource::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);
+ }
+}
+
} // namespace android