diff options
Diffstat (limited to 'samples/net/http_client/src/http_client_cb.c')
-rw-r--r-- | samples/net/http_client/src/http_client_cb.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/samples/net/http_client/src/http_client_cb.c b/samples/net/http_client/src/http_client_cb.c new file mode 100644 index 000000000..21368fdb8 --- /dev/null +++ b/samples/net/http_client/src/http_client_cb.c @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2017 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "http_client_cb.h" +#include "http_client_types.h" + +#include <stdlib.h> +#include <stdio.h> + +#define MAX_NUM_DIGITS 16 + +int on_url(struct http_parser *parser, const char *at, size_t length) +{ + ARG_UNUSED(parser); + + printf("URL: %.*s\n", length, at); + + return 0; +} + +int on_status(struct http_parser *parser, const char *at, size_t length) +{ + struct http_client_ctx *ctx; + uint16_t len; + + ARG_UNUSED(parser); + + ctx = CONTAINER_OF(parser, struct http_client_ctx, parser); + len = min(length, sizeof(ctx->http_status) - 1); + memcpy(ctx->http_status, at, len); + ctx->http_status[len] = 0; + + return 0; +} + +int on_header_field(struct http_parser *parser, const char *at, size_t length) +{ + char *content_len = "Content-Length"; + struct http_client_ctx *ctx; + uint16_t len; + + ctx = CONTAINER_OF(parser, struct http_client_ctx, parser); + + len = strlen(content_len); + if (length >= len && memcmp(at, content_len, len) == 0) { + ctx->cl_present = 1; + } + + printf("%.*s: ", length, at); + + return 0; +} + +int on_header_value(struct http_parser *parser, const char *at, size_t length) +{ + struct http_client_ctx *ctx; + char str[MAX_NUM_DIGITS]; + + ctx = CONTAINER_OF(parser, struct http_client_ctx, parser); + + if (ctx->cl_present) { + if (length <= MAX_NUM_DIGITS - 1) { + long int num; + + memcpy(str, at, length); + str[length] = 0; + num = strtol(str, NULL, 10); + if (num == LONG_MIN || num == LONG_MAX) { + return -EINVAL; + } + + ctx->content_length = num; + } + + ctx->cl_present = 0; + } + + printf("%.*s\n", length, at); + + return 0; +} + +int on_body(struct http_parser *parser, const char *at, size_t length) +{ + struct http_client_ctx *ctx; + + ctx = CONTAINER_OF(parser, struct http_client_ctx, parser); + + ctx->body_found = 1; + ctx->processed += length; + + return 0; +} + +int on_headers_complete(struct http_parser *parser) +{ + ARG_UNUSED(parser); + + return 0; +} + +int on_message_begin(struct http_parser *parser) +{ + ARG_UNUSED(parser); + + printf("\n--------- HTTP response (headers) ---------\n"); + + return 0; +} + +int on_message_complete(struct http_parser *parser) +{ + ARG_UNUSED(parser); + + return 0; +} + +int on_chunk_header(struct http_parser *parser) +{ + ARG_UNUSED(parser); + + return 0; +} + +int on_chunk_complete(struct http_parser *parser) +{ + ARG_UNUSED(parser); + + return 0; +} |