Re: [FFmpeg-devel] [PATCH v4] avformat/http, icecast, rtsp: Add option to disable send-100-continue

2019-03-30 Thread Jun Li
Thanks Michael for review.
I updated the iteration to address your feedback:
https://patchwork.ffmpeg.org/patch/12540/

Best Regards,
-Jun

On Sat, Mar 30, 2019 at 6:14 PM Michael Niedermayer 
wrote:

> On Fri, Mar 29, 2019 at 03:59:21PM -0700, Jun Li wrote:
> > On Wed, Mar 27, 2019 at 11:27 PM Jun Li  wrote:
> >
> > >
> > >
> > > On Mon, Mar 25, 2019 at 2:42 PM Jun Li  wrote:
> > >
> > >>
> > >>
> > >> On Fri, Mar 22, 2019 at 4:12 PM Jun Li  wrote:
> > >>
> > >>> The current setting for send-100-continue option is either
> > >>> enabled if applicable or forced enabled, no option to force
> > >>> disable the header. This change is to expand the option setting
> > >>> to provide more flexibility, which is useful for rstp case.
> > >>> ---
> > >>>  libavformat/http.c| 28 +---
> > >>>  libavformat/icecast.c |  2 +-
> > >>>  libavformat/rtsp.c|  1 +
> > >>>  3 files changed, 19 insertions(+), 12 deletions(-)
> > >>>
> > >>> diff --git a/libavformat/http.c b/libavformat/http.c
> > >>> index 74d743850d..5a937994cf 100644
> > >>> --- a/libavformat/http.c
> > >>> +++ b/libavformat/http.c
> > >>> @@ -113,6 +113,7 @@ typedef struct HTTPContext {
> > >>>  uint8_t *inflate_buffer;
> > >>>  #endif /* CONFIG_ZLIB */
> > >>>  AVDictionary *chained_options;
> > >>> +/* -1 = try to send if applicable, 0 = always disabled, 1 =
> always
> > >>> enabled */
> > >>>  int send_expect_100;
> > >>>  char *method;
> > >>>  int reconnect;
> > >>> @@ -155,7 +156,7 @@ static const AVOption options[] = {
> > >>>  { "auth_type", "HTTP authentication type",
> > >>> OFFSET(auth_state.auth_type), AV_OPT_TYPE_INT, { .i64 =
> HTTP_AUTH_NONE },
> > >>> HTTP_AUTH_NONE, HTTP_AUTH_BASIC, D | E, "auth_type"},
> > >>>  { "none", "No auth method set, autodetect", 0,
> AV_OPT_TYPE_CONST, {
> > >>> .i64 = HTTP_AUTH_NONE }, 0, 0, D | E, "auth_type"},
> > >>>  { "basic", "HTTP basic authentication", 0, AV_OPT_TYPE_CONST, {
> > >>> .i64 = HTTP_AUTH_BASIC }, 0, 0, D | E, "auth_type"},
> > >>> -{ "send_expect_100", "Force sending an Expect: 100-continue
> header
> > >>> for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = 0 },
> 0, 1, E
> > >>> },
> > >>> +{ "send_expect_100", "Force sending an Expect: 100-continue
> header
> > >>> for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = -1 },
> -1, 1,
> > >>> E },
> > >>>  { "location", "The actual location of the data received",
> > >>> OFFSET(location), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, D | E },
> > >>>  { "offset", "initial byte offset", OFFSET(off),
> AV_OPT_TYPE_INT64,
> > >>> { .i64 = 0 }, 0, INT64_MAX, D },
> > >>>  { "end_offset", "try to limit the request to bytes preceding
> this
> > >>> offset", OFFSET(end_off), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0,
> INT64_MAX, D
> > >>> },
> > >>> @@ -1179,16 +1180,21 @@ static int http_connect(URLContext *h, const
> > >>> char *path, const char *local_path,
> > >>>  local_path, method);
> > >>>  proxyauthstr =
> ff_http_auth_create_response(>proxy_auth_state,
> > >>> proxyauth,
> > >>>  local_path, method);
> > >>> -if (post && !s->post_data) {
> > >>> -send_expect_100 = s->send_expect_100;
> > >>> -/* The user has supplied authentication but we don't know
> the
> > >>> auth type,
> > >>> - * send Expect: 100-continue to get the 401 response
> including
> > >>> the
> > >>> - * WWW-Authenticate header, or an 100 continue if no auth
> > >>> actually
> > >>> - * is needed. */
> > >>> -if (auth && *auth &&
> > >>> -s->auth_state.auth_type == HTTP_AUTH_NONE &&
> > >>> -s->http_code != 401)
> > >>> -send_expect_100 = 1;
> > >>> +
> > >>> + if (post && !s->post_data) {
> > >>> +if (s->send_expect_100 != -1) {
> > >>> +send_expect_100 = s->send_expect_100;
> > >>> +} else {
> > >>> +send_expect_100 = 0;
> > >>> +/* The user has supplied authentication but we don't
> know
> > >>> the auth type,
> > >>> + * send Expect: 100-continue to get the 401 response
> > >>> including the
> > >>> + * WWW-Authenticate header, or an 100 continue if no
> auth
> > >>> actually
> > >>> + * is needed. */
> > >>> +if (auth && *auth &&
> > >>> +s->auth_state.auth_type == HTTP_AUTH_NONE &&
> > >>> +s->http_code != 401)
> > >>> +send_expect_100 = 1;
> > >>> +}
> > >>>  }
> > >>>
> > >>>  #if FF_API_HTTP_USER_AGENT
> > >>> diff --git a/libavformat/icecast.c b/libavformat/icecast.c
> > >>> index c93b06b553..d2198b78ec 100644
> > >>> --- a/libavformat/icecast.c
> > >>> +++ b/libavformat/icecast.c
> > >>> @@ -115,7 +115,7 @@ static int icecast_open(URLContext *h, const char
> > >>> *uri, int flags)
> > >>>  av_dict_set(_dict, 

Re: [FFmpeg-devel] [PATCH v4] avformat/http, icecast, rtsp: Add option to disable send-100-continue

2019-03-30 Thread Michael Niedermayer
On Fri, Mar 29, 2019 at 03:59:21PM -0700, Jun Li wrote:
> On Wed, Mar 27, 2019 at 11:27 PM Jun Li  wrote:
> 
> >
> >
> > On Mon, Mar 25, 2019 at 2:42 PM Jun Li  wrote:
> >
> >>
> >>
> >> On Fri, Mar 22, 2019 at 4:12 PM Jun Li  wrote:
> >>
> >>> The current setting for send-100-continue option is either
> >>> enabled if applicable or forced enabled, no option to force
> >>> disable the header. This change is to expand the option setting
> >>> to provide more flexibility, which is useful for rstp case.
> >>> ---
> >>>  libavformat/http.c| 28 +---
> >>>  libavformat/icecast.c |  2 +-
> >>>  libavformat/rtsp.c|  1 +
> >>>  3 files changed, 19 insertions(+), 12 deletions(-)
> >>>
> >>> diff --git a/libavformat/http.c b/libavformat/http.c
> >>> index 74d743850d..5a937994cf 100644
> >>> --- a/libavformat/http.c
> >>> +++ b/libavformat/http.c
> >>> @@ -113,6 +113,7 @@ typedef struct HTTPContext {
> >>>  uint8_t *inflate_buffer;
> >>>  #endif /* CONFIG_ZLIB */
> >>>  AVDictionary *chained_options;
> >>> +/* -1 = try to send if applicable, 0 = always disabled, 1 = always
> >>> enabled */
> >>>  int send_expect_100;
> >>>  char *method;
> >>>  int reconnect;
> >>> @@ -155,7 +156,7 @@ static const AVOption options[] = {
> >>>  { "auth_type", "HTTP authentication type",
> >>> OFFSET(auth_state.auth_type), AV_OPT_TYPE_INT, { .i64 = HTTP_AUTH_NONE },
> >>> HTTP_AUTH_NONE, HTTP_AUTH_BASIC, D | E, "auth_type"},
> >>>  { "none", "No auth method set, autodetect", 0, AV_OPT_TYPE_CONST, {
> >>> .i64 = HTTP_AUTH_NONE }, 0, 0, D | E, "auth_type"},
> >>>  { "basic", "HTTP basic authentication", 0, AV_OPT_TYPE_CONST, {
> >>> .i64 = HTTP_AUTH_BASIC }, 0, 0, D | E, "auth_type"},
> >>> -{ "send_expect_100", "Force sending an Expect: 100-continue header
> >>> for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, 
> >>> E
> >>> },
> >>> +{ "send_expect_100", "Force sending an Expect: 100-continue header
> >>> for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 
> >>> 1,
> >>> E },
> >>>  { "location", "The actual location of the data received",
> >>> OFFSET(location), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, D | E },
> >>>  { "offset", "initial byte offset", OFFSET(off), AV_OPT_TYPE_INT64,
> >>> { .i64 = 0 }, 0, INT64_MAX, D },
> >>>  { "end_offset", "try to limit the request to bytes preceding this
> >>> offset", OFFSET(end_off), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT64_MAX, D
> >>> },
> >>> @@ -1179,16 +1180,21 @@ static int http_connect(URLContext *h, const
> >>> char *path, const char *local_path,
> >>>  local_path, method);
> >>>  proxyauthstr = ff_http_auth_create_response(>proxy_auth_state,
> >>> proxyauth,
> >>>  local_path, method);
> >>> -if (post && !s->post_data) {
> >>> -send_expect_100 = s->send_expect_100;
> >>> -/* The user has supplied authentication but we don't know the
> >>> auth type,
> >>> - * send Expect: 100-continue to get the 401 response including
> >>> the
> >>> - * WWW-Authenticate header, or an 100 continue if no auth
> >>> actually
> >>> - * is needed. */
> >>> -if (auth && *auth &&
> >>> -s->auth_state.auth_type == HTTP_AUTH_NONE &&
> >>> -s->http_code != 401)
> >>> -send_expect_100 = 1;
> >>> +
> >>> + if (post && !s->post_data) {
> >>> +if (s->send_expect_100 != -1) {
> >>> +send_expect_100 = s->send_expect_100;
> >>> +} else {
> >>> +send_expect_100 = 0;
> >>> +/* The user has supplied authentication but we don't know
> >>> the auth type,
> >>> + * send Expect: 100-continue to get the 401 response
> >>> including the
> >>> + * WWW-Authenticate header, or an 100 continue if no auth
> >>> actually
> >>> + * is needed. */
> >>> +if (auth && *auth &&
> >>> +s->auth_state.auth_type == HTTP_AUTH_NONE &&
> >>> +s->http_code != 401)
> >>> +send_expect_100 = 1;
> >>> +}
> >>>  }
> >>>
> >>>  #if FF_API_HTTP_USER_AGENT
> >>> diff --git a/libavformat/icecast.c b/libavformat/icecast.c
> >>> index c93b06b553..d2198b78ec 100644
> >>> --- a/libavformat/icecast.c
> >>> +++ b/libavformat/icecast.c
> >>> @@ -115,7 +115,7 @@ static int icecast_open(URLContext *h, const char
> >>> *uri, int flags)
> >>>  av_dict_set(_dict, "auth_type", "basic", 0);
> >>>  av_dict_set(_dict, "headers", headers, 0);
> >>>  av_dict_set(_dict, "chunked_post", "0", 0);
> >>> -av_dict_set(_dict, "send_expect_100", s->legacy_icecast ? "0" :
> >>> "1", 0);
> >>> +av_dict_set(_dict, "send_expect_100", s->legacy_icecast ? "-1"
> >>> : "1", 0);
> >>>  if (NOT_EMPTY(s->content_type))
> >>>  av_dict_set(_dict, "content_type", s->content_type, 

Re: [FFmpeg-devel] [PATCH v4] avformat/http, icecast, rtsp: Add option to disable send-100-continue

2019-03-29 Thread Jun Li
On Wed, Mar 27, 2019 at 11:27 PM Jun Li  wrote:

>
>
> On Mon, Mar 25, 2019 at 2:42 PM Jun Li  wrote:
>
>>
>>
>> On Fri, Mar 22, 2019 at 4:12 PM Jun Li  wrote:
>>
>>> The current setting for send-100-continue option is either
>>> enabled if applicable or forced enabled, no option to force
>>> disable the header. This change is to expand the option setting
>>> to provide more flexibility, which is useful for rstp case.
>>> ---
>>>  libavformat/http.c| 28 +---
>>>  libavformat/icecast.c |  2 +-
>>>  libavformat/rtsp.c|  1 +
>>>  3 files changed, 19 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/libavformat/http.c b/libavformat/http.c
>>> index 74d743850d..5a937994cf 100644
>>> --- a/libavformat/http.c
>>> +++ b/libavformat/http.c
>>> @@ -113,6 +113,7 @@ typedef struct HTTPContext {
>>>  uint8_t *inflate_buffer;
>>>  #endif /* CONFIG_ZLIB */
>>>  AVDictionary *chained_options;
>>> +/* -1 = try to send if applicable, 0 = always disabled, 1 = always
>>> enabled */
>>>  int send_expect_100;
>>>  char *method;
>>>  int reconnect;
>>> @@ -155,7 +156,7 @@ static const AVOption options[] = {
>>>  { "auth_type", "HTTP authentication type",
>>> OFFSET(auth_state.auth_type), AV_OPT_TYPE_INT, { .i64 = HTTP_AUTH_NONE },
>>> HTTP_AUTH_NONE, HTTP_AUTH_BASIC, D | E, "auth_type"},
>>>  { "none", "No auth method set, autodetect", 0, AV_OPT_TYPE_CONST, {
>>> .i64 = HTTP_AUTH_NONE }, 0, 0, D | E, "auth_type"},
>>>  { "basic", "HTTP basic authentication", 0, AV_OPT_TYPE_CONST, {
>>> .i64 = HTTP_AUTH_BASIC }, 0, 0, D | E, "auth_type"},
>>> -{ "send_expect_100", "Force sending an Expect: 100-continue header
>>> for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E
>>> },
>>> +{ "send_expect_100", "Force sending an Expect: 100-continue header
>>> for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1,
>>> E },
>>>  { "location", "The actual location of the data received",
>>> OFFSET(location), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, D | E },
>>>  { "offset", "initial byte offset", OFFSET(off), AV_OPT_TYPE_INT64,
>>> { .i64 = 0 }, 0, INT64_MAX, D },
>>>  { "end_offset", "try to limit the request to bytes preceding this
>>> offset", OFFSET(end_off), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT64_MAX, D
>>> },
>>> @@ -1179,16 +1180,21 @@ static int http_connect(URLContext *h, const
>>> char *path, const char *local_path,
>>>  local_path, method);
>>>  proxyauthstr = ff_http_auth_create_response(>proxy_auth_state,
>>> proxyauth,
>>>  local_path, method);
>>> -if (post && !s->post_data) {
>>> -send_expect_100 = s->send_expect_100;
>>> -/* The user has supplied authentication but we don't know the
>>> auth type,
>>> - * send Expect: 100-continue to get the 401 response including
>>> the
>>> - * WWW-Authenticate header, or an 100 continue if no auth
>>> actually
>>> - * is needed. */
>>> -if (auth && *auth &&
>>> -s->auth_state.auth_type == HTTP_AUTH_NONE &&
>>> -s->http_code != 401)
>>> -send_expect_100 = 1;
>>> +
>>> + if (post && !s->post_data) {
>>> +if (s->send_expect_100 != -1) {
>>> +send_expect_100 = s->send_expect_100;
>>> +} else {
>>> +send_expect_100 = 0;
>>> +/* The user has supplied authentication but we don't know
>>> the auth type,
>>> + * send Expect: 100-continue to get the 401 response
>>> including the
>>> + * WWW-Authenticate header, or an 100 continue if no auth
>>> actually
>>> + * is needed. */
>>> +if (auth && *auth &&
>>> +s->auth_state.auth_type == HTTP_AUTH_NONE &&
>>> +s->http_code != 401)
>>> +send_expect_100 = 1;
>>> +}
>>>  }
>>>
>>>  #if FF_API_HTTP_USER_AGENT
>>> diff --git a/libavformat/icecast.c b/libavformat/icecast.c
>>> index c93b06b553..d2198b78ec 100644
>>> --- a/libavformat/icecast.c
>>> +++ b/libavformat/icecast.c
>>> @@ -115,7 +115,7 @@ static int icecast_open(URLContext *h, const char
>>> *uri, int flags)
>>>  av_dict_set(_dict, "auth_type", "basic", 0);
>>>  av_dict_set(_dict, "headers", headers, 0);
>>>  av_dict_set(_dict, "chunked_post", "0", 0);
>>> -av_dict_set(_dict, "send_expect_100", s->legacy_icecast ? "0" :
>>> "1", 0);
>>> +av_dict_set(_dict, "send_expect_100", s->legacy_icecast ? "-1"
>>> : "1", 0);
>>>  if (NOT_EMPTY(s->content_type))
>>>  av_dict_set(_dict, "content_type", s->content_type, 0);
>>>  else
>>> diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
>>> index ae8811234a..6e67e411b9 100644
>>> --- a/libavformat/rtsp.c
>>> +++ b/libavformat/rtsp.c
>>> @@ -1793,6 +1793,7 @@ redirect:
>>>   sessioncookie);
>>>  

Re: [FFmpeg-devel] [PATCH v4] avformat/http, icecast, rtsp: Add option to disable send-100-continue

2019-03-28 Thread Jun Li
On Mon, Mar 25, 2019 at 2:42 PM Jun Li  wrote:

>
>
> On Fri, Mar 22, 2019 at 4:12 PM Jun Li  wrote:
>
>> The current setting for send-100-continue option is either
>> enabled if applicable or forced enabled, no option to force
>> disable the header. This change is to expand the option setting
>> to provide more flexibility, which is useful for rstp case.
>> ---
>>  libavformat/http.c| 28 +---
>>  libavformat/icecast.c |  2 +-
>>  libavformat/rtsp.c|  1 +
>>  3 files changed, 19 insertions(+), 12 deletions(-)
>>
>> diff --git a/libavformat/http.c b/libavformat/http.c
>> index 74d743850d..5a937994cf 100644
>> --- a/libavformat/http.c
>> +++ b/libavformat/http.c
>> @@ -113,6 +113,7 @@ typedef struct HTTPContext {
>>  uint8_t *inflate_buffer;
>>  #endif /* CONFIG_ZLIB */
>>  AVDictionary *chained_options;
>> +/* -1 = try to send if applicable, 0 = always disabled, 1 = always
>> enabled */
>>  int send_expect_100;
>>  char *method;
>>  int reconnect;
>> @@ -155,7 +156,7 @@ static const AVOption options[] = {
>>  { "auth_type", "HTTP authentication type",
>> OFFSET(auth_state.auth_type), AV_OPT_TYPE_INT, { .i64 = HTTP_AUTH_NONE },
>> HTTP_AUTH_NONE, HTTP_AUTH_BASIC, D | E, "auth_type"},
>>  { "none", "No auth method set, autodetect", 0, AV_OPT_TYPE_CONST, {
>> .i64 = HTTP_AUTH_NONE }, 0, 0, D | E, "auth_type"},
>>  { "basic", "HTTP basic authentication", 0, AV_OPT_TYPE_CONST, { .i64
>> = HTTP_AUTH_BASIC }, 0, 0, D | E, "auth_type"},
>> -{ "send_expect_100", "Force sending an Expect: 100-continue header
>> for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E
>> },
>> +{ "send_expect_100", "Force sending an Expect: 100-continue header
>> for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1,
>> E },
>>  { "location", "The actual location of the data received",
>> OFFSET(location), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, D | E },
>>  { "offset", "initial byte offset", OFFSET(off), AV_OPT_TYPE_INT64, {
>> .i64 = 0 }, 0, INT64_MAX, D },
>>  { "end_offset", "try to limit the request to bytes preceding this
>> offset", OFFSET(end_off), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT64_MAX, D
>> },
>> @@ -1179,16 +1180,21 @@ static int http_connect(URLContext *h, const char
>> *path, const char *local_path,
>>  local_path, method);
>>  proxyauthstr = ff_http_auth_create_response(>proxy_auth_state,
>> proxyauth,
>>  local_path, method);
>> -if (post && !s->post_data) {
>> -send_expect_100 = s->send_expect_100;
>> -/* The user has supplied authentication but we don't know the
>> auth type,
>> - * send Expect: 100-continue to get the 401 response including
>> the
>> - * WWW-Authenticate header, or an 100 continue if no auth
>> actually
>> - * is needed. */
>> -if (auth && *auth &&
>> -s->auth_state.auth_type == HTTP_AUTH_NONE &&
>> -s->http_code != 401)
>> -send_expect_100 = 1;
>> +
>> + if (post && !s->post_data) {
>> +if (s->send_expect_100 != -1) {
>> +send_expect_100 = s->send_expect_100;
>> +} else {
>> +send_expect_100 = 0;
>> +/* The user has supplied authentication but we don't know
>> the auth type,
>> + * send Expect: 100-continue to get the 401 response
>> including the
>> + * WWW-Authenticate header, or an 100 continue if no auth
>> actually
>> + * is needed. */
>> +if (auth && *auth &&
>> +s->auth_state.auth_type == HTTP_AUTH_NONE &&
>> +s->http_code != 401)
>> +send_expect_100 = 1;
>> +}
>>  }
>>
>>  #if FF_API_HTTP_USER_AGENT
>> diff --git a/libavformat/icecast.c b/libavformat/icecast.c
>> index c93b06b553..d2198b78ec 100644
>> --- a/libavformat/icecast.c
>> +++ b/libavformat/icecast.c
>> @@ -115,7 +115,7 @@ static int icecast_open(URLContext *h, const char
>> *uri, int flags)
>>  av_dict_set(_dict, "auth_type", "basic", 0);
>>  av_dict_set(_dict, "headers", headers, 0);
>>  av_dict_set(_dict, "chunked_post", "0", 0);
>> -av_dict_set(_dict, "send_expect_100", s->legacy_icecast ? "0" :
>> "1", 0);
>> +av_dict_set(_dict, "send_expect_100", s->legacy_icecast ? "-1" :
>> "1", 0);
>>  if (NOT_EMPTY(s->content_type))
>>  av_dict_set(_dict, "content_type", s->content_type, 0);
>>  else
>> diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
>> index ae8811234a..6e67e411b9 100644
>> --- a/libavformat/rtsp.c
>> +++ b/libavformat/rtsp.c
>> @@ -1793,6 +1793,7 @@ redirect:
>>   sessioncookie);
>>  av_opt_set(rt->rtsp_hd_out->priv_data, "headers", headers, 0);
>>  av_opt_set(rt->rtsp_hd_out->priv_data, "chunked_post", "0", 0);
>> +av_opt_set(rt->rtsp_hd_out->priv_data, 

Re: [FFmpeg-devel] [PATCH v4] avformat/http, icecast, rtsp: Add option to disable send-100-continue

2019-03-25 Thread Jun Li
On Fri, Mar 22, 2019 at 4:12 PM Jun Li  wrote:

> The current setting for send-100-continue option is either
> enabled if applicable or forced enabled, no option to force
> disable the header. This change is to expand the option setting
> to provide more flexibility, which is useful for rstp case.
> ---
>  libavformat/http.c| 28 +---
>  libavformat/icecast.c |  2 +-
>  libavformat/rtsp.c|  1 +
>  3 files changed, 19 insertions(+), 12 deletions(-)
>
> diff --git a/libavformat/http.c b/libavformat/http.c
> index 74d743850d..5a937994cf 100644
> --- a/libavformat/http.c
> +++ b/libavformat/http.c
> @@ -113,6 +113,7 @@ typedef struct HTTPContext {
>  uint8_t *inflate_buffer;
>  #endif /* CONFIG_ZLIB */
>  AVDictionary *chained_options;
> +/* -1 = try to send if applicable, 0 = always disabled, 1 = always
> enabled */
>  int send_expect_100;
>  char *method;
>  int reconnect;
> @@ -155,7 +156,7 @@ static const AVOption options[] = {
>  { "auth_type", "HTTP authentication type",
> OFFSET(auth_state.auth_type), AV_OPT_TYPE_INT, { .i64 = HTTP_AUTH_NONE },
> HTTP_AUTH_NONE, HTTP_AUTH_BASIC, D | E, "auth_type"},
>  { "none", "No auth method set, autodetect", 0, AV_OPT_TYPE_CONST, {
> .i64 = HTTP_AUTH_NONE }, 0, 0, D | E, "auth_type"},
>  { "basic", "HTTP basic authentication", 0, AV_OPT_TYPE_CONST, { .i64
> = HTTP_AUTH_BASIC }, 0, 0, D | E, "auth_type"},
> -{ "send_expect_100", "Force sending an Expect: 100-continue header
> for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E
> },
> +{ "send_expect_100", "Force sending an Expect: 100-continue header
> for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1,
> E },
>  { "location", "The actual location of the data received",
> OFFSET(location), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, D | E },
>  { "offset", "initial byte offset", OFFSET(off), AV_OPT_TYPE_INT64, {
> .i64 = 0 }, 0, INT64_MAX, D },
>  { "end_offset", "try to limit the request to bytes preceding this
> offset", OFFSET(end_off), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT64_MAX, D
> },
> @@ -1179,16 +1180,21 @@ static int http_connect(URLContext *h, const char
> *path, const char *local_path,
>  local_path, method);
>  proxyauthstr = ff_http_auth_create_response(>proxy_auth_state,
> proxyauth,
>  local_path, method);
> -if (post && !s->post_data) {
> -send_expect_100 = s->send_expect_100;
> -/* The user has supplied authentication but we don't know the
> auth type,
> - * send Expect: 100-continue to get the 401 response including the
> - * WWW-Authenticate header, or an 100 continue if no auth actually
> - * is needed. */
> -if (auth && *auth &&
> -s->auth_state.auth_type == HTTP_AUTH_NONE &&
> -s->http_code != 401)
> -send_expect_100 = 1;
> +
> + if (post && !s->post_data) {
> +if (s->send_expect_100 != -1) {
> +send_expect_100 = s->send_expect_100;
> +} else {
> +send_expect_100 = 0;
> +/* The user has supplied authentication but we don't know the
> auth type,
> + * send Expect: 100-continue to get the 401 response
> including the
> + * WWW-Authenticate header, or an 100 continue if no auth
> actually
> + * is needed. */
> +if (auth && *auth &&
> +s->auth_state.auth_type == HTTP_AUTH_NONE &&
> +s->http_code != 401)
> +send_expect_100 = 1;
> +}
>  }
>
>  #if FF_API_HTTP_USER_AGENT
> diff --git a/libavformat/icecast.c b/libavformat/icecast.c
> index c93b06b553..d2198b78ec 100644
> --- a/libavformat/icecast.c
> +++ b/libavformat/icecast.c
> @@ -115,7 +115,7 @@ static int icecast_open(URLContext *h, const char
> *uri, int flags)
>  av_dict_set(_dict, "auth_type", "basic", 0);
>  av_dict_set(_dict, "headers", headers, 0);
>  av_dict_set(_dict, "chunked_post", "0", 0);
> -av_dict_set(_dict, "send_expect_100", s->legacy_icecast ? "0" :
> "1", 0);
> +av_dict_set(_dict, "send_expect_100", s->legacy_icecast ? "-1" :
> "1", 0);
>  if (NOT_EMPTY(s->content_type))
>  av_dict_set(_dict, "content_type", s->content_type, 0);
>  else
> diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
> index ae8811234a..6e67e411b9 100644
> --- a/libavformat/rtsp.c
> +++ b/libavformat/rtsp.c
> @@ -1793,6 +1793,7 @@ redirect:
>   sessioncookie);
>  av_opt_set(rt->rtsp_hd_out->priv_data, "headers", headers, 0);
>  av_opt_set(rt->rtsp_hd_out->priv_data, "chunked_post", "0", 0);
> +av_opt_set(rt->rtsp_hd_out->priv_data, "send_expect_100", "0", 0);
>
>  /* Initialize the authentication state for the POST session. The
> HTTP
>   * protocol implementation doesn't properly