|
@@ -643,14 +643,16 @@ static void http_step ( struct http_request *http ) {
|
643
|
643
|
size_t user_pw_len = ( user ? ( strlen ( user ) + 1 /* ":" */ +
|
644
|
644
|
strlen ( password ) ) : 0 );
|
645
|
645
|
size_t user_pw_base64_len = base64_encoded_len ( user_pw_len );
|
646
|
|
- uint8_t user_pw[ user_pw_len + 1 /* NUL */ ];
|
647
|
|
- char user_pw_base64[ user_pw_base64_len + 1 /* NUL */ ];
|
648
|
|
- int rc;
|
649
|
646
|
int request_len = unparse_uri ( NULL, 0, http->uri,
|
650
|
647
|
URI_PATH_BIT | URI_QUERY_BIT );
|
651
|
|
- char request[ request_len + 1 /* NUL */ ];
|
652
|
|
- char range[48]; /* Enough for two 64-bit integers in decimal */
|
|
648
|
+ struct {
|
|
649
|
+ uint8_t user_pw[ user_pw_len + 1 /* NUL */ ];
|
|
650
|
+ char user_pw_base64[ user_pw_base64_len + 1 /* NUL */ ];
|
|
651
|
+ char request[ request_len + 1 /* NUL */ ];
|
|
652
|
+ char range[48]; /* Enough for two 64-bit integers in decimal */
|
|
653
|
+ } *dynamic;
|
653
|
654
|
int partial;
|
|
655
|
+ int rc;
|
654
|
656
|
|
655
|
657
|
/* Do nothing if we have already transmitted the request */
|
656
|
658
|
if ( ! ( http->flags & HTTP_TX_PENDING ) )
|
|
@@ -660,18 +662,27 @@ static void http_step ( struct http_request *http ) {
|
660
|
662
|
if ( ! xfer_window ( &http->socket ) )
|
661
|
663
|
return;
|
662
|
664
|
|
|
665
|
+ /* Allocate dynamic storage */
|
|
666
|
+ dynamic = malloc ( sizeof ( *dynamic ) );
|
|
667
|
+ if ( ! malloc ) {
|
|
668
|
+ rc = -ENOMEM;
|
|
669
|
+ goto err_alloc;
|
|
670
|
+ }
|
|
671
|
+
|
663
|
672
|
/* Construct path?query request */
|
664
|
|
- unparse_uri ( request, sizeof ( request ), http->uri,
|
|
673
|
+ unparse_uri ( dynamic->request, sizeof ( dynamic->request ), http->uri,
|
665
|
674
|
URI_PATH_BIT | URI_QUERY_BIT );
|
666
|
675
|
|
667
|
676
|
/* Construct authorisation, if applicable */
|
668
|
677
|
if ( user ) {
|
669
|
678
|
/* Make "user:password" string from decoded fields */
|
670
|
|
- snprintf ( ( ( char * ) user_pw ), sizeof ( user_pw ),
|
671
|
|
- "%s:%s", user, password );
|
|
679
|
+ snprintf ( ( ( char * ) dynamic->user_pw ),
|
|
680
|
+ sizeof ( dynamic->user_pw ), "%s:%s",
|
|
681
|
+ user, password );
|
672
|
682
|
|
673
|
683
|
/* Base64-encode the "user:password" string */
|
674
|
|
- base64_encode ( user_pw, user_pw_len, user_pw_base64 );
|
|
684
|
+ base64_encode ( dynamic->user_pw, user_pw_len,
|
|
685
|
+ dynamic->user_pw_base64 );
|
675
|
686
|
}
|
676
|
687
|
|
677
|
688
|
/* Force a HEAD request if we have nowhere to send any received data */
|
|
@@ -682,7 +693,8 @@ static void http_step ( struct http_request *http ) {
|
682
|
693
|
|
683
|
694
|
/* Determine type of request */
|
684
|
695
|
partial = ( http->partial_len != 0 );
|
685
|
|
- snprintf ( range, sizeof ( range ), "%zd-%zd", http->partial_start,
|
|
696
|
+ snprintf ( dynamic->range, sizeof ( dynamic->range ),
|
|
697
|
+ "%zd-%zd", http->partial_start,
|
686
|
698
|
( http->partial_start + http->partial_len - 1 ) );
|
687
|
699
|
|
688
|
700
|
/* Mark request as transmitted */
|
|
@@ -698,7 +710,7 @@ static void http_step ( struct http_request *http ) {
|
698
|
710
|
( ( http->flags & HTTP_HEAD_ONLY ) ?
|
699
|
711
|
"HEAD" : "GET" ),
|
700
|
712
|
( http->uri->path ? "" : "/" ),
|
701
|
|
- request, host,
|
|
713
|
+ dynamic->request, host,
|
702
|
714
|
( http->uri->port ?
|
703
|
715
|
":" : "" ),
|
704
|
716
|
( http->uri->port ?
|
|
@@ -706,14 +718,20 @@ static void http_step ( struct http_request *http ) {
|
706
|
718
|
( ( http->flags & HTTP_KEEPALIVE ) ?
|
707
|
719
|
"Connection: Keep-Alive\r\n" : "" ),
|
708
|
720
|
( partial ? "Range: bytes=" : "" ),
|
709
|
|
- ( partial ? range : "" ),
|
|
721
|
+ ( partial ? dynamic->range : "" ),
|
710
|
722
|
( partial ? "\r\n" : "" ),
|
711
|
723
|
( user ?
|
712
|
724
|
"Authorization: Basic " : "" ),
|
713
|
|
- ( user ? user_pw_base64 : "" ),
|
|
725
|
+ ( user ? dynamic->user_pw_base64 : "" ),
|
714
|
726
|
( user ? "\r\n" : "" ) ) ) != 0 ) {
|
715
|
|
- http_close ( http, rc );
|
|
727
|
+ goto err_xfer;
|
716
|
728
|
}
|
|
729
|
+
|
|
730
|
+ err_xfer:
|
|
731
|
+ free ( dynamic );
|
|
732
|
+ err_alloc:
|
|
733
|
+ if ( rc != 0 )
|
|
734
|
+ http_close ( http, rc );
|
717
|
735
|
}
|
718
|
736
|
|
719
|
737
|
/**
|