初版
This commit is contained in:
@@ -0,0 +1,214 @@
|
||||
#ifndef _HTTP_CLI_H_
|
||||
#define _HTTP_CLI_H_
|
||||
|
||||
|
||||
/*! \addtogroup HTTP_CLIENT
|
||||
* @ingroup NETWORK_LIB
|
||||
* @brief HTTP/HTTPS client library api
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief HTTP/HTTPS client function return error code
|
||||
*/
|
||||
typedef enum {
|
||||
HERROR_REDIRECT = 1, /*!< not used */
|
||||
HERROR_OK = 0,
|
||||
HERROR_MEM = -1, /*!< memory malloc fail */
|
||||
HERROR_HEADER = -2, /*!< set header from url fail */
|
||||
HERROR_RESPOND = -3, /*!< http server respond error */
|
||||
HERROR_SOCK = -4, /*!< socket connect fail */
|
||||
HERROR_CALLBACK = -5, /*!< user callback function return not zero */
|
||||
HERROR_UNKNOWN = -6, /*!< socket process unknown error */
|
||||
HERROR_PARAM = -7, /*!< input parameter error */
|
||||
HERROR_REDIRECT_DEEP = -8, /*!< max redirect deep only support 4 */
|
||||
HERROR_BODY_ANALYSIS = -9, /*!< When user cb function is NULL, will use default cb function, transfer_encoding:chunked receive fail wille return this value */
|
||||
HERROR_SOCKHDL = -10,
|
||||
HERROR_RECV_TIMEOUT = -11, /*!< socket receive process is timeout */
|
||||
} httpin_error;
|
||||
|
||||
/**
|
||||
* @brief HTTP/HTTPS client process status
|
||||
* @note This is used in user callback function
|
||||
*/
|
||||
typedef enum {
|
||||
HTTPIN_HEADER,
|
||||
HTTPIN_PROGRESS,
|
||||
HTTPIN_FINISHED,
|
||||
HTTPIN_ABORT,
|
||||
HTTPIN_ERROR,
|
||||
HTTPIN_NON_BLOCK,
|
||||
} httpin_status;
|
||||
|
||||
enum {
|
||||
MODE_HTTP = 0,
|
||||
MODE_HTTPS,
|
||||
};
|
||||
|
||||
/****************************************************/
|
||||
|
||||
typedef int (*httpcli_cb)(void *httpcli_ctx, void *buf, unsigned int size, void *priv, httpin_status status);
|
||||
|
||||
/**
|
||||
* @brief The header of buffer which save http body content
|
||||
* @note When memory not enough, the pointer p will auto realloc, and buf_count auto +1
|
||||
*/
|
||||
typedef struct _http_body_obj {
|
||||
char *p; /*!< user malloc memory pointer */
|
||||
unsigned int buf_len; /*!< The size of one receive buffer */
|
||||
unsigned int recv_len; /*!< The content bytes had received */
|
||||
unsigned char buf_count; /*!< The count of receive buffer */
|
||||
} http_body_obj;
|
||||
|
||||
typedef struct _http_data_box {
|
||||
int len;
|
||||
int rptr;
|
||||
char buf[512];
|
||||
} http_data_box;
|
||||
|
||||
#define HTTP_POST_MORE_DATA
|
||||
#define HTTP_USE_DATA_BOX
|
||||
//#define USE_UCHTTP
|
||||
|
||||
struct httpcli_ctx;
|
||||
|
||||
struct net_http_socket_ops {
|
||||
void *(*sock_create)(struct httpcli_ctx *ctx, char *buf, unsigned int bufsize);
|
||||
int (*sock_send)(void *hdl, const void *buf, unsigned int bufsize, int flag);
|
||||
int (*sock_recv)(void *hdl, void *buf, unsigned int bufsize, int flag);
|
||||
void (*sock_close)(void *hdl);
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief HTTP/HTTPS client context structure
|
||||
*/
|
||||
typedef struct httpcli_ctx {
|
||||
void *sock_hdl;
|
||||
const struct net_http_socket_ops *ops;
|
||||
//user need init
|
||||
const char *url; /*!< url */
|
||||
char *redirection_url; /*!< redirection_url */
|
||||
const char *user_http_header; /*!< user parse http header in person, must finish in '\0' */
|
||||
unsigned int lowRange; /*!< Start byte range of the content to get */
|
||||
unsigned int highRange; /*!< Finish byte range of the content to get */
|
||||
httpcli_cb cb; /*!< user callback function */
|
||||
void *priv; /*!< The pointer to the private data of the callback function */
|
||||
const char *post_data; /*!< The pointer to the post data */
|
||||
char *data_format; /*!< The format type of the post data */
|
||||
int data_len; /*!< The size of the post data */
|
||||
int timeout_millsec; /*!< The timeout value of the connect, send, receive */
|
||||
char *connection; /*!< "close" or "keep-alive" */
|
||||
//user get
|
||||
int content_length; /*!< The length of the content get from the server */
|
||||
char content_type[64]; /*!< The type of the content get from the server */
|
||||
char transfer_encoding[64]; /*!< The transfer encoding method of the content */
|
||||
|
||||
//priv
|
||||
int exit_flag;
|
||||
int req_exit_flag;
|
||||
|
||||
int chunked_last_read;
|
||||
char chunked_header_find[10];
|
||||
unsigned char chunked_header_offset;
|
||||
unsigned char support_range;
|
||||
unsigned char mode;
|
||||
unsigned char wait_content_length;
|
||||
unsigned char wait_all;
|
||||
#ifdef HTTP_POST_MORE_DATA
|
||||
int *more_data;
|
||||
int *more_data_len;
|
||||
#endif
|
||||
|
||||
#ifdef HTTP_USE_DATA_BOX
|
||||
http_data_box box;
|
||||
#endif
|
||||
|
||||
const char *cas_pem_path;
|
||||
const char *cli_pem_path;
|
||||
const char *pkey_path;
|
||||
const char *cookie;
|
||||
|
||||
#ifdef USE_UCHTTP
|
||||
char *p_buf; /*uchttp接收和发送缓冲区*/
|
||||
char host_name[128];
|
||||
#endif
|
||||
} httpcli_ctx;
|
||||
|
||||
struct net_download_ops {
|
||||
httpin_error(*init)(httpcli_ctx *ctx);
|
||||
void (*close)(httpcli_ctx *ctx);
|
||||
void (*quit)(httpcli_ctx *ctx);
|
||||
int (*read)(httpcli_ctx *ctx, char *recvbuf, unsigned int len);
|
||||
};
|
||||
|
||||
/****************************************************/
|
||||
|
||||
/**
|
||||
* @brief Http client get
|
||||
*
|
||||
* @param ctx The pointer to HTTP/HTTPS client context structure
|
||||
*
|
||||
* @return httpin_error
|
||||
*/
|
||||
httpin_error httpcli_get(httpcli_ctx *ctx);
|
||||
|
||||
/**
|
||||
* @brief Http client post
|
||||
*
|
||||
* @param ctx The pointer to HTTP/HTTPS client context structure
|
||||
*
|
||||
* @return httpin_error
|
||||
*/
|
||||
httpin_error httpcli_post(httpcli_ctx *ctx);
|
||||
|
||||
/**
|
||||
* @brief Break up the http client process
|
||||
*
|
||||
* @param ctx The pointer to HTTP/HTTPS client context structure
|
||||
*/
|
||||
void httpcli_cancel(httpcli_ctx *ctx);
|
||||
|
||||
/**
|
||||
* @brief Http client get on SSL
|
||||
*
|
||||
* @param ctx The pointer to HTTP/HTTPS client context structure
|
||||
*
|
||||
* @return httpin_error
|
||||
*/
|
||||
|
||||
void start_break_all_http_request(void);
|
||||
|
||||
void stop_break_all_http_request(void);
|
||||
|
||||
void HttpsSetTLS_key(httpcli_ctx *n, const char *cas_pem, const char *cli_pem, const char *pkey);
|
||||
|
||||
httpin_error httpscli_get(httpcli_ctx *ctx);
|
||||
|
||||
httpin_error httpcli_post_header(httpcli_ctx *ctx);
|
||||
|
||||
httpin_error httpcli_chunked_send(httpcli_ctx *ctx);
|
||||
|
||||
httpin_error httpcli_post_keepalive_init(httpcli_ctx *ctx);
|
||||
|
||||
httpin_error httpcli_post_keepalive_send(httpcli_ctx *ctx);
|
||||
|
||||
extern const struct net_download_ops http_ops;
|
||||
|
||||
int transfer_chunked_parse(httpcli_ctx *ctx, char *receive_buf, int recv_length, unsigned int (*cb)(unsigned char *, int, void *), void *priv);
|
||||
|
||||
int transfer_chunked_analysis(char *receive_buf, unsigned int recv_length);
|
||||
|
||||
void http_cancel_dns(httpcli_ctx *ctx);
|
||||
|
||||
httpin_error httpcli_init(httpcli_ctx *ctx);
|
||||
|
||||
int httpcli_read(httpcli_ctx *ctx, char *recvbuf, unsigned int len);
|
||||
|
||||
void httpcli_close(httpcli_ctx *ctx);
|
||||
|
||||
/*! @}*/
|
||||
|
||||
|
||||
#endif //_HTTP_CLI_H_
|
||||
Reference in New Issue
Block a user