⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_http.h

📁 C编写的用来实现search engine的推荐功能
💻 H
字号:
/**
 * 以各种方式调用HTTP请求
 * Xu Lubing
 * May 22, 2003
 */
#ifndef _C_HTTP_H
#define _C_HTTP_H

#include <stdio.h>

/* 请求方法定义 */
typedef enum {
	M_GET,
	M_POST,
	M_HEAD
} REQUEST_METHOD_T;

typedef struct {
	const char* errMsg;    /* 错误原因,如果为NULL表示没有错误 */
	char statusCode[4];    /* 响应状态码,如"200" */
	char contentType[80];  /* 响应的类型,如"text/html" */
	int contentLength;     /* 响应内容长度,-1如果没有 */
	char date[32];         /* 响应时服务器日期,可能没有 */
	char server[80];       /* 服务器描述,可能没有 */
	char lastModified[32]; /* 请求内容更新时间,可能没有 */
	char location[1024];   /* 如果是Location,存放Location指明的内容,可能没有 */
#if defined(PROCESS_BODY)
	int (*processResponseBody) /* 处理响应体的函数,可以传NULL,返回读取字节数 */
	(
		int hSocket,        /* 请求的服务器的Socket句柄,只许用读操作,处理完后不能关闭 */
		char* response,     /* 存放响应结果的缓冲区 */
		int size            /* 缓冲区大小 */
	);
#elif defined(PROCESS_EXTRA)
	int respProcessed;     /* 是否已经使用了响应结果缓冲区 */
	char extraResp[1024];  /* 当响应结果缓冲区太小时使用 */
	int (*processExtraResponse) /* 处理额外响应结果的处理函数,可以传NULL */
	(
		char* extraResp,     /* 额外响应结果 */
		int length,          /* 可用的长度 */
		int* respProcessed,  /* 是否已经使用过响应结果 */
		char* resp,          /* 响应结果 */
		int size             /* 响应结果的长度 */
	);                     
#endif
} HTTP_RESPONSE_HEADER_T;

#ifdef __cplusplus
extern "C" {
#endif

#if defined(PROCESS_BODY) || defined(PROCESS_EXTRA)
/**
 * 初始化响应头,所有的数据都被清空。在调用任何函数前务必
 * 调用。
 */
void initResponseHeader(HTTP_RESPONSE_HEADER_T* headers);
#endif

/**
 * HTTP请求
 * IN:
 *  url:        HTTP的URL,可以带query_string('?'后面的部分),例:http://user:passwd@host:port/file?query
 *  method:     请求方式,M_GET、M_POST或者M_HEAD,分别代表"GET"、"POST"或者"HEAD"方式
 *  inHeaders:  请求头信息,如设置cookie的头信息,可以传NULL,格式是:"Header1: value1\nHeader2: value2",最后一个不加'\n'
 *  outHeaders: 响应的头信息,见HTTP_RESPONSE_HEADER_T定义,可以传NULL
 *  timeout:    访问超时秒数,传0使用缺省值
 *  response:   存放响应结果的内存区,如果是M_HEAD,可以传NULL
 *  size:       response的空间大小,如果是M_HEAD,可以传0
 * OUT:
 *  0: 发生错误,错误原因可看headers中的errMsg
 *  >0: response中的有效字符数,这时headers中的errMsg为NULL
 * 【注意】:response中不会添加字符串结束标志'\0',因为结果也可以是二进制内容
 */
int HTTPRequest(const char* url, REQUEST_METHOD_T method, const char* inHeaders, HTTP_RESPONSE_HEADER_T* outHeaders, int timeout, char* response, int size);

/**
 * 以GET方式做HTTP请求
 * IN:
 *  url:        HTTP的URL,可以带query_string('?'后面的部分),例:http://user:passwd@host:port/file?query
 *  inHeaders:  请求头信息,如设置cookie的头信息,可以传NULL,格式是:"Header1: value1\nHeader2: value2",最后一个不加'\n'
 *  outHeaders: 响应的头信息,见HTTP_RESPONSE_HEADER_T定义,可以传NULL
 *  timeout:    访问超时秒数,传0使用缺省值
 *  response:   存放响应结果的内存区
 *  size:       response的空间大小
 * OUT:
 *  0: 发生错误,错误原因可看headers中的errMsg
 *  >0: response中的有效字符数,这时headers中的errMsg为NULL
 * 【注意】:response中不会添加字符串结束标志'\0',因为结果也可以是二进制内容
 */
int HTTPRequestGet(const char* url, const char* inHeaders, HTTP_RESPONSE_HEADER_T* outHeaders, int timeout, char* response, int size);

/**
 * 以POST方式做HTTP请求
 * IN:
 *  url:        HTTP的URL,可以带query_string('?'后面的部分),例:http://user:passwd@host:port/file?query
 *  postBody:   需要通过POST方式传送的数据,如果为NULL,会传送url中的query_string部分
 *  bodyLen:    postBody的长度,因为postBody可以是二进制内容,如果postBody为NULL时可传任意值
 *  inHeaders:  请求头信息,如设置cookie的头信息,可以传NULL,格式是:"Header1: value1\nHeader2: value2",最后一个不加'\n'
 *  outHeaders: 响应的头信息,见HTTP_RESPONSE_HEADER_T定义,可以传NULL
 *  timeout:    访问超时秒数,传0使用缺省值
 *  response:   存放响应结果的内存区
 *  size:       response的空间大小
 * OUT:
 *  0: 发生错误,错误原因可看headers中的errMsg
 *  >0: response中的有效字符数,这时headers中的errMsg为NULL
 * 【注意】:response中不会添加字符串结束标志'\0',因为结果也可以是二进制内容
 */
int HTTPRequestPost(const char* url, const char* postBody, int bodyLen, const char* inHeaders, HTTP_RESPONSE_HEADER_T* outHeaders, int timeout, char* response, int size);

/**
 * 以HEAD方式做HTTP请求
 * IN:
 *  url:        HTTP的URL,可以带query_string('?'后面的部分),例:http://user:passwd@host:port/file?query
 *  inHeaders:  请求头信息,如设置cookie的头信息,可以传NULL,格式是:"Header1: value1\nHeader2: value2",最后一个不加'\n'
 *  outHeaders: 响应的头信息,见HTTP_RESPONSE_HEADER_T定义,必须不为NULL
 *  timeout:    访问超时秒数,传0使用缺省值
 * OUT:
 *  0: 发生错误,错误原因可看headers中的errMsg
 *  >0: 请求成功,这时headers中的errMsg为NULL,其余信息见headers中其它字段
 */
int HTTPRequestHead(const char* url, const char* inHeaders, HTTP_RESPONSE_HEADER_T* outHeaders, int timeout);

/* 测试用 */
void dumpResponseHeaders(HTTP_RESPONSE_HEADER_T* headers, FILE* out);

#ifdef __cplusplus
}
#endif

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -