[vlc-devel] [PATCH 2/9] dash: refactored HTTPConnection

Christopher at mailsrv.uni-klu.ac.at Christopher at mailsrv.uni-klu.ac.at
Fri Mar 9 19:05:20 CET 2012


From: Christopher Mueller <christopher.mueller at itec.aau.at>

---
 modules/stream_filter/dash/http/HTTPConnection.cpp |   74 +++++++++++---------
 modules/stream_filter/dash/http/HTTPConnection.h   |   35 ++++-----
 .../dash/http/HTTPConnectionManager.cpp            |    4 +-
 3 files changed, 58 insertions(+), 55 deletions(-)

diff --git a/modules/stream_filter/dash/http/HTTPConnection.cpp b/modules/stream_filter/dash/http/HTTPConnection.cpp
index 13f572a..3f1fd35 100644
--- a/modules/stream_filter/dash/http/HTTPConnection.cpp
+++ b/modules/stream_filter/dash/http/HTTPConnection.cpp
@@ -26,16 +26,14 @@
 #endif
 
 #include "HTTPConnection.h"
-#include <vlc_url.h>
 
 using namespace dash::http;
 
-HTTPConnection::HTTPConnection  (Chunk *chunk, stream_t *stream) :
+HTTPConnection::HTTPConnection  (stream_t *stream) :
                 stream          (stream),
-                chunk           (chunk),
-                peekBufferLen   (0)
+                peekBufferLen   (0),
+                contentLength   (0)
 {
-    this->url        = chunk->getUrl();
     this->peekBuffer = new uint8_t[PEEKBUFFER];
 }
 HTTPConnection::~HTTPConnection ()
@@ -73,48 +71,41 @@ int             HTTPConnection::peek            (const uint8_t **pp_peek, size_t
     *pp_peek = peek;
     return size;
 }
-void            HTTPConnection::parseURL        ()
+std::string     HTTPConnection::prepareRequest  (Chunk *chunk)
 {
-    vlc_url_t url_components;
-    vlc_UrlParse(&url_components, this->url.c_str(), 0);
-    this->path = url_components.psz_path;
-    this->port = url_components.i_port ? url_components.i_port : 80;
+    std::string request;
 
-    if(this->url.compare(0, 4, "http"))
-        this->hostname = Helper::combinePaths(Helper::getDirectoryPath(stream->psz_path), this->url);
-    else
-        this->hostname = url_components.psz_host;
-
-    this->request = "GET " + this->path + " HTTP/1.1\r\n" +
-                    "Host: " + this->hostname + "\r\nConnection: close\r\n\r\n";
-}
-void            HTTPConnection::prepareRequest  ()
-{
     if(!chunk->useByteRange())
     {
-        this->request = "GET "          + this->path     + " HTTP/1.1" + "\r\n" +
-                        "Host: "        + this->hostname + "\r\n" +
-                        "Connection: close\r\n\r\n";
+        request = "GET "    + chunk->getPath()    + " HTTP/1.1" + "\r\n" +
+                  "Host: "  + chunk->getHostname() + "\r\n" +
+                  "Connection: close\r\n\r\n";
     }
     else
     {
         std::stringstream req;
-        req << "GET " << this->path << " HTTP/1.1\r\n" <<
-               "Host: " << this->hostname << "\r\n" <<
-               "Range: bytes=" << this->chunk->getStartByte() << "-" << this->chunk->getEndByte() << "\r\n" <<
+        req << "GET " << chunk->getPath() << " HTTP/1.1\r\n" <<
+               "Host: " << chunk->getHostname() << "\r\n" <<
+               "Range: bytes=" << chunk->getStartByte() << "-" << chunk->getEndByte() << "\r\n" <<
                "Connection: close\r\n\r\n";
 
-        this->request = req.str();
+        request = req.str();
     }
+
+    return request;
 }
-bool            HTTPConnection::init            ()
+bool            HTTPConnection::init            (Chunk *chunk)
 {
-    this->parseURL();
-    this->prepareRequest();
+    if(!chunk->hasHostname())
+        if(!this->setUrlRelative(chunk))
+            return false;
+
+    this->httpSocket = net_ConnectTCP(this->stream, chunk->getHostname().c_str(), chunk->getPort());
 
-    this->httpSocket = net_ConnectTCP(this->stream, this->hostname.c_str(), this->port);
+    if(!this->httpSocket)
+        return false;
 
-    if(this->sendData(this->request))
+    if(this->sendData(this->prepareRequest(chunk)))
         return this->parseHeader();
 
     return false;
@@ -123,9 +114,18 @@ bool            HTTPConnection::parseHeader     ()
 {
     std::string line = this->readLine();
 
+    if(line.size() == 0)
+        return false;
+
     while(line.compare("\r\n"))
     {
+        if(!line.compare(0, 14, "Content-Length"))
+            this->contentLength = atoi(line.substr(15,line.size()).c_str());
+
         line = this->readLine();
+
+        if(line.size() == 0)
+            return false;
     }
 
     return true;
@@ -148,7 +148,7 @@ std::string     HTTPConnection::readLine        ()
     if(size > 0)
         return ss.str();
 
-    return "\r\n";
+    return "";
 }
 bool            HTTPConnection::sendData        (const std::string& data)
 {
@@ -168,3 +168,11 @@ void            HTTPConnection::closeSocket     ()
 {
     net_Close(this->httpSocket);
 }
+bool            HTTPConnection::setUrlRelative  (Chunk *chunk)
+{
+    std::stringstream ss;
+    ss << stream->psz_access << "://" << Helper::combinePaths(Helper::getDirectoryPath(stream->psz_path), chunk->getUrl());
+    chunk->setUrl(ss.str());
+
+    return chunk->hasHostname();
+}
diff --git a/modules/stream_filter/dash/http/HTTPConnection.h b/modules/stream_filter/dash/http/HTTPConnection.h
index f27b152..8dc4fa7 100644
--- a/modules/stream_filter/dash/http/HTTPConnection.h
+++ b/modules/stream_filter/dash/http/HTTPConnection.h
@@ -29,6 +29,7 @@
 #include <vlc_plugin.h>
 #include <vlc_stream.h>
 #include <vlc_network.h>
+#include <vlc_url.h>
 
 #include <string>
 #include <stdint.h>
@@ -48,32 +49,26 @@ namespace dash
         class HTTPConnection : public IHTTPConnection
         {
             public:
-                HTTPConnection          ( Chunk *chunk, stream_t *stream );
+                HTTPConnection          (stream_t *stream);
                 virtual ~HTTPConnection ();
 
-                bool        init            ();
-                void        closeSocket     ();
-
+                virtual bool    init        (Chunk *chunk);
+                void            closeSocket ();
                 virtual int     read        (void *p_buffer, size_t len);
                 virtual int     peek        (const uint8_t **pp_peek, size_t i_peek);
 
-            private:
-                int                     httpSocket;
-                std::string             url;
-                std::string             hostname;
-                std::string             path;
-                int                     port;
-                std::string             request;
-                stream_t                *stream;
-                Chunk                   *chunk;
-                uint8_t                 *peekBuffer;
-                size_t                  peekBufferLen;
+            protected:
+                int         httpSocket;
+                stream_t    *stream;
+                uint8_t     *peekBuffer;
+                size_t      peekBufferLen;
+                int         contentLength;
 
-                void            parseURL        ();
-                bool            sendData        (const std::string& data);
-                bool            parseHeader     ();
-                std::string     readLine        ();
-                void            prepareRequest  ();
+                bool                sendData        (const std::string& data);
+                bool                parseHeader     ();
+                std::string         readLine        ();
+                virtual std::string prepareRequest  (Chunk *chunk);
+                bool                setUrlRelative  (Chunk *chunk);
         };
     }
 }
diff --git a/modules/stream_filter/dash/http/HTTPConnectionManager.cpp b/modules/stream_filter/dash/http/HTTPConnectionManager.cpp
index dd4a57e..c0e18b2 100644
--- a/modules/stream_filter/dash/http/HTTPConnectionManager.cpp
+++ b/modules/stream_filter/dash/http/HTTPConnectionManager.cpp
@@ -137,8 +137,8 @@ int                 HTTPConnectionManager::peek                     (Chunk *chun
 
 IHTTPConnection*     HTTPConnectionManager::initConnection(Chunk *chunk)
 {
-    HTTPConnection *con = new HTTPConnection(chunk, this->stream);
-    if ( con->init() == false )
+    HTTPConnection *con = new HTTPConnection(this->stream);
+    if ( con->init(chunk) == false )
         return NULL;
     this->chunkMap[chunk] = con;
     this->chunkCount++;
-- 
1.7.0.4




More information about the vlc-devel mailing list