doubao_chat/include_lib/net/uC-HTTPc/http.h

609 lines
23 KiB
C

/*
*********************************************************************************************************
* uC/HTTP
* Hypertext Transfer Protocol
*
* Copyright 2004-2020 Silicon Laboratories Inc. www.silabs.com
*
* SPDX-License-Identifier: APACHE-2.0
*
* This software is subject to an open source license and is distributed by
* Silicon Laboratories Inc. pursuant to the terms of the Apache License,
* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
*
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* HTTP
*
* Filename : http.h
* Version : V3.01.00
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*********************************************************************************************************
* MODULE
*
* Note(s) : (1) This main network protocol suite header file is protected from multiple pre-processor
* inclusion through use of the HTTP module present pre-processor macro definition.
*
*********************************************************************************************************
*********************************************************************************************************
*/
#ifndef HTTP_MODULE_PRESENT /* See Note #1. */
#define HTTP_MODULE_PRESENT
/*
*********************************************************************************************************
*********************************************************************************************************
* HTTP INCLUDE FILES
*********************************************************************************************************
*********************************************************************************************************
*/
#include <cpu.h>
#include "include/lib_def.h"
#include "include/lib_str.h"
#include "include/lib_ascii.h"
#include "include/net_fs.h"
#ifdef HTTPs_MODULE
#include "http-s_cfg.h"
#endif
#include "include/net.h"
/*
*********************************************************************************************************
*********************************************************************************************************
* EXTERNS
*********************************************************************************************************
*********************************************************************************************************
*/
#if ((defined(HTTP_MODULE)) && \
(defined(HTTP_GLOBALS_EXT)))
#define HTTP_EXT
#else
#define HTTP_EXT extern
#endif
/*
*********************************************************************************************************
*********************************************************************************************************
* DEFINES
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* HTTP DEFAUT PORT DEFINES
*********************************************************************************************************
*/
#define HTTP_DFLT_PORT_NBR 80
#define HTTP_DFLT_PORT_NBR_SECURE 443
/*
*********************************************************************************************************
* URL ENCODING DEFINES
*********************************************************************************************************
*/
#define HTTP_URL_ENCODING_LEN 3
#define HTTP_URL_ENCODING_JUMP 2
/*
*********************************************************************************************************
* HEXADECIMAL STRING DEFINE
*********************************************************************************************************
*/
#define HTTP_INT_16U_HEX_STR_LEN_MAX 4u
/*
*********************************************************************************************************
*********************************************************************************************************
* DATA TYPES
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* TASK CONFIGURATION DATA TYPE
*
* Note(s): (1) When the Stack pointer is defined as null pointer (DEF_NULL), the task's stack should be
* automatically allowed on the heap of uC/LIB.
*********************************************************************************************************
*/
typedef struct http_task_cfg {
CPU_INT32U Prio; /* Task priority. */
CPU_INT32U StkSizeBytes; /* Size of the stack. */
void *StkPtr; /* Pointer to base of the stack (see Note #1). */
} HTTP_TASK_CFG;
/*
*********************************************************************************************************
* METHODS ENUMARATION
*********************************************************************************************************
*/
typedef enum http_method {
HTTP_METHOD_GET,
HTTP_METHOD_POST,
HTTP_METHOD_HEAD,
HTTP_METHOD_PUT,
HTTP_METHOD_DELETE,
HTTP_METHOD_OPTIONS,
HTTP_METHOD_TRACE,
HTTP_METHOD_CONNECT,
HTTP_METHOD_UNKNOWN
} HTTP_METHOD;
/*
*********************************************************************************************************
* STATUS CODES ENUMARATION
*********************************************************************************************************
*/
typedef enum http_status_code {
HTTP_STATUS_CONTINUE,
HTTP_STATUS_SWITCHING_PROTOCOLS,
HTTP_STATUS_PROCESSING,
HTTP_STATUS_EARLY_HINTS,
HTTP_STATUS_OK,
HTTP_STATUS_CREATED,
HTTP_STATUS_ACCEPTED,
HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION,
HTTP_STATUS_NO_CONTENT,
HTTP_STATUS_RESET_CONTENT,
HTTP_STATUS_PARTIAL_CONTENT,
HTTP_STATUS_MULTI_STATUS,
HTTP_STATUS_ALREADY_REPORTED,
HTTP_STATUS_IM_USED,
HTTP_STATUS_MULTIPLE_CHOICES,
HTTP_STATUS_MOVED_PERMANENTLY,
HTTP_STATUS_FOUND,
HTTP_STATUS_SEE_OTHER,
HTTP_STATUS_NOT_MODIFIED,
HTTP_STATUS_USE_PROXY,
HTTP_STATUS_SWITCH_PROXY,
HTTP_STATUS_TEMPORARY_REDIRECT,
HTTP_STATUS_PERMANENT_REDIRECT,
HTTP_STATUS_BAD_REQUEST,
HTTP_STATUS_UNAUTHORIZED,
HTTP_STATUS_FORBIDDEN,
HTTP_STATUS_NOT_FOUND,
HTTP_STATUS_METHOD_NOT_ALLOWED,
HTTP_STATUS_NOT_ACCEPTABLE, /* With the Accept Req Hdr */
HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED,
HTTP_STATUS_REQUEST_TIMEOUT,
HTTP_STATUS_CONFLICT,
HTTP_STATUS_GONE,
HTTP_STATUS_LENGTH_REQUIRED,
HTTP_STATUS_PRECONDITION_FAILED,
HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE,
HTTP_STATUS_REQUEST_URI_TOO_LONG,
HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE,
HTTP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE,
HTTP_STATUS_EXPECTATION_FAILED,
HTTP_STATUS_MISDIRECTED_REQUEST,
HTTP_STATUS_UNPROCESSABLE_ENTITY,
HTTP_STATUS_LOCKED,
HTTP_STATUS_FAILED_DEPENDENCY,
HTTP_STATUS_UPGRADE_REQUIRED,
HTTP_STATUS_PRECONDITION_REQUIRED,
HTTP_STATUS_TOO_MANY_REQUESTS,
HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE,
HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS,
HTTP_STATUS_INTERNAL_SERVER_ERR,
HTTP_STATUS_NOT_IMPLEMENTED,
HTTP_STATUS_BAD_GATEWAY,
HTTP_STATUS_SERVICE_UNAVAILABLE,
HTTP_STATUS_GATEWAY_TIMEOUT,
HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
HTTP_STATUS_VARIANT_ALSO_NEGOTIATES,
HTTP_STATUS_INSUFFICIENT_STORAGE,
HTTP_STATUS_LOOP_DETECTED,
HTTP_STATUS_NOT_EXTENDED,
HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED,
HTTP_STATUS_UNKNOWN
} HTTP_STATUS_CODE;
/*
*********************************************************************************************************
* HTTPS HEADER ENUMARATION
*********************************************************************************************************
*/
typedef enum http_hdr_field {
HTTP_HDR_FIELD_UNKNOWN,
HTTP_HDR_FIELD_CONTENT_TYPE,
HTTP_HDR_FIELD_CONTENT_LEN,
HTTP_HDR_FIELD_CONTENT_DISPOSITION,
HTTP_HDR_FIELD_HOST,
HTTP_HDR_FIELD_LOCATION,
HTTP_HDR_FIELD_CONN,
HTTP_HDR_FIELD_TRANSFER_ENCODING,
HTTP_HDR_FIELD_ACCEPT,
HTTP_HDR_FIELD_ACCEPT_CHARSET,
HTTP_HDR_FIELD_ACCEPT_ENCODING,
HTTP_HDR_FIELD_ACCEPT_LANGUAGE,
HTTP_HDR_FIELD_ACCEPT_RANGES,
HTTP_HDR_FIELD_AGE,
HTTP_HDR_FIELD_ALLOW,
HTTP_HDR_FIELD_AUTHORIZATION,
HTTP_HDR_FIELD_CONTENT_ENCODING,
HTTP_HDR_FIELD_CONTENT_LANGUAGE,
HTTP_HDR_FIELD_CONTENT_LOCATION,
HTTP_HDR_FIELD_CONTENT_MD5,
HTTP_HDR_FIELD_CONTENT_RANGE,
HTTP_HDR_FIELD_COOKIE,
HTTP_HDR_FIELD_COOKIE2,
HTTP_HDR_FIELD_DATE,
HTTP_HDR_FIELD_ETAG,
HTTP_HDR_FIELD_EXPECT,
HTTP_HDR_FIELD_EXPIRES,
HTTP_HDR_FIELD_FROM,
HTTP_HDR_FIELD_IF_MODIFIED_SINCE,
HTTP_HDR_FIELD_IF_MATCH,
HTTP_HDR_FIELD_IF_NONE_MATCH,
HTTP_HDR_FIELD_IF_RANGE,
HTTP_HDR_FIELD_IF_UNMODIFIED_SINCE,
HTTP_HDR_FIELD_LAST_MODIFIED,
HTTP_HDR_FIELD_RANGE,
HTTP_HDR_FIELD_REFERER,
HTTP_HDR_FIELD_RETRY_AFTER,
HTTP_HDR_FIELD_SERVER,
HTTP_HDR_FIELD_SET_COOKIE,
HTTP_HDR_FIELD_SET_COOKIE2,
HTTP_HDR_FIELD_TE,
HTTP_HDR_FIELD_TRAILER,
HTTP_HDR_FIELD_UPGRADE,
HTTP_HDR_FIELD_USER_AGENT,
HTTP_HDR_FIELD_VARY,
HTTP_HDR_FIELD_VIA,
HTTP_HDR_FIELD_WARNING,
HTTP_HDR_FIELD_WWW_AUTHENTICATE,
HTTP_HDR_FIELD_WEBSOCKET_KEY,
HTTP_HDR_FIELD_WEBSOCKET_ACCEPT,
HTTP_HDR_FIELD_WEBSOCKET_VERSION,
HTTP_HDR_FIELD_WEBSOCKET_PROTOCOL,
HTTP_HDR_FIELD_WEBSOCKET_EXTENSIONS
} HTTP_HDR_FIELD;
/*
*********************************************************************************************************
* HTTPS VERSIONS ENUMARATION
*********************************************************************************************************
*/
typedef enum http_protocol_ver {
HTTP_PROTOCOL_VER_0_9,
HTTP_PROTOCOL_VER_1_0,
HTTP_PROTOCOL_VER_1_1,
HTTP_PROTOCOL_VER_UNKNOWN
} HTTP_PROTOCOL_VER;
/*
*********************************************************************************************************
* CONTENT TYPES ENUMARATION
*********************************************************************************************************
*/
typedef enum http_content_type {
HTTP_CONTENT_TYPE_UNKNOWN,
HTTP_CONTENT_TYPE_NONE,
HTTP_CONTENT_TYPE_HTML,
HTTP_CONTENT_TYPE_OCTET_STREAM,
HTTP_CONTENT_TYPE_PDF,
HTTP_CONTENT_TYPE_ZIP,
HTTP_CONTENT_TYPE_GIF,
HTTP_CONTENT_TYPE_JPEG,
HTTP_CONTENT_TYPE_PNG,
HTTP_CONTENT_TYPE_JS,
HTTP_CONTENT_TYPE_PLAIN,
HTTP_CONTENT_TYPE_CSS,
HTTP_CONTENT_TYPE_JSON,
HTTP_CONTENT_TYPE_APP_FORM,
HTTP_CONTENT_TYPE_MULTIPART_FORM,
HTTP_CONTENT_TYPE_WEBSOCK_TXT_DATA,
HTTP_CONTENT_TYPE_WEBSOCK_BIN_DATA
} HTTP_CONTENT_TYPE;
/*
*********************************************************************************************************
* CONTENT DISPOSITION TYPE VALUES ENUMARATION
*********************************************************************************************************
*/
typedef enum http_content_disposition {
HTTP_CONTENT_DISPOSITION_FORM_DATA
} HTTP_CONTENT_DISPOSITION;
/*
*********************************************************************************************************
* HEADER FIELD CONNECTION VALUES ENUMARATION
*********************************************************************************************************
*/
typedef enum http_hdr_field_conn_val {
HTTP_HDR_FIELD_CONN_CLOSE,
HTTP_HDR_FIELD_CONN_PERSISTENT,
HTTP_HDR_FIELD_CONN_UPGRADE,
HTTP_HDR_FIELD_CONN_UNKNOWN
} HTTP_HDR_FIELD_CONN_VAL;
/*
*********************************************************************************************************
* HEADER FIELD TRANSFER ENCODING VALUES ENUMARATION
*********************************************************************************************************
*/
typedef enum http_hdr_field_transfer_type {
HTTP_HDR_FIELD_TRANSFER_TYPE_NONE,
HTTP_HDR_FIELD_TRANSFER_TYPE_CHUNKED
} HTTP_HDR_FIELD_TRANSFER_TYPE;
/*
*********************************************************************************************************
* HEADER FIELD UPGRADE VALUES ENUMARATION
*********************************************************************************************************
*/
typedef enum http_hdr_field_upgrade_val {
HTTP_HDR_FIELD_UPGRADE_WEBSOCKET
} HTTP_HDR_FIELD_UPGRADE_VAL;
/*
*********************************************************************************************************
* FILE TYPES ENUMARATION
*********************************************************************************************************
*/
typedef enum http_file_type {
HTTP_FILE_TYPE_FS,
HTTP_FILE_TYPE_STATIC_DATA
} HTTP_FILE_TYPE;
/*
*********************************************************************************************************
* BODY TYPES ENUMARATION
*********************************************************************************************************
*/
typedef enum http_body_type {
HTTP_BODY_TYPE_FS,
HTTP_BODY_TYPE_DATA,
HTTP_BODY_TYPE_BUF
} HTTP_BODY_TYPE;
/*
*********************************************************************************************************
* FORM DATA TYPES ENUMARATION
*********************************************************************************************************
*/
typedef enum http_form_data_type {
HTTP_FORM_DATA_TYPE_CTRL_VAL_QUERY,
HTTP_FORM_DATA_TYPE_CTRL_VAL_FORM,
HTTP_FORM_DATA_TYPE_FILE
} HTTP_FORM_DATA_TYPE;
/*
*********************************************************************************************************
* FORM DATA TYPE
*********************************************************************************************************
*/
typedef struct http_form_data HTTP_FORM_DATA;
struct http_form_data {
HTTP_FORM_DATA_TYPE DataType;
CPU_CHAR *CtrlNamePtr;
CPU_INT16U CtrlNameLen;
CPU_CHAR *ValPtr;
CPU_INT16U ValLen;
HTTP_FORM_DATA *DataNextPtr;
};
/*
*********************************************************************************************************
* HTTP HDR FIELD VALUE TYPE DATA TYPE
*********************************************************************************************************
*/
typedef enum http_hdr_val_type {
HTTP_HDR_VAL_TYPE_NONE,
HTTP_HDR_VAL_TYPE_STR_CONST,
HTTP_HDR_VAL_TYPE_STR_DYN
} HTTP_HDR_VAL_TYPE;
/*
*********************************************************************************************************
* HTTP HDR FIELD BLK DATA TYPE
*********************************************************************************************************
*/
typedef struct http_hdr_blk HTTP_HDR_BLK;
struct http_hdr_blk {
HTTP_HDR_FIELD HdrField;
HTTP_HDR_VAL_TYPE ValType;
void *ValPtr;
CPU_INT32U ValLen;
HTTP_HDR_BLK *NextPtr;
HTTP_HDR_BLK *PrevPtr;
};
/*
*********************************************************************************************************
* HTTP FORM MULTIPART CONTENT FIELD DATA TYPE
*********************************************************************************************************
*/
typedef enum http_multipart_field {
HTTP_MULTIPART_FIELD_NAME,
HTTP_MULTIPART_FIELD_FILE_NAME,
HTTP_MULTIPART_FIELD_UNKNOWN
} HTTP_MULTIPART_FIELD;
/*
*********************************************************************************************************
*********************************************************************************************************
* MACROS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* HTTP COUNTER MACRO'S
*
* Description : Functionality to set and increment statistic and error counter
*
* Argument(s) : Various HTTP counter variable(s) & values.
*
* Return(s) : none.
*
* Caller(s) : various.
*
* These macro's are INTERNAL HTTP suite macro's & SHOULD NOT be called by
* application function(s).
*
* Note(s) : none.
*********************************************************************************************************
*/
#if ((HTTPs_CFG_CTR_STAT_EN == DEF_ENABLED) || \
(HTTPc_CFG_CTR_STAT_EN == DEF_ENABLED))
#define HTTP_SET_PTR_STATS(p_ctr_stats, p_instance) { \
p_ctr_stats = &p_instance->StatsCtr; \
}
#define HTTP_STATS_INC(p_ctr) { \
p_ctr++; \
}
#define HTTP_STATS_OCTET_INC(p_ctr, octet) { \
p_ctr += octet; \
}
#else
/* Prevent 'variable unused' compiler warning. */
#define HTTP_SET_PTR_STATS(p_ctr_stats, p_instance) { \
(void)p_ctr_stats; \
}
#define HTTP_STATS_INC(p_ctr)
#define HTTP_STATS_OCTET_INC(p_ctr, octet)
#endif
#if ((HTTPs_CFG_CTR_ERR_EN == DEF_ENABLED) || \
(HTTPc_CFG_CTR_ERR_EN == DEF_ENABLED))
#define HTTP_SET_PTR_ERRS(p_ctr_err, p_instance) { \
p_ctr_err = &p_instance->ErrsCtr; \
}
#define HTTP_ERR_INC(p_ctr) { \
p_ctr++; \
}
#else
/* Prevent 'variable unused' compiler warning. */
#define HTTP_SET_PTR_ERRS(p_ctr_err, p_instance) { \
(void)p_ctr_err; \
}
#define HTTP_ERR_INC(p_ctr)
#endif
/*
*********************************************************************************************************
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*********************************************************************************************************
*/
CPU_CHAR *HTTP_HdrParseFieldValueGet(CPU_CHAR *p_field,
CPU_INT16U field_len,
CPU_CHAR *p_field_end,
CPU_INT16U *p_len_rem);
CPU_CHAR *HTTP_StrGraphSrchFirst(CPU_CHAR *p_str,
CPU_INT32U str_len);
CPU_BOOLEAN HTTP_URL_EncodeStr(const CPU_CHAR *p_str_src,
CPU_CHAR *p_str_dest,
CPU_SIZE_T *p_str_len,
CPU_SIZE_T str_len_max);
CPU_BOOLEAN HTTP_URL_DecodeStr(const CPU_CHAR *p_str_src,
CPU_CHAR *p_str_dest,
CPU_SIZE_T *p_str_lenn);
CPU_BOOLEAN HTTP_URL_DecodeReplaceStr(CPU_CHAR *p_str,
CPU_INT16U *p_str_len);
CPU_INT16U HTTP_URL_CharEncodeNbr(const CPU_CHAR *p_str_src,
CPU_SIZE_T str_len);
CPU_CHAR *HTTP_ChunkTransferWrSize(CPU_CHAR *p_buf_wr,
CPU_SIZE_T buf_len,
CPU_SIZE_T nbr_dig_max,
CPU_INT16U size);
CPU_INT08U HTTP_StrSizeHexDigReq(CPU_INT32U nbr);
HTTP_CONTENT_TYPE HTTP_GetContentTypeFromFileExt(CPU_CHAR *p_file_path,
CPU_SIZE_T path_len_max);
/*
*********************************************************************************************************
*********************************************************************************************************
* MODULE END
*********************************************************************************************************
*********************************************************************************************************
*/
#endif /* HTTP_MODULE_PRESENT */