@@ -53,7 +53,7 @@ static http_t *http_create(const char *host, int port,
5353static void http_debug_hex (const char * prefix , const char * buffer ,
5454 int bytes );
5555#endif /* DEBUG */
56- static ssize_t http_read (http_t * http , char * buffer , size_t length );
56+ static ssize_t http_read (http_t * http , char * buffer , size_t length , int timeout );
5757static ssize_t http_read_buffered (http_t * http , char * buffer , size_t length );
5858static ssize_t http_read_chunk (http_t * http , char * buffer , size_t length );
5959static int http_send (http_t * http , http_state_t request ,
@@ -1206,7 +1206,7 @@ httpGets(char *line, /* I - Line to read into */
12061206 return (NULL );
12071207 }
12081208
1209- bytes = http_read (http , http -> buffer + http -> used , (size_t )(HTTP_MAX_BUFFER - http -> used ));
1209+ bytes = http_read (http , http -> buffer + http -> used , (size_t )(_HTTP_MAX_BUFFER - http -> used ), http -> wait_value );
12101210
12111211 DEBUG_printf (("4httpGets: read " CUPS_LLFMT " bytes." , CUPS_LLCAST bytes ));
12121212
@@ -1726,24 +1726,13 @@ httpPeek(http_t *http, /* I - HTTP connection */
17261726
17271727 ssize_t buflen ; /* Length of read for buffer */
17281728
1729- if (!http -> blocking )
1730- {
1731- while (!httpWait (http , http -> wait_value ))
1732- {
1733- if (http -> timeout_cb && (* http -> timeout_cb )(http , http -> timeout_data ))
1734- continue ;
1735-
1736- return (0 );
1737- }
1738- }
1739-
17401729 if ((size_t )http -> data_remaining > sizeof (http -> buffer ))
17411730 buflen = sizeof (http -> buffer );
17421731 else
17431732 buflen = (ssize_t )http -> data_remaining ;
17441733
17451734 DEBUG_printf (("2httpPeek: Reading %d bytes into buffer." , (int )buflen ));
1746- bytes = http_read (http , http -> buffer , (size_t )buflen );
1735+ bytes = http_read (http , http -> buffer , (size_t )buflen , http -> wait_value );
17471736
17481737 DEBUG_printf (("2httpPeek: Read " CUPS_LLFMT " bytes into buffer." ,
17491738 CUPS_LLCAST bytes ));
@@ -1764,9 +1753,9 @@ httpPeek(http_t *http, /* I - HTTP connection */
17641753 int zerr ; /* Decompressor error */
17651754 z_stream stream ; /* Copy of decompressor stream */
17661755
1767- if (http -> used > 0 && ((z_stream * )http -> stream )-> avail_in < HTTP_MAX_BUFFER )
1756+ if (http -> used > 0 && ((z_stream * )http -> stream )-> avail_in < _HTTP_MAX_BUFFER )
17681757 {
1769- size_t buflen = HTTP_MAX_BUFFER - ((z_stream * )http -> stream )-> avail_in ;
1758+ size_t buflen = _HTTP_MAX_BUFFER - ((z_stream * )http -> stream )-> avail_in ;
17701759 /* Number of bytes to copy */
17711760
17721761 if (((z_stream * )http -> stream )-> avail_in > 0 &&
@@ -2024,7 +2013,7 @@ httpRead2(http_t *http, /* I - HTTP connection */
20242013
20252014 if (bytes == 0 )
20262015 {
2027- ssize_t buflen = HTTP_MAX_BUFFER - (ssize_t )((z_stream * )http -> stream )-> avail_in ;
2016+ ssize_t buflen = _HTTP_MAX_BUFFER - (ssize_t )((z_stream * )http -> stream )-> avail_in ;
20282017 /* Additional bytes for buffer */
20292018
20302019 if (buflen > 0 )
@@ -2774,20 +2763,54 @@ int /* O - 1 to continue, 0 to stop */
27742763_httpUpdate (http_t * http , /* I - HTTP connection */
27752764 http_status_t * status ) /* O - Current HTTP status */
27762765{
2777- char line [32768 ], /* Line from connection... */
2766+ char line [_HTTP_MAX_BUFFER ], /* Line from connection... */
27782767 * value ; /* Pointer to value on line */
27792768 http_field_t field ; /* Field index */
27802769 int major , minor ; /* HTTP version numbers */
27812770
27822771
27832772 DEBUG_printf (("_httpUpdate(http=%p, status=%p), state=%s" , (void * )http , (void * )status , httpStateString (http -> state )));
27842773
2774+ /* When doing non-blocking I/O, make sure we have a whole line... */
2775+ if (!http -> blocking )
2776+ {
2777+ ssize_t bytes ; /* Bytes "peeked" from connection */
2778+
2779+ /* See whether our read buffer is full... */
2780+ DEBUG_printf (("2_httpUpdate: used=%d" , http -> used ));
2781+
2782+ if (http -> used > 0 && !memchr (http -> buffer , '\n' , (size_t )http -> used ) && (size_t )http -> used < sizeof (http -> buffer ))
2783+ {
2784+ /* No, try filling in more data... */
2785+ if ((bytes = http_read (http , http -> buffer + http -> used , sizeof (http -> buffer ) - (size_t )http -> used , /*timeout*/ 0 )) > 0 )
2786+ {
2787+ DEBUG_printf (("2_httpUpdate: Read %d bytes." , (int )bytes ));
2788+ http -> used += (int )bytes ;
2789+ }
2790+ }
2791+
2792+ /* Peek at the incoming data... */
2793+ if (!http -> used || !memchr (http -> buffer , '\n' , (size_t )http -> used ))
2794+ {
2795+ /* Don't have a full line, tell the reader to try again when there is more data... */
2796+ DEBUG_puts ("1_htttpUpdate: No newline in buffer yet." );
2797+ if ((size_t )http -> used == sizeof (http -> buffer ))
2798+ * status = HTTP_STATUS_ERROR ;
2799+ else
2800+ * status = HTTP_STATUS_CONTINUE ;
2801+ return (0 );
2802+ }
2803+
2804+ DEBUG_puts ("2_httpUpdate: Found newline in buffer." );
2805+ }
2806+
27852807 /*
27862808 * Grab a single line from the connection...
27872809 */
27882810
27892811 if (!httpGets (line , sizeof (line ), http ))
27902812 {
2813+ DEBUG_puts ("1_httpUpdate: Error reading request line." );
27912814 * status = HTTP_STATUS_ERROR ;
27922815 return (0 );
27932816 }
@@ -4140,7 +4163,8 @@ http_debug_hex(const char *prefix, /* I - Prefix for line */
41404163static ssize_t /* O - Number of bytes read or -1 on error */
41414164http_read (http_t * http , /* I - HTTP connection */
41424165 char * buffer , /* I - Buffer */
4143- size_t length ) /* I - Maximum bytes to read */
4166+ size_t length , /* I - Maximum bytes to read */
4167+ int timeout ) /* I - Wait timeout */
41444168{
41454169 ssize_t bytes ; /* Bytes read */
41464170
@@ -4149,7 +4173,7 @@ http_read(http_t *http, /* I - HTTP connection */
41494173
41504174 if (!http -> blocking || http -> timeout_value > 0.0 )
41514175 {
4152- while (!httpWait (http , http -> wait_value ))
4176+ while (!_httpWait (http , timeout , 1 ))
41534177 {
41544178 if (http -> timeout_cb && (* http -> timeout_cb )(http , http -> timeout_data ))
41554179 continue ;
@@ -4252,7 +4276,7 @@ http_read_buffered(http_t *http, /* I - HTTP connection */
42524276 else
42534277 bytes = (ssize_t )length ;
42544278
4255- DEBUG_printf (("8http_read : Grabbing %d bytes from input buffer." ,
4279+ DEBUG_printf (("8http_read_buffered : Grabbing %d bytes from input buffer." ,
42564280 (int )bytes ));
42574281
42584282 memcpy (buffer , http -> buffer , (size_t )bytes );
@@ -4262,7 +4286,7 @@ http_read_buffered(http_t *http, /* I - HTTP connection */
42624286 memmove (http -> buffer , http -> buffer + bytes , (size_t )http -> used );
42634287 }
42644288 else
4265- bytes = http_read (http , buffer , length );
4289+ bytes = http_read (http , buffer , length , http -> wait_value );
42664290
42674291 return (bytes );
42684292}
@@ -4603,15 +4627,15 @@ http_set_timeout(int fd, /* I - File descriptor */
46034627static void
46044628http_set_wait (http_t * http ) /* I - HTTP connection */
46054629{
4606- if (http -> blocking )
4607- {
4608- http -> wait_value = (int )(http -> timeout_value * 1000 );
4630+ http -> wait_value = (int )(http -> timeout_value * 1000 );
46094631
4610- if (http -> wait_value <= 0 )
4632+ if (http -> wait_value <= 0 )
4633+ {
4634+ if (http -> blocking )
46114635 http -> wait_value = 60000 ;
4636+ else
4637+ http -> wait_value = 1000 ;
46124638 }
4613- else
4614- http -> wait_value = 10000 ;
46154639}
46164640
46174641
0 commit comments