/*
 * Copyright (c) 2017 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef __HTTP_H__
#define __HTTP_H__

#if defined(CONFIG_HTTP_CLIENT)

#include <net/net_context.h>

struct http_client_request {
	/** The HTTP method: GET, HEAD, OPTIONS, POST */
	char *method;
	/** The URL for this request, for example: /index.html */
	char *url;
	/** The HTTP protocol: HTTP/1.1 */
	char *protocol;
	/** The HTTP header fields (application specific)
	 * The Content-Type may be specified here or in the next field.
	 * Depending on your application, the Content-Type may vary, however
	 * some header fields may remain constant through the application's
	 * life cycle.
	 */
	char *header_fields;
	/** The value of the Content-Type header field, may be NULL */
	char *content_type_value;
	/** Payload, may be NULL */
	char *payload;
	/** Payload size, may be 0 */
	u16_t payload_size;
};

int http_request(struct net_context *net_ctx, s32_t timeout,
		 struct http_client_request *req);

int http_request_get(struct net_context *net_ctx, s32_t timeout, char *url,
		     char *header_fields);

int http_request_head(struct net_context *net_ctx, s32_t timeout, char *url,
		      char *header_fields);

int http_request_options(struct net_context *net_ctx, s32_t timeout,
			 char *url, char *header_fields);

int http_request_post(struct net_context *net_ctx, s32_t timeout, char *url,
		      char *header_fields, char *content_type_value,
		      char *payload);
#endif

#if defined(CONFIG_HTTP_SERVER)

#include <net/net_context.h>

#if defined(CONFIG_HTTP_PARSER)
#include <net/http_parser.h>
#endif

/* HTTP server context state */
enum HTTP_CTX_STATE {
	HTTP_CTX_FREE = 0,
	HTTP_CTX_IN_USE
};

/* HTTP header fields struct */
struct http_field_value {
	/** Field name, this variable will point to the beginning of the string
	 *  containing the HTTP field name
	 */
	const char *key;
	/** Length of the field name */
	u16_t key_len;

	/** Value, this variable will point to the beginning of the string
	 *  containing the field value
	 */
	const char *value;
	/** Length of the field value */
	u16_t value_len;
};

/* The HTTP server context struct */
struct http_server_ctx {
	u8_t state;

	/** Collection of header fields */
	struct http_field_value field_values[CONFIG_HTTP_HEADER_FIELD_ITEMS];
	/** Number of header field elements */
	u16_t field_values_ctr;

	/** HTTP Request URL */
	const char *url;
	/** URL's length */
	u16_t url_len;

	/**IP stack network context */
	struct net_context *net_ctx;

	/** Network timeout */
	s32_t timeout;

#if defined(CONFIG_HTTP_PARSER)
	/** HTTP parser */
	struct http_parser parser;
	/** HTTP parser settings */
	struct http_parser_settings parser_settings;
#endif
};

int http_response(struct http_server_ctx *ctx, const char *http_header,
		  const char *html_payload);

int http_response_400(struct http_server_ctx *ctx, const char *html_payload);

int http_response_403(struct http_server_ctx *ctx, const char *html_payload);

int http_response_404(struct http_server_ctx *ctx, const char *html_payload);

#endif

#endif
