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

Hugo Beauzée-Luyssen beauze.h at gmail.com
Mon Mar 12 11:02:05 CET 2012


On Fri, Mar 9, 2012 at 7:05 PM,  <Christopher at mailsrv.uni-klu.ac.at> wrote:
> 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";
I may be missing something, but if the url wasn't absolute, won't this
be resulting in an empty Host parameter?

>     }
>     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())
This is what I missed earlier :)

> +        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>
This is not needed from the .h file, and doesn't seem to be required
anymore from the .cpp

>
>  #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
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel

Looks good, except for the include.

-- 
Hugo Beauzée-Luyssen


More information about the vlc-devel mailing list