diff options
Diffstat (limited to 'samples/net/http_client/src/http_client_rcv.c')
-rw-r--r-- | samples/net/http_client/src/http_client_rcv.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/samples/net/http_client/src/http_client_rcv.c b/samples/net/http_client/src/http_client_rcv.c new file mode 100644 index 000000000..5c6a220dc --- /dev/null +++ b/samples/net/http_client/src/http_client_rcv.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2017 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "http_client_rcv.h" +#include "http_client_types.h" +#include "config.h" + +#include <net/nbuf.h> + +#ifdef LINEARIZE_BUFFER + +NET_BUF_POOL_DEFINE(http_pool, HTTP_POOL_BUF_CTR, HTTP_POOL_BUF_SIZE, 0, NULL); + +void http_receive_cb(struct tcp_client_ctx *tcp_ctx, struct net_buf *rx) +{ + struct http_client_ctx *http_ctx; + struct net_buf *data_buf = NULL; + uint16_t data_len; + uint16_t offset; + int rc; + + if (!rx) { + return; + } + + data_buf = net_buf_alloc(&http_pool, tcp_ctx->timeout); + if (data_buf == NULL) { + goto lb_exit; + } + + data_len = min(net_nbuf_appdatalen(rx), HTTP_POOL_BUF_SIZE); + offset = net_buf_frags_len(rx) - data_len; + + rc = net_nbuf_linear_copy(data_buf, rx, offset, data_len); + if (rc != 0) { + rc = -ENOMEM; + goto lb_exit; + } + + http_ctx = CONTAINER_OF(tcp_ctx, struct http_client_ctx, tcp_ctx); + + /* The parser's error can be catched outside, reading the + * http_errno struct member + */ + http_parser_execute(&http_ctx->parser, &http_ctx->settings, + data_buf->data, data_buf->len); + +lb_exit: + net_buf_unref(data_buf); + net_buf_unref(rx); +} + +#else + +void http_receive_cb(struct tcp_client_ctx *tcp_ctx, struct net_buf *rx) +{ + struct http_client_ctx *http_ctx; + struct net_buf *buf = rx; + uint16_t offset; + + if (!rx) { + return; + } + + http_ctx = CONTAINER_OF(tcp_ctx, struct http_client_ctx, tcp_ctx); + + offset = net_buf_frags_len(buf) - net_nbuf_appdatalen(buf); + + /* find the fragment */ + while (buf && offset >= buf->len) { + offset -= buf->len; + buf = buf->frags; + } + + while (buf) { + (void)http_parser_execute(&http_ctx->parser, + &http_ctx->settings, + buf->data + offset, + buf->len - offset); + + /* after the first iteration, we set offset to 0 */ + offset = 0; + + /* The parser's error can be catched outside, reading the + * http_errno struct member + */ + if (http_ctx->parser.http_errno != HPE_OK) { + goto lb_exit; + } + + buf = buf->frags; + } + +lb_exit: + net_buf_unref(rx); +} + +#endif |