323 lines
11 KiB
C
323 lines
11 KiB
C
/*================================================================
|
||
Copyright (c) 2021, Quectel Wireless Solutions Co., Ltd. All rights reserved.
|
||
Quectel Wireless Solutions Proprietary and Confidential.
|
||
=================================================================*/
|
||
|
||
|
||
#ifndef __QUEC_GPS_HTTP_H__
|
||
#define __QUEC_GPS_HTTP_H__
|
||
|
||
#include "sockets.h"
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
|
||
typedef enum
|
||
{
|
||
QL_HTTP_CLIENT_ERR_SUCCESS = 0, //成功
|
||
QL_HTTP_CLIENT_ERR_INVALID_CLIENT, //不可用的http client句柄
|
||
QL_HTTP_CLIENT_ERR_INVALID_METHOD, //不可用的请求方式
|
||
QL_HTTP_CLIENT_ERR_INVALID_URL, //不可用的请求URL
|
||
QL_HTTP_CLIENT_ERR_DNS_FAIL, //对服务器进行DNS解析失败
|
||
QL_HTTP_CLIENT_ERR_SOCK_CREATE_FAIL, //创建socket失败
|
||
QL_HTTP_CLIENT_ERR_SOCK_BIND_FAIL, //对socket进行bind操作失败
|
||
QL_HTTP_CLIENT_ERR_SOCK_CONN_FAIL, //执行socket连接失败
|
||
QL_HTTP_CLIENT_ERR_SOCK_SEND_FAIL, //发送数据失败
|
||
QL_HTTP_CLIENT_ERR_SOCK_RECV_FAIL, //接收数据失败
|
||
QL_HTTP_CLIENT_ERR_SOCK_CLOSE_FAIL, //断开连接失败
|
||
QL_HTTP_CLIENT_ERR_SSL_CONN_FAIL, // SSL connect fail
|
||
QL_HTTP_CLIENT_ERR_RESP_TIMEOUT, //请求超时
|
||
QL_HTTP_CLIENT_ERR_RESP_INVALID_VER, //不可用的协议版本
|
||
QL_HTTP_CLIENT_ERR_RESP_INVALID_LOCATION, //不可用的location域
|
||
QL_HTTP_CLIENT_ERR_LAST_REQUEST_NOT_FINISH, //上次请求还未完成
|
||
QL_HTTP_CLIENT_ERR_NO_MEMORY, //http 请求缓存不足
|
||
QL_HTTP_CLIENT_ERR_UNKNOWN //其他错误
|
||
} QL_HTTP_CLIENT_ERR_E;
|
||
|
||
typedef enum
|
||
{
|
||
QL_HTTP_CLIENT_EVENT_SEND_FAIL=0, //http 请求发送失败
|
||
QL_HTTP_CLIENT_EVENT_SEND_SUCCESSED, //http 请求发送成功
|
||
QL_HTTP_CLIENT_EVENT_RECV_HEADER_FAIL, //http 接收响应header失败,header检查失败
|
||
QL_HTTP_CLIENT_EVENT_RECV_HEADER_FINISHED, //http 接收响应header完成
|
||
QL_HTTP_CLIENT_EVENT_RECV_BODY, //http 开始接收body数据
|
||
QL_HTTP_CLIENT_EVENT_RECV_BODY_FINISHED, //http 接收body数据完成
|
||
QL_HTTP_CLIENT_EVENT_DISCONNECTED ,//服务器断开连接
|
||
QL_HTTP_CLIENT_EVENT_SOCK_RECV_FAIL = 9,
|
||
} QL_HTTP_CLIENT_EVENT_E;
|
||
|
||
|
||
|
||
typedef enum {
|
||
QL_HTTP_CLIENT_OPT_PROTOCOL_VER, //设置http client协议版本,0:http/1.0;1:http/1.1
|
||
QL_HTTP_CLIENT_OPT_HTTPHEADER, //设置http client自定义header,ql_http_client_list_append函数创建的一个header list
|
||
QL_HTTP_CLIENT_OPT_PDP_CID, //设置http client使用的数据通道CID,执行数据拨号操作时使用的CID
|
||
QL_HTTP_CLIENT_OPT_BIND_PORT,//设置http client使用的客户端网络端口
|
||
QL_HTTP_CLIENT_OPT_ASYN, //设置http client请求执行模式,0:同步;1:异步
|
||
QL_HTTP_CLIENT_OPT_ENABLE_COOKIE, //使能http client使用cookie,0:不使能cookie;1:使能cookie
|
||
#ifdef SSL_ENABLE
|
||
QL_HTTP_CLIENT_OPT_SSL_CTX, //设置SSL
|
||
#endif
|
||
QL_HTTP_CLIENT_OPT_RECV_TIMEOUT_MS, //设置http client接收数据的超时时间(ms)
|
||
QL_HTTP_CLIENT_OPT_HOSTFIELD_USEDPORT, //设置指定的url是否使用默认的port 某些客户有自己特定的url,如果使用默认的port发送head会被服务器拒绝断开连接。
|
||
}QL_HTTP_CLIENT_OPT_E;
|
||
|
||
typedef enum
|
||
{
|
||
QL_HTTP_CLIENT_REQUEST_GET, //GET请求
|
||
QL_HTTP_CLIENT_REQUEST_POST, //POST请求
|
||
QL_HTTP_CLIENT_REQUEST_MAX
|
||
}QL_HTTP_CLIENT_REQUEST_METHOD_E;
|
||
|
||
typedef enum
|
||
{
|
||
QL_HTTP_CLIENT_AUTH_TYPE_NONE=0, //不使用验证
|
||
QL_HTTP_CLIENT_AUTH_TYPE_BASE = 1, //使用base验证
|
||
QL_HTTP_CLIENT_AUTH_TYPE_DIGEST=2 //使用digest验证
|
||
}QL_HTTP_CLIENT_AUTH_TYPE_E;
|
||
|
||
typedef enum
|
||
{
|
||
QL_HTTP_CLIENT_HTTP1_0=0, //http/1.0版本协议
|
||
QL_HTTP_CLIENT_HTTP1_1 =1, //http/1.1版本协议
|
||
}QL_HTTP_CLIENT_PROTOCL_VER_E;
|
||
|
||
|
||
typedef struct QL_HTTP_CLIENT_LIST{
|
||
char * data;
|
||
struct QL_HTTP_CLIENT_LIST * next;
|
||
}QL_HTTP_CLIENT_LIST_T;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
char * url; // dup from user setting
|
||
char * host; //
|
||
char * path; //
|
||
char * name;
|
||
char * password;
|
||
unsigned short int port;
|
||
int auth_type;
|
||
int https;
|
||
char * auth_value;
|
||
struct sockaddr_in ip;
|
||
struct sockaddr_in6 ip6;
|
||
int use_ip6;
|
||
int url_is_ip6_address;
|
||
int fd;
|
||
}QL_HTTP_SERVSER;
|
||
|
||
typedef struct
|
||
{
|
||
QL_HTTP_CLIENT_LIST_T * response_header;
|
||
int status_code;
|
||
int response_data_length;
|
||
}QL_HTTP_RESPONSE;
|
||
|
||
typedef struct
|
||
{
|
||
QL_HTTP_SERVSER server; // 服务信息
|
||
QL_HTTP_CLIENT_LIST_T * private_header; // 自定义请求header
|
||
QL_HTTP_CLIENT_REQUEST_METHOD_E method;
|
||
int enable_cookie;
|
||
QL_HTTP_CLIENT_LIST_T * cookie;
|
||
#ifdef SSL_ENABLE
|
||
SSLCtx sslCtx;
|
||
#endif
|
||
int connection_state;
|
||
QL_HTTP_CLIENT_PROTOCL_VER_E protocol_ver;
|
||
char * location;
|
||
int cid;
|
||
unsigned short port;
|
||
const char * data;
|
||
int data_len;
|
||
QL_HTTP_RESPONSE response;
|
||
void *rsp_cb;
|
||
void * rsp_cb_user_data;
|
||
char *mem_buf;
|
||
int asyn_f;
|
||
void *send_recv_task_ref;
|
||
void *mutex_ref;
|
||
QL_HTTP_CLIENT_ERR_E error_code;
|
||
unsigned int timeout_ms;
|
||
int bHostFieldUsedPort; //1:使用默认端口, 0:不使用默认端口
|
||
}QL_HTTP_CLIENT_T;
|
||
|
||
/*****************************************************************
|
||
* Function: QL_HTTP_CLIENT_RESPONSE_CB
|
||
*
|
||
* Description:
|
||
* 发送 HTTP 请求后,当相关事件发生时自动调用该回调函数。
|
||
*
|
||
* Parameters:
|
||
* client [In] HTTP 客户端句柄。由 ql_http_client_init()获取。
|
||
* event [In] 客户端调用 ql_http_client_request()后发生的事件类型。详见参第 3.3.3.4章。
|
||
* status_code [In] HTTP 服务器端返回的状态码。当 event 为如下三种事件时方返回状态码;当 event 为其他事件时,该参数始终为 0。详见QL_HTTP_CLIENT_EVENT_E。
|
||
* QL_HTTP_CLIENT_EVENT_RECV_HEADER_FINISHED、QL_HTTP_CLIENT_EVENT_RECV_BODY、QL_HTTP_CLIENT_EVENT_RECV_BODY_FINISHED。
|
||
* data [In] HTTP 客户端接收到的数据。若 event 为 QL_HTTP_CLIENT_EVENT_RECV_HEADER_FINISHED,该参数表示服务器端响应的消息头(完整消息头)。
|
||
* 若 event 为 QL_HTTP_CLIENT_EVENT_RECV_BODY,该参数表示服务器端返回的消息体数据。此 事 件 可 能 会 发 生 多 次 ,
|
||
* 所 有 接 收 数 据 组 成 一 组 完 整 的 消 息 体 数 据 。 仅 当 接 收 到QL_HTTP_CLIENT_EVENT_RECV_BODY_FINISHED 方可表示所有消息体数据接收完成。
|
||
* 若 event 为其他事件时,该参数为 NULL。
|
||
* data_len [In] 接收数据的长度。若 event 为 QL_HTTP_CLIENT_EVENT_RECV_HEADER_FINISHED,该参数表示服务器端响
|
||
* 应的消息头(完整消息头)的长度。单位:字节。若 event 为 QL_HTTP_CLIENT_EVENT_RECV_BODY,
|
||
* 该参数表示服务器端返回的消息体数据的长度。单位:字节。
|
||
* 若 event 为其他事件时,该参数为 0。
|
||
* private_data [In] 传递至该回调函数的用户数据。
|
||
*
|
||
* Return:
|
||
* 0, 不再接收服务端返回数据,服务端返回数据将被丢弃。
|
||
* 1, 继续接收服务端返回数据。
|
||
*
|
||
*****************************************************************/
|
||
typedef int (*QL_HTTP_CLIENT_RESPONSE_CB)(QL_HTTP_CLIENT_T *client,QL_HTTP_CLIENT_EVENT_E event,int status_code, char *data, int data_len, void *private_data);
|
||
|
||
/*****************************************************************
|
||
* Function: ql_http_client_init
|
||
*
|
||
* Description:
|
||
* 该函数用于初始化 HTTP 客户端资源并创建一个新的 HTTP 客户端句柄。
|
||
*
|
||
* Parameters:
|
||
* 无。
|
||
*
|
||
* Return:
|
||
* NULL,失败。
|
||
* 非NULL,成功,返回一个新的 HTTP 客户端句柄。
|
||
*
|
||
*****************************************************************/
|
||
extern QL_HTTP_CLIENT_T * ql_http_client_init(void);
|
||
|
||
/*****************************************************************
|
||
* Function: ql_http_client_release
|
||
*
|
||
* Description:
|
||
* 该函数用于释放 HTTP 客户端资源。
|
||
*
|
||
* Parameters:
|
||
* client [in] HTTP 客户端句柄。由 ql_http_client_init()获取。
|
||
*
|
||
* Return:
|
||
* 无。
|
||
*
|
||
*****************************************************************/
|
||
extern void ql_http_client_release(QL_HTTP_CLIENT_T *client);
|
||
|
||
/*****************************************************************
|
||
* Function: ql_http_client_request
|
||
*
|
||
* Description:
|
||
* 该函数用于发送 HTTP 请求。
|
||
*
|
||
* Parameters:
|
||
* client [In] HTTP 客户端句柄。由 ql_http_client_init()获取。
|
||
* url [In] HTTP 请求 URL。
|
||
* method [In] HTTP 请求方式。详见 QL_HTTP_CLIENT_OPT_E。
|
||
* auth_type [In] HTTP 请求验证类型。详见 QL_HTTP_CLIENT_AUTH_TYPE_E。
|
||
* username [In] HTTP 请求验证使用的用户名。
|
||
* password [In] HTTP 请求验证使用的密码。
|
||
* data [In] HTTP 请求待发送数据。
|
||
* data_len [In] HTTP 请求待发送数据的长度。单位:字节。
|
||
* rsp_cb [In] HTTP 请求回调函数。详见 QL_HTTP_CLIENT_RESPONSE_CB。
|
||
* rsp_cb_user_data [In] 传递至回调函数 QL_HTTP_CLIENT_RESPONSE_CB()的用户数据。
|
||
*
|
||
* Return:
|
||
* 无。
|
||
*
|
||
*****************************************************************/
|
||
extern QL_HTTP_CLIENT_ERR_E ql_http_client_request(
|
||
QL_HTTP_CLIENT_T *client,
|
||
char *url,
|
||
QL_HTTP_CLIENT_REQUEST_METHOD_E method,
|
||
QL_HTTP_CLIENT_AUTH_TYPE_E auth_type,
|
||
char *username,
|
||
char* password,
|
||
char *data,
|
||
int data_len,
|
||
QL_HTTP_CLIENT_RESPONSE_CB rsp_cb,
|
||
void *rsp_cb_user_data
|
||
);
|
||
|
||
/*****************************************************************
|
||
* Function: ql_http_client_list_append
|
||
*
|
||
* Description:
|
||
* 该函数用于创建消息头列表或更新消息头列表。
|
||
*
|
||
* Parameters:
|
||
* list [In] 指针,指向消息头列表。设置为 NULL 时创建新的消息头列表;不为 NULL 时,向指定的消息头列表增加内容。
|
||
* data [In] 消息头字符串,以“\r\n”结尾。例如:Connection: keep-alive\r\n。
|
||
*
|
||
* Return:
|
||
* NULL,失败
|
||
* 非NULL,执行成功则返回消息头列表指针。
|
||
*
|
||
*****************************************************************/
|
||
|
||
extern QL_HTTP_CLIENT_LIST_T * ql_http_client_list_append(QL_HTTP_CLIENT_LIST_T * list, const char * data);
|
||
|
||
/*****************************************************************
|
||
* Function: ql_http_client_list_append
|
||
*
|
||
* Description:
|
||
* 该函数用于销毁消息头列表以释放消息头列表资源。若当前有 HTTP 请求使用消息头列表、且请求尚未完成时,不可调用该函数销毁此消息头列表。
|
||
*
|
||
* Parameters:
|
||
* list [In] 指针,指向消息头列表。
|
||
*
|
||
* Return:
|
||
* 无。
|
||
*
|
||
*****************************************************************/
|
||
extern void ql_http_client_list_destroy(QL_HTTP_CLIENT_LIST_T *list);
|
||
|
||
/*****************************************************************
|
||
* Function: ql_http_client_setopt
|
||
*
|
||
* Description:
|
||
* 该函数用于配置 HTTP 客户端属性。
|
||
*
|
||
* Parameters:
|
||
* client [In] HTTP 客户端句柄。由 ql_http_client_init()获取。
|
||
* tag [In] 属性标签,详见QL_HTTP_CLIENT_OPT_E。
|
||
*
|
||
* Return:
|
||
* 详见QL_HTTP_CLIENT_ERR_E。
|
||
*
|
||
*****************************************************************/
|
||
extern QL_HTTP_CLIENT_ERR_E ql_http_client_setopt(QL_HTTP_CLIENT_T *client, int tag, ...);
|
||
|
||
|
||
/*****************************************************************
|
||
* Function: ql_http_client_get_header
|
||
*
|
||
* Description:
|
||
* 该函数用于获取 HTTP 消息头中指定键值的实际长度。
|
||
*
|
||
* Parameters:
|
||
* header [In] HTTP 消息头。
|
||
* key [In] HTTP 消息头中的键名。
|
||
* index [In] HTTP 客户端句柄。由 ql_http_client_init()获取。
|
||
* value [In] HTTP 消息头中指定的键值。
|
||
* value_len [In] 指定键值的最大字节长度。单位:字节。
|
||
*
|
||
* Return:
|
||
* 0 消息头中不存在指定索引的键名。
|
||
* 大于 0 指定索引的键值的实际长度。单位:字节。
|
||
|
||
*
|
||
*****************************************************************/
|
||
extern int ql_http_client_get_header(char *header,char *key,int index,char *value,int value_len);
|
||
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif
|
||
|
||
|