blob: 7477e0312fb216450661d3530a4a33ff06736de2 [file] [log] [blame]
/*
* Copyright (c) 2017 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr.h>
#include <errno.h>
#include <misc/printk.h>
#include <net/http.h>
#include "http_client.h"
#include "http_client_types.h"
#include "config.h"
#define POST_CONTENT_TYPE "application/x-www-form-urlencoded"
#define POST_PAYLOAD "os=ZephyrRTOS&arch="CONFIG_ARCH
#define MAX_ITERATIONS 100
static struct http_client_ctx http_ctx;
static void send_http_method(enum http_method method, char *url,
char *content_type, char *payload);
void main(void)
{
int i = MAX_ITERATIONS;
int rc;
http_init(&http_ctx);
http_ctx.tcp_ctx.receive_cb = http_receive_cb;
http_ctx.tcp_ctx.timeout = HTTP_NETWORK_TIMEOUT;
rc = tcp_set_local_addr(&http_ctx.tcp_ctx, LOCAL_ADDR);
if (rc) {
printk("tcp_set_local_addr error\n");
goto lb_exit;
}
while (i-- > 0) {
send_http_method(HTTP_GET, "/index.html", NULL, NULL);
k_sleep(APP_NAP_TIME);
send_http_method(HTTP_HEAD, "/", NULL, NULL);
k_sleep(APP_NAP_TIME);
send_http_method(HTTP_OPTIONS, "/index.html", NULL, NULL);
k_sleep(APP_NAP_TIME);
send_http_method(HTTP_POST, "/post_test.php",
POST_CONTENT_TYPE, POST_PAYLOAD);
k_sleep(APP_NAP_TIME);
}
lb_exit:
printk("\nBye!\n");
}
void print_banner(enum http_method method)
{
printk("\n*******************************************\n"
"HTTP Client: %s\nConnecting to: %s port %d\n"
"Hostname: %s\nHTTP Request: %s\n",
LOCAL_ADDR, SERVER_ADDR, SERVER_PORT,
HOST_NAME, http_method_str(method));
}
static void send_http_method(enum http_method method, char *url,
char *content_type, char *payload)
{
struct net_context *net_ctx;
int32_t timeout;
int rc;
print_banner(method);
http_reset_ctx(&http_ctx);
rc = tcp_connect(&http_ctx.tcp_ctx, SERVER_ADDR, SERVER_PORT);
if (rc) {
printk("tcp_connect error\n");
return;
}
net_ctx = http_ctx.tcp_ctx.net_ctx;
timeout = http_ctx.tcp_ctx.timeout;
switch (method) {
case HTTP_GET:
rc = http_request_get(net_ctx, timeout, url, HEADER_FIELDS);
break;
case HTTP_POST:
rc = http_request_post(net_ctx, timeout, url, HEADER_FIELDS,
content_type, payload);
break;
case HTTP_HEAD:
rc = http_request_head(net_ctx, timeout, url, HEADER_FIELDS);
break;
case HTTP_OPTIONS:
rc = http_request_options(net_ctx, timeout, url, HEADER_FIELDS);
break;
default:
printk("Not yet implemented\n");
goto lb_exit;
}
if (rc) {
printk("Send error\n");
goto lb_exit;
}
/* this is async, so we wait until the reception callback
* processes the server's response (if any)
*/
k_sleep(APP_NAP_TIME);
printk("\nHTTP server response status: %s\n", http_ctx.http_status);
printk("HTTP parser status: %s\n",
http_errno_description(http_ctx.parser.http_errno));
if (method == HTTP_GET) {
if (http_ctx.body_found) {
printk("HTTP body: %u bytes, expected: %u bytes\n",
http_ctx.processed, http_ctx.content_length);
} else {
printk("Error detected during HTTP msg processing\n");
}
}
lb_exit:
tcp_disconnect(&http_ctx.tcp_ctx);
}