[FFmpeg-devel] Fix for closed connection with http_persistent

Michael Niedermayer michael at niedermayer.cc
Sat Jul 27 17:16:39 EEST 2019


On Fri, Jul 26, 2019 at 10:13:01PM +0000, Ian Klassen wrote:
> Hi,
> 
> Here is a potential fix for this bug: https://trac.ffmpeg.org/ticket/7975
> 
> Before reusing the connection the headers are checked to see if the server is closing the connection. Also, the server may respond with "Connection: Keep-alive, close" so the patch also handles this.
> 
> Thanks.
> 
> Ian
> 

>  http.c |   19 ++++++++++++++-----
>  1 file changed, 14 insertions(+), 5 deletions(-)
> 58ed36edf670ce62239eea577c47bfa0c822286d  0001-recognize-server-closing-http-connection.patch
> From 174a8913afe4e335441e3a8a77c91e6a4b4b718c Mon Sep 17 00:00:00 2001
> From: ian <ian at virtualfunc.com>
> Date: Fri, 26 Jul 2019 15:03:31 -0500
> Subject: [PATCH] recognize server closing http connection
> 
> ---
>  libavformat/http.c | 19 +++++++++++++++----
>  1 file changed, 15 insertions(+), 4 deletions(-)
> 
> diff --git a/libavformat/http.c b/libavformat/http.c
> index 579debc..3bf2434 100644
> --- a/libavformat/http.c
> +++ b/libavformat/http.c
> @@ -332,15 +332,25 @@ int ff_http_do_new_request(URLContext *h, const char *uri)
>          return AVERROR(EINVAL);
>      }
>  
> +    // read headers if not already loaded (this is needed to check if connection is closing)
> +    if (!s->end_header) {
> +      int new_location;
> +      http_read_header(h, &new_location);
> +
> +      if (s->willclose) {
> +        ret = ffurl_closep(&s->hd);
> +
> +        if (ret < 0)
> +          return ret;
> +      }
> +    }
> +
>      if (!s->end_chunked_post) {
>          ret = http_shutdown(h, h->flags);
>          if (ret < 0)
>              return ret;
>      }
>  
> -    if (s->willclose)
> -        return AVERROR_EOF;
> -
>      s->end_chunked_post = 0;
>      s->chunkend      = 0;
>      s->off           = 0;
> @@ -990,7 +1000,7 @@ static int process_line(URLContext *h, char *line, int line_count,
>          } else if (!av_strcasecmp(tag, "Proxy-Authenticate")) {
>              ff_http_auth_handle_header(&s->proxy_auth_state, tag, p);
>          } else if (!av_strcasecmp(tag, "Connection")) {
> -            if (!strcmp(p, "close"))
> +            if (strstr(p, "close") != NULL)
>                  s->willclose = 1;
>          } else if (!av_strcasecmp(tag, "Server")) {
>              if (!av_strcasecmp(p, "AkamaiGHost")) {
> @@ -1637,6 +1647,7 @@ static int http_shutdown(URLContext *h, int flags)
>              s->hd->flags |= AVIO_FLAG_NONBLOCK;
>              read_ret = ffurl_read(s->hd, buf, sizeof(buf));
>              s->hd->flags &= ~AVIO_FLAG_NONBLOCK;
>              if (read_ret < 0 && read_ret != AVERROR(EAGAIN)) {
>                  av_log(h, AV_LOG_ERROR, "URL read error: %s\n", av_err2str(read_ret));
>                  ret = read_ret;

error: corrupt patch at line 55

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Good people do not need laws to tell them to act responsibly, while bad
people will find a way around the laws. -- Plato
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20190727/4f960a66/attachment.sig>


More information about the ffmpeg-devel mailing list