Changeset 9a09212 in mainline


Ignore:
Timestamp:
2017-12-04T20:22:45Z (6 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
82d515e9
Parents:
0fb1755
Message:

Libhttp should not mix error codes and number of bytes transferred.

Location:
uspace
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/download/main.c

    r0fb1755 r9a09212  
    224224                }
    225225               
    226                 int body_size;
    227                 while ((body_size = recv_buffer(&http->recv_buffer, buf, buf_size)) > 0) {
     226                size_t body_size;
     227                while ((rc = recv_buffer(&http->recv_buffer, buf, buf_size, &body_size)) == EOK && body_size > 0) {
    228228                        fwrite(buf, 1, body_size, ofile != NULL ? ofile : stdout);
    229229                }
  • uspace/lib/http/include/http/receive-buffer.h

    r0fb1755 r9a09212  
    4646 * @param buf buffer to store the data
    4747 * @param buf_size buffer size
    48  * @return number of bytes received or negative error code
     48 * @param nrecv number of bytes actually received
     49 * @return EOK on success or error code
    4950 */
    50 typedef ssize_t (*receive_func_t)(void *, void *, size_t);
     51typedef int (*receive_func_t)(void *, void *, size_t, size_t *);
    5152
    5253typedef struct {
     
    8182    receive_buffer_mark_t *, char **);
    8283extern int recv_char(receive_buffer_t *, char *, bool);
    83 extern ssize_t recv_buffer(receive_buffer_t *, char *, size_t);
    84 extern ssize_t recv_discard(receive_buffer_t *, char);
    85 extern ssize_t recv_discard_str(receive_buffer_t *, const char *);
    86 extern ssize_t recv_while(receive_buffer_t *, char_class_func_t);
    87 extern ssize_t recv_eol(receive_buffer_t *);
    88 extern ssize_t recv_line(receive_buffer_t *, char *, size_t);
     84extern int recv_buffer(receive_buffer_t *, char *, size_t, size_t *);
     85extern int recv_discard(receive_buffer_t *, char, size_t *);
     86extern int recv_discard_str(receive_buffer_t *, const char *, size_t *);
     87extern int recv_while(receive_buffer_t *, char_class_func_t);
     88extern int recv_eol(receive_buffer_t *, size_t *);
     89extern int recv_line(receive_buffer_t *, char *, size_t, size_t *);
    8990
    9091#endif
  • uspace/lib/http/src/headers.c

    r0fb1755 r9a09212  
    146146                        continue;
    147147               
    148                 rc = recv_discard(rb, (c == '\r' ? '\n' : '\r'));
    149                 if (rc < 0)
     148                size_t nrecv;
     149                rc = recv_discard(rb, (c == '\r' ? '\n' : '\r'), &nrecv);
     150                if (rc != EOK)
    150151                        return rc;
    151152               
  • uspace/lib/http/src/http.c

    r0fb1755 r9a09212  
    4747#include <http/receive-buffer.h>
    4848
    49 static ssize_t http_receive(void *client_data, void *buf, size_t buf_size)
     49static int http_receive(void *client_data, void *buf, size_t buf_size,
     50    size_t *nrecv)
    5051{
    5152        http_t *http = client_data;
    52         size_t nrecv;
    53         int rc;
    5453
    55         rc = tcp_conn_recv_wait(http->conn, buf, buf_size, &nrecv);
    56         if (rc != EOK)
    57                 return rc;
    58 
    59         return nrecv;
     54        return tcp_conn_recv_wait(http->conn, buf, buf_size, nrecv);
    6055}
    6156
  • uspace/lib/http/src/receive-buffer.c

    r0fb1755 r9a09212  
    6161}
    6262
    63 static ssize_t dummy_receive(void *unused, void *buf, size_t buf_size)
    64 {
    65         return 0;
     63static int dummy_receive(void *unused, void *buf, size_t buf_size,
     64    size_t *nrecv)
     65{
     66        *nrecv = 0;
     67        return EOK;
    6668}
    6769
     
    167169                }
    168170               
    169                 ssize_t rc = rb->receive(rb->client_data, rb->buffer + rb->in, free);
    170                 if (rc <= 0)
     171                size_t nrecv;
     172                int rc = rb->receive(rb->client_data, rb->buffer + rb->in, free, &nrecv);
     173                if (rc != EOK)
    171174                        return rc;
    172175               
    173                 rb->in = rc;
     176                rb->in = nrecv;
    174177        }
    175178       
     
    180183}
    181184
    182 ssize_t recv_buffer(receive_buffer_t *rb, char *buf, size_t buf_size)
    183 {
    184         /* Flush any buffered data*/
     185int recv_buffer(receive_buffer_t *rb, char *buf, size_t buf_size,
     186    size_t *nrecv)
     187{
     188        /* Flush any buffered data */
    185189        if (rb->out != rb->in) {
    186190                size_t size = min(rb->in - rb->out, buf_size);
    187191                memcpy(buf, rb->buffer + rb->out, size);
    188192                rb->out += size;
    189                 return size;
    190         }
    191        
    192         return rb->receive(rb->client_data, buf, buf_size);
     193                *nrecv = size;
     194                return EOK;
     195        }
     196       
     197        return rb->receive(rb->client_data, buf, buf_size, nrecv);
    193198}
    194199
    195200/** Receive a character and if it is c, discard it from input buffer
    196  * @return number of characters discarded (0 or 1) or negative error code
    197  */
    198 ssize_t recv_discard(receive_buffer_t *rb, char discard)
     201 * @param ndisc Place to store number of characters discarded
     202 * @return EOK or error code
     203 */
     204int recv_discard(receive_buffer_t *rb, char discard, size_t *ndisc)
    199205{
    200206        char c = 0;
     
    202208        if (rc != EOK)
    203209                return rc;
    204         if (c != discard)
    205                 return 0;
     210        if (c != discard) {
     211                *ndisc = 0;
     212                return EOK;
     213        }
    206214        rc = recv_char(rb, &c, true);
    207215        if (rc != EOK)
    208216                return rc;
    209         return 1;
     217        *ndisc = 1;
     218        return EOK;
    210219}
    211220
    212221/** Receive a prefix of constant string discard and return number of bytes read
    213  * @return number of characters discarded or negative error code
    214  */
    215 ssize_t recv_discard_str(receive_buffer_t *rb, const char *discard)
     222 * @param ndisc Place to store number of characters discarded
     223 * @return EOK or error code
     224 */
     225int recv_discard_str(receive_buffer_t *rb, const char *discard, size_t *ndisc)
    216226{
    217227        size_t discarded = 0;
    218228        while (*discard) {
    219                 ssize_t rc = recv_discard(rb, *discard);
    220                 if (rc < 0)
    221                         return rc;
    222                 if (rc == 0)
     229                size_t nd;
     230                int rc = recv_discard(rb, *discard, &nd);
     231                if (rc != EOK)
     232                        return rc;
     233                if (nd == 0)
    223234                        break;
    224                 discarded++;
     235                discarded += nd;
    225236                discard++;
    226237        }
    227         return discarded;
    228 }
    229 
    230 ssize_t recv_while(receive_buffer_t *rb, char_class_func_t class)
    231 {
    232         size_t received = 0;
    233        
     238
     239        *ndisc = discarded;
     240        return EOK;
     241}
     242
     243int recv_while(receive_buffer_t *rb, char_class_func_t class)
     244{
    234245        while (true) {
    235246                char c = 0;
     
    244255                if (rc != EOK)
    245256                        return rc;
    246                
    247                 received++;
    248         }
    249        
    250         return received;
     257        }
     258       
     259        return EOK;
    251260}
    252261
    253262/** Receive an end of line, either CR, LF, CRLF or LFCR
    254263 *
    255  * @return number of bytes read (0 if no newline is present in the stream)
    256  *         or negative error code
    257  */
    258 ssize_t recv_eol(receive_buffer_t *rb)
     264 * @param nrecv Place to store number of bytes received (zero if
     265 *              no newline is present in the stream)
     266 * @return EOK on success or error code
     267 */
     268int recv_eol(receive_buffer_t *rb, size_t *nrecv)
    259269{
    260270        char c = 0;
     
    263273                return rc;
    264274       
    265         if (c != '\r' && c != '\n')
    266                 return 0;
     275        if (c != '\r' && c != '\n') {
     276                *nrecv = 0;
     277                return EOK;
     278        }
    267279       
    268280        rc = recv_char(rb, &c, true);
     
    270282                return rc;
    271283       
    272         ssize_t rc2 = recv_discard(rb, (c == '\r' ? '\n' : '\r'));
    273         if (rc2 < 0)
    274                 return rc2;
    275        
    276         return 1 + rc2;
     284        size_t nr;
     285        rc = recv_discard(rb, (c == '\r' ? '\n' : '\r'), &nr);
     286        if (rc != EOK)
     287                return rc;
     288       
     289        *nrecv = 1 + nr;
     290        return EOK;
    277291}
    278292
    279293/* Receive a single line */
    280 ssize_t recv_line(receive_buffer_t *rb, char *line, size_t size)
     294int recv_line(receive_buffer_t *rb, char *line, size_t size, size_t *nrecv)
    281295{
    282296        size_t written = 0;
     297        size_t nr;
    283298       
    284299        while (written < size) {
     
    288303                        return rc;
    289304                if (c == '\n') {
    290                         recv_discard(rb, '\r');
     305                        rc = recv_discard(rb, '\r', &nr);
     306                        if (rc != EOK)
     307                                return rc;
     308
    291309                        line[written++] = 0;
    292                         return written;
     310                        *nrecv = written;
     311                        return EOK;
    293312                }
    294313                else if (c == '\r') {
    295                         recv_discard(rb, '\n');
     314                        rc = recv_discard(rb, '\n', &nr);
     315                        if (rc != EOK)
     316                                return rc;
    296317                        line[written++] = 0;
    297                         return written;
     318                        *nrecv = written;
     319                        return EOK;
    298320                }
    299321                line[written++] = c;
  • uspace/lib/http/src/response.c

    r0fb1755 r9a09212  
    9696static int expect(receive_buffer_t *rb, const char *expect)
    9797{
    98         int rc = recv_discard_str(rb, expect);
    99         if (rc < 0)
    100                 return rc;
    101         if ((size_t) rc < str_length(expect))
     98        size_t ndisc;
     99        int rc = recv_discard_str(rb, expect, &ndisc);
     100        if (rc != EOK)
     101                return rc;
     102        if (ndisc < str_length(expect))
    102103                return HTTP_EPARSE;
    103104        return EOK;
     
    168169        recv_unmark(rb, &msg_end);
    169170       
    170         rc = recv_eol(rb);
    171         if (rc == 0)
     171        size_t nrecv;
     172        rc = recv_eol(rb, &nrecv);
     173        if (rc == EOK && nrecv == 0)
    172174                rc = HTTP_EPARSE;
    173         if (rc < 0) {
     175        if (rc != EOK) {
    174176                free(message);
    175177                return rc;
     
    204206                goto error;
    205207       
    206         rc = recv_eol(rb);
    207         if (rc == 0)
     208        size_t nrecv;
     209        rc = recv_eol(rb, &nrecv);
     210        if (rc == EOK && nrecv == 0)
    208211                rc = HTTP_EPARSE;
    209         if (rc < 0)
     212        if (rc != EOK)
    210213                goto error;
    211214       
Note: See TracChangeset for help on using the changeset viewer.