@ -79,6 +79,7 @@ typedef struct {
uint8_t * inflate_buffer ;
# endif
AVDictionary * chained_options ;
int send_expect_100 ;
} HTTPContext ;
# define OFFSET(x) offsetof(HTTPContext, x)
@ -101,6 +102,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_INT , { . i64 = 0 } , 0 , 1 , E , " auth_type " } ,
{ NULL }
} ;
# define HTTP_CLASS(flavor)\
@ -583,6 +585,7 @@ static int http_connect(URLContext *h, const char *path, const char *local_path,
int64_t off = s - > off ;
int len = 0 ;
const char * method ;
int send_expect_100 = 0 ;
/* send http header */
@ -600,6 +603,16 @@ static int http_connect(URLContext *h, const char *path, const char *local_path,
method ) ;
proxyauthstr = ff_http_auth_create_response ( & s - > 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 & & s - > auth_state . auth_type = = HTTP_AUTH_NONE & &
s - > http_code ! = 401 )
send_expect_100 = 1 ;
}
/* set default headers if needed */
if ( ! has_header ( s - > headers , " \r \n User-Agent: " ) )
@ -614,6 +627,9 @@ static int http_connect(URLContext *h, const char *path, const char *local_path,
if ( ! has_header ( s - > headers , " \r \n Range: " ) & & ! post & & ( s - > off > 0 | | s - > seekable = = - 1 ) )
len + = av_strlcatf ( headers + len , sizeof ( headers ) - len ,
" Range: bytes=% " PRId64 " - \r \n " , s - > off ) ;
if ( send_expect_100 & & ! has_header ( s - > headers , " \r \n Expect: " ) )
len + = av_strlcatf ( headers + len , sizeof ( headers ) - len ,
" Expect: 100-continue \r \n " ) ;
if ( ! has_header ( s - > headers , " \r \n Connection: " ) ) {
if ( s - > multiple_requests ) {
@ -684,7 +700,7 @@ static int http_connect(URLContext *h, const char *path, const char *local_path,
s - > willclose = 0 ;
s - > end_chunked_post = 0 ;
s - > end_header = 0 ;
if ( post & & ! s - > post_data ) {
if ( post & & ! s - > post_data & & ! send_expect_100 ) {
/* Pretend that it did work. We didn't read any header yet, since
* we ' ve still to send the POST data , but the code calling this
* function will check http_code after we return . */