📄 whttp.cpp
字号:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "WHTTP.H"
#include "TCPCLNT.H"
#include "ETR_PPP.H"
/* 分隔符定义 */
#define CRLF {0x0d,0x0a,0x0}
#define CR {0x0d,0x0}
#define LF {0x0a,0x0}
#define CRLFCRLF {0x0d,0x0a,0x0d,0x0a,0x0}
#define CRCR {0x0d,0x0d,0x0}
#define LFLF {0x0a,0x0a,0x0}
/* HTTP响应数据单元结构 */
typedef struct _HTTPResponseInfo
{
unsigned char* StatusLine; /* 状态行 */
unsigned char* HeadField; /* 响应头 */
unsigned char* EntityField; /* 实体 */
} HTTPResponseInfo;
/**************************************************************
* 模块全局变量定义
*/
/* WAP网关IP地址,默认为10.0.0.172 */
char g_GateWayHost[20] = "10.0.0.172";
/* TCP 客户端 */
TCPClientManager *TcpClient = NULL;
/* 网关 */
struct SERVER_ID *GateWay = NULL;
/* 换行符定义 */
unsigned char CRLF_seperate_flag[3] = CRLF;
unsigned char LF_seperate_flag[2] = LF;
unsigned char CR_seperate_flag[2] = CR;
unsigned char CRLFCRLF_seperate_flag[5] = CRLFCRLF;
unsigned char CRCR_seperate_flag[3] = CRCR;
unsigned char LFLF_seperate_flag[3] = LFLF;
/**************************************************************
* 模块私有函数声明
*/
/* 解析收到的数据 */
static HTTPResponseInfo* GetHttpResponseInfo(unsigned char* Content_Buffer, long len);
static int ReleaseHttpResponseInfo(HTTPResponseInfo* RspInfo);
static int HttpResponseStatusCode(HTTPResponseInfo* RspInfo);
static long HttpResponseContentLength(HTTPResponseInfo* RspInfo);
static unsigned char* HttpResponseContent(HTTPResponseInfo* RspInfo);
/* 发送数据编码 */
static void HTTPGetHeaderFormat(unsigned char *buffer);
static void HTTPPostHeaderFormat(unsigned char *buffer);
/**************************************************************
* 模块公有函数定义
*/
/*
* HTTP 初始化
*/
int WHttpOpen( unsigned char *host, int port )
{
/* 创建网关实例 */
GateWay = new struct SERVER_ID;
if (GateWay == NULL)
{
return 0;
}
/* 初始化 */
memset( GateWay->IPStr, 0, 20 );
GateWay->Port = 0;
if (host != NULL)
{
strcpy( GateWay->IPStr, (char *)host );
}
else
{
/* 默认网关10.0.0.172 */
strcpy( GateWay->IPStr, (char *)g_GateWayHost );
}
if (port != 0)
{
/* 网关端口 */
GateWay->Port = port;
}
else
{
/* 网关端口 */
GateWay->Port = 80;
}
/* 创建TCP客户端实例 */
TcpClient = (TCPClientManager *)new TCPClientManager();
if (TcpClient == NULL)
{
delete GateWay;
GateWay = NULL;
return 0;
}
/* 初始化TCP客户端实例 */
TcpClient->Init( GateWay );
return 1;
}
/*
* HTTP 关闭
*/
int WHttpClose()
{
if (TcpClient != NULL )
{
delete TcpClient;
TcpClient = NULL;
}
if (GateWay != NULL)
{
delete GateWay;
GateWay = NULL;
}
return 1;
}
/*
* HTTP GET 方法调用
*/
int WHttpGetUrl(unsigned char *url)
{
char Header[1460];
CONN_STATE TcpState = CLOSED;
int ret;
memset(Header, 0, 1460);
/* HTTP报头设置为GET方法 */
strcpy((char *)Header,"GET ");
/* strcat((char *)Header,"http://"); */
strcat((char *)Header, (char *)url);
/* HTTP GET 报头编码 */
HTTPGetHeaderFormat( (unsigned char*)Header );
if ( TcpClient == NULL )
{
return 0;
}
while( TcpState != OPEN )
{
/* TCP 客户端启动 */
TcpState = TcpClient->Running();
switch (TcpState)
{
case CLOSED:
printf("TCP Closed\r\n");
return 0;
case START:
continue;
case OPEN: /* TCP 连接成功 */
printf("TCP Connected\r\n");
break;
case FAIL:
return 0;
}
}
/* TCP 发送数据 HTTP头域 */
ret = TcpClient->WriteData(Header, (int)strlen( Header ));
if (ret >= 0)
{
return 1;
}
return 0;
}
/*
* HTTP POST 方法调用
*/
int WHttpPost(unsigned char *url, unsigned char *data, long len)
{
char Header[1460];
//char buffer[1460];
char ContentLength[8];
//FILE *fp = NULL;
CONN_STATE TcpState = CLOSED;
int ret;
/*if (file_name == NULL || file_len == 0)
{
printf("Can Not Open File\r\n");
return 0;
}
/* 打开数据文件 */
/* fp = fopen(file_name, "r+b");
// if (fp == NULL)
// {
printf("Can Not Open File\r\n");
return 0;
}*/
memset(Header, 0, 1460);
// memset(buffer, 0, 1460);
/* HTTP报头设置为POST方法 */
strcpy((char *)Header, "POST ");
if (url == NULL)
{
strcat((char *)Header, "http://mmsc.monternet.com/");
//strcat((char *)Header, "mmsc.monternet.com");
}
else
{
strcat((char *)Header, url);
}
/* POST报头编码 */
HTTPPostHeaderFormat((unsigned char *)Header);
if ( TcpClient == NULL )
{
// fclose(fp);
return 0;
}
while( TcpState != OPEN )
{
/* TCP 客户端启动 */
TcpState = TcpClient->Running();
switch (TcpState)
{
case CLOSED:
// fclose(fp);
printf("TCP Closed\r\n");
return 0;
case START:
continue;
case OPEN: /* TCP 连接成功 */
printf("TCP Connected\r\n");
break;
case FAIL:
return 0;
}
}
memset(ContentLength, 0, 8);
sprintf(ContentLength, "%d", len);
strcat((char *)Header, "Content-Length: ");
strcat((char *)Header, ContentLength);
/* Header END */
strcat((char *)Header,"\r\n\r\n");
/* TCP 发送HTTP Header */
ret = TcpClient->WriteData(Header, (int)strlen( Header ));
if (ret == EMSGSIZE)
{
printf("Write Buffer Too Small\r\n");
}
if (ret < 0)
{
// fclose(fp);
printf("TCP Send Fail\r\n");
return 0;
}
//ret = (int)fread(buffer, 1, 1300, fp);
while (len/1460 != 0)
{
ret = TcpClient->WriteData(data, 1460);
if (ret == EMSGSIZE)
{
printf("Write Buffer Too Small\r\n");
}
if (ret < 0)
{
// fclose(fp);
printf("TCP Send Fail\r\n");
return 0;
}
len = len - 1460;
data = data + 1460;
}
ret = TcpClient->WriteData(data, len);
if (ret == EMSGSIZE)
{
printf("Write Buffer Too Small\r\n");
}
if (ret < 0)
{
// fclose(fp);
printf("TCP Send Fail\r\n");
return 0;
}
return 1;
}
/*
* HTTP 响应
*/
int WHttpResponse(int *status, unsigned char *data, long data_len)
{
char Buffer[1460];
char sta[4];
char *endptr;
int len = 0;
int ret = 0;
memset(Buffer, 0, 1460);
*status = 0;
if ( TcpClient == NULL )
{
return 0;
}
printf("Tcp Start Receive Data\r\n");
while (1)
{
/* TCP 读取数据 */
ret = TcpClient->ReadData(Buffer, 1460);
if (ret == ETIMEDOUT) /* 超时 */
{
TcpClient->Close();
printf("TCP Recv Timeout\r\n");
break;
}
if (ret == EWOULDBLOCK) /* 无数据 */
{
continue;
}
if (ret == 0)/* 对方关闭连接 */
{
printf("TCP Close\r\n");
TcpClient->Close();
break;
}
if (ret > 0) /* 收到数据 */
{
if ((len + ret) <= data_len)
{
printf("TCP Recv Data: %d\r\n", ret);
/* 复制到缓存 */
memcpy(data + len, Buffer, ret);
memset(Buffer, 0, 1460);
len += ret;
}
continue;
}
}
/* 获取状态码 */
if (len > 11)
{
sta[0] = data[9];
sta[1] = data[10];
sta[2] = data[11];
sta[3] = '\0';
*status = (int)strtol(sta, &endptr, 10);
}
return len;
}
/**************************************************************
* 模块私有函数声明
*/
/*
* 发送数据编码
*/
void HTTPGetHeaderFormat(unsigned char* buffer)
{
strcat((char *)buffer," HTTP/1.1");
strcat((char *)buffer,"\r\n");
strcat((char *)buffer,"Accept: text/vnd.wap.wml, application/vnd.wap.wmlscriptc, \
application/vnd.wap.xhtml+xml, application/xhtml+xml, application/vnd.oma.drm.content, application/vnd.oma.dd+xml, \
application/x-wap-prov.browser-bookmarks, image/vnd.wap.wbmp, image/gif, image/jpg, image/jpeg, image/png, image/bmp, \
image/vnd.ziyitong.drm, image/vnd.ziyitong.vis, image/vnd.ziyitong.zdd,text/html, text/css, audio/mpeg,audio/mid, \
audio/midi, audio/x-mid, audio/x-midi, audio/sp-midi, audio/amr, audio/x-wav, application/vnd.oma.drm.message, \
text/plain, text/vnd.sun.j2me.app-descriptor, application/java, application/java-archive, application/x-java-archive, \
application/Chaotex-wfd, audio/32kadpcm\r\n");
strcat((char *)buffer,"Accept-Charset: UTF-8\r\n");
strcat((char *)buffer,"Accept-Language: zh-CN, zh\r\n");
strcat((char *)buffer,"User-Agent: ");
strcat((char *)buffer,"SAMSUNG-SGH-E908/NetFront 3.2/WAP2.0 Profile/MIDP-2.0");
strcat((char *)buffer,"\r\n");
/* 不支持gzip */
/* strcat((char *)buffer,"Accept-Encoding: gzip\r\n"); */
strcat((char *)buffer,"Connection: close\r\n");
strcat((char *)buffer,"Host: ");
strcat((char *)buffer,"10.0.0.172\r\n");
strcat((char *)buffer,"\r\n");
}
static void HTTPPostHeaderFormat(unsigned char *buffer)
{
strcat((char *)buffer," HTTP/1.1");
strcat((char *)buffer,"\r\n");
strcat((char *)buffer,"Host: ");
strcat((char *)buffer,"mmsc.monternet.com\r\n");
strcat((char*)buffer, "Connection: keep-alive\r\n");
//strcat((char*)buffer, "Connection: close\r\n");
strcat((char *)buffer, "Content-Type: application/vnd.wap.mms-message\r\n");
strcat((char *)buffer,"User-Agent: ");
strcat((char *)buffer,"SAMSUNG-SGH-E908/NetFront 3.2/WAP2.0 Profile/MIDP-2.0");
strcat((char *)buffer,"\r\n");
/*strcat((char *)buffer,"Accept: text/vnd.wap.wml, application/vnd.wap.wmlscriptc, \
application/vnd.wap.xhtml+xml, application/xhtml+xml, application/vnd.oma.drm.content, application/vnd.oma.dd+xml, \
application/x-wap-prov.browser-bookmarks, image/vnd.wap.wbmp, image/gif, image/jpg, image/jpeg, image/png, image/bmp, \
image/vnd.ziyitong.drm, image/vnd.ziyitong.vis, image/vnd.ziyitong.zdd,text/html, text/css, audio/mpeg,audio/mid, \
audio/midi, audio/x-mid, audio/x-midi, audio/sp-midi, audio/amr, audio/x-wav, application/vnd.oma.drm.message, \
text/plain, text/vnd.sun.j2me.app-descriptor, application/java, application/java-archive, application/x-java-archive, \
application/Chaotex-wfd, audio/32kadpcm\r\n");*/
strcat((char *)buffer,"Accept: application/vnd.wap.mms-message, image/vnd.wap.wbmp, \
image/png, image/jpeg, image/gif, text/x-iMelody, text/x-imelody, application/x-midi, \
audio/midi, audio/mid, audio/x-mid, image/bmp, audio/mp3, audio/x-midi, audio/amr, \
application/vnd.smaf, application/vnd.wap.mms-message\r\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -