Merge "Properly fill in the component name for the software decoders." into froyo
diff --git a/media/libstagefright/HTTPDataSource.cpp b/media/libstagefright/HTTPDataSource.cpp
index 00af8a3..61ffa8d 100644
--- a/media/libstagefright/HTTPDataSource.cpp
+++ b/media/libstagefright/HTTPDataSource.cpp
@@ -385,7 +385,8 @@
 
     ssize_t num_bytes_received = mHttp->receive(mBuffer, contentLength);
 
-    if (num_bytes_received < 0) {
+    if (num_bytes_received < 0
+            || (mContentLengthValid && num_bytes_received < contentLength)) {
         if (mNumRetriesLeft-- > 0) {
             disconnect();
             if (connect() == OK) {
diff --git a/media/libstagefright/HTTPStream.cpp b/media/libstagefright/HTTPStream.cpp
index 3aad72c..1e06f03 100644
--- a/media/libstagefright/HTTPStream.cpp
+++ b/media/libstagefright/HTTPStream.cpp
@@ -14,6 +14,10 @@
  * limitations under the License.
  */
 
+//#define LOG_NDEBUG 0
+#define LOG_TAG "HTTPStream"
+#include <utils/Log.h>
+
 #include "include/HTTPStream.h"
 
 #include <sys/socket.h>
@@ -146,6 +150,30 @@
     return send(data, strlen(data));
 }
 
+static ssize_t recvWithTimeout(
+        int s, void *data, size_t size) {
+    fd_set rs, es;
+    FD_ZERO(&rs);
+    FD_ZERO(&es);
+    FD_SET(s, &rs);
+    FD_SET(s, &es);
+
+    struct timeval tv;
+    tv.tv_sec = 5;  // 5 sec timeout
+    tv.tv_usec = 0;
+
+    int res = select(s + 1, &rs, NULL, &es, &tv);
+
+    if (res < 0) {
+        return -1;
+    } else if (res == 0) {
+        errno = ETIMEDOUT;
+        return -1;
+    }
+
+    return recv(s, data, size, 0);
+}
+
 // A certain application spawns a local webserver that sends invalid responses,
 // specifically it terminates header line with only a newline instead of the
 // CRLF (carriage-return followed by newline) required by the HTTP specs.
@@ -164,7 +192,7 @@
 
     for (;;) {
         char c;
-        ssize_t n = recv(mSocket, &c, 1, 0);
+        ssize_t n = recvWithTimeout(mSocket, &c, 1);
         if (n < 0) {
             if (errno == EINTR) {
                 continue;
@@ -282,7 +310,8 @@
 ssize_t HTTPStream::receive(void *data, size_t size) {
     size_t total = 0;
     while (total < size) {
-        ssize_t n = recv(mSocket, (char *)data + total, size - total, 0);
+        ssize_t n = recvWithTimeout(
+                mSocket, (char *)data + total, size - total);
 
         if (n < 0) {
             if (errno == EINTR) {
@@ -296,7 +325,8 @@
         } else if (n == 0) {
             disconnect();
 
-            LOGE("recv failed, server is gone");
+            LOGE("recv failed, server is gone, total received: %d bytes",
+                 total);
 
             return total == 0 ? (ssize_t)ERROR_CONNECTION_LOST : total;
         }