summaryrefslogtreecommitdiff
path: root/samples/net/http_client/src/http_client_cb.c
diff options
context:
space:
mode:
Diffstat (limited to 'samples/net/http_client/src/http_client_cb.c')
-rw-r--r--samples/net/http_client/src/http_client_cb.c133
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;
+}