[vlc-devel] [PATCH] network: implement an API for HTTP requests.

Rémi Denis-Courmont remi at remlab.net
Wed Feb 5 14:53:53 CET 2014

On Wed, 5 Feb 2014 14:21:08 +0100, Felix Abecassis
<felix.abecassis at gmail.com> wrote:
> 2014-02-05 Denis Charmet <typx at dinauz.org>:
>> Hi,
>> Since it's quite redundant with access/http, it would be good to avoid
>> code duplication.
> My goal is to implement a new API in the core and afterwards rewrite
> the access/http module to use this API for sending requests and
> receiving responses.
> Sounds good?

I don't think the HTTP access belongs in the core. And worse, your API is
much too simplistic to support streaming.

>> Le lundi 03 février 2014 à 07:07:48, Felix Abecassis a écrit :
>>> +/* Read a line (ended by \r\n) from an HTTP response. */
>>> +static char* http_readline( vlc_object_t *p_this, int fd )
>> why not net_Get?
> Right, thanks. You mean net_Gets?

net_Gets() is a blocking function and as it stands can only be used safely
from access or demux object. So that sounds like a Dead End.

>> You shouldn't use realloc like that. It can return NULL but
>> header->dictionary will still be allocated and will be leaked.
>> Why not using the array macros already available in vlc_arrays.h
> Thanks, I was not aware of these macros.

No. VLC macros do not cope with errors and should be avoided IMHO.

>>> +
>>> +    /* Try to find Content-Length entry in the header */
>>> +    for (size_t i = 0; i < header->size; ++i)
>>> +    {
>>> +        const char *key = header->dictionary[i].key;
>>> +        const char *value = header->dictionary[i].value;
>>> +        if (!strncasecmp(key, "Content-Length", 14))
>> This could be done in the previous loop
> I've modified my code since this patch, I now define a list of
> callbacks for the headers with a (const char*, callback) array.
> It avoids the cascading strncasecmp for all possible headers.
>> Why strdup("") when you could asprintf("%s %s HTTP/1.%d",...)
>> And you didn't check for result.
> Indeed, but actually Inow  realize it's not necessarily to build the
> full string of headers, we can instead call net_Printf several times.

No- Calling net_Print() several times would split the packet across
multiple TCP segments. This is inefficient from network point of view. And
to add pain to injury. net_Printf() is blocking and thus inadequate here.

And while I do not care personally, I will mention that some broken HTTP
servers insist on the request being sent in a single segment - even though
that makes no sense and violates the specification.

Rémi Denis-Courmont
Sent from my collocated server

More information about the vlc-devel mailing list