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

📄 nq_soc_http.c

📁 mtk socket编程
💻 C
📖 第 1 页 / 共 2 页
字号:
				g_nq_zh_http_context_p->request_offset += length;
			}
			else
			{
				if ( g_nq_zh_ReqTable[i].szDefault != NULL )
				{
					length = strlen(g_nq_zh_ReqTable[i].szDefault);
					memcpy(g_nq_zh_http_context_p->request_buf + g_nq_zh_http_context_p->request_offset, (char *)g_nq_zh_ReqTable[i].szDefault, length);
					g_nq_zh_http_context_p->request_offset += length;		
				}
			}

			if(i <= NQ_ZH_HTTPREQF_METHOD_MAX)
			{
				length = NQ_ZH_HTTP_VER_LEN;
				memcpy(g_nq_zh_http_context_p->request_buf + g_nq_zh_http_context_p->request_offset, (char *)NQ_ZH_HTTP_VER, length);
				g_nq_zh_http_context_p->request_offset += length;
			}
			//fill CRLF string
			length = NQ_ZH_CRLF_LEN;
			memcpy(g_nq_zh_http_context_p->request_buf + g_nq_zh_http_context_p->request_offset, (char *)NQ_ZH_CRLF, length);
			g_nq_zh_http_context_p->request_offset += length;

			ret = 1;
			break;
		}

		i++;
	}


	return ret;
}

/******************************************************************************
 * nq_zh_http_SetBodyData  
 *  
 * Description:
 *  设置http报文实体数据
 *  
 * Input: 
 *  const kal_int8* szBodyData		报文实体数据
 *  kal_int32 data_len			数据长度
 *  
 * Output: 
 *  
 * Returns: 
 *  
 * 
 * modification history
 * -----------------------------------	-------
 * 
 ******************************************************************************/
kal_int32 nq_zh_http_SetBodyData(const kal_int8* szBodyData, kal_int32 data_len)
{
	kal_int32 len = 0;
	
	//fill CRLF string
	len = NQ_ZH_CRLF_LEN;
	memcpy(g_nq_zh_http_context_p->request_buf + g_nq_zh_http_context_p->request_offset, (char *)NQ_ZH_CRLF, len);
	g_nq_zh_http_context_p->request_offset += len;

	if(data_len)
	{
		len = data_len;
		memcpy(g_nq_zh_http_context_p->request_buf + g_nq_zh_http_context_p->request_offset, (char *)szBodyData, len);
		g_nq_zh_http_context_p->request_offset += len;
	}
	return 1;
}

/*
* parse  received data
*/

static kal_int32 nq_zh_http_get_body_pos(kal_int8* buff, kal_int32 buff_len)
{
	kal_int32 i = 0;

	for (i = 0; i < buff_len; i++)
	{
		if (nq_zh_strnicmp((kal_char*)(buff + i), "\r\n\r\n", 4) == 0)
		{
			break;
		}
	}

	if(i == buff_len)
	{
		return -1;
	}
	else
	{
		return i + 4;
	}
}

static kal_int32 nq_zh_http_get_body_length(kal_int8* buff, kal_int32 buff_len)
{
	kal_int32 i = 0, length = -1;
	
	for (i = 0; i < buff_len; i++)
	{
		if (nq_zh_strnicmp((kal_char*)(buff + i), "Content-Length:", 15) == 0)
		{
			length = atoi((kal_char*)(buff + i + 15));
			break;
		}
	}
	
	return length;
}


static kal_int32 nq_zh_http_get_data_full_length(kal_int8* buff, kal_int32 buff_len)
{
	kal_int32 body_len = -1, body_pos = -1;
	
	body_pos = nq_zh_http_get_body_pos(buff, buff_len);
	if(body_pos < 0)
	{
		return -1;
	}
	
	body_len = nq_zh_http_get_body_length(buff, buff_len);

	return body_len + body_pos;	
}

static kal_int8* nq_zh_http_get_bodyBuffer(kal_int8* buff, kal_int32 buff_len)
{
	kal_int32 body_pos = -1;

	body_pos = nq_zh_http_get_body_pos(buff, buff_len);

	if(body_pos < 0)
	{
		return NULL;
	}
	return buff + body_pos;
}

static kal_int32 nq_zh_http_get_wap_flag(kal_int8* recv_buf)
{
	if(NULL == strstr((kal_char*)recv_buf,"text/vnd.wap.wml"))
	{
		return 0; 	//没找到
	}
	else
	{
		return 1; 	//找到,是主页推送
	}
}

static kal_int32 nq_zh_http_GetInfo(NQ_zh_httpinfo *httpInfo, kal_int8* recv_buf, kal_int32 recv_len)
{
	kal_int8* bodybuff = NULL;

	if((bodybuff = nq_zh_http_get_bodyBuffer(recv_buf, recv_len)) == NULL)
	{
		return -1;
	}

	httpInfo->BodyLength = nq_zh_http_get_body_length(recv_buf, recv_len);

	httpInfo->StatueCode = atoi((kal_char*)(recv_buf + 9));;
	httpInfo->pBody = bodybuff;

	httpInfo->wap_flag = nq_zh_http_get_wap_flag(recv_buf);

	return 0;
}

/******************************************************************************
 * nq_zh_http_recv_isFinished  
 *  
 * Description:
 *  收到数据后判断数据是否完整(即是否接收完毕)
 *  
 * Input: 
 *  kal_int8* recv_buf	接收的数据
 *  kal_int32 recv_len	接收数据的长度
 *  
 * Output: 
 *  kal_int32 *wap_flag	是否是主页推送,如果是,组件会启动二次发送数据
 *
 * Returns: 
 *  kal_int32	= 0	数据未接受完毕
 *			> 0	接收完毕,返回接收数据的长度
 * 
 * modification history
 * -----------------------------------	-------
 * 
 ******************************************************************************/
kal_int32 nq_zh_http_recv_isFinished(kal_int8* recv_buf, kal_int32 recv_len, kal_int32 *wap_flag)
{
	
	kal_int32 full_length = 0;

	//__NQ_ZH_DEBUG(" nq_zh_http_recv_isFinished ,recv_len = %d, recv_buf = %s", recv_len,recv_buf);

	full_length = nq_zh_http_get_data_full_length(recv_buf, recv_len);

	if(full_length < 0)
	{
		return 0;
	}
	
	if(recv_len >= full_length)
	{
		*wap_flag = nq_zh_http_get_wap_flag(recv_buf);
		__NQ_ZH_DEBUG(" nq_zh_http_recv_isFinished ,data full length = %d, received length = %d", full_length,recv_len);
		return full_length;
	}
	__NQ_ZH_DEBUG(" nq_zh_http_recv_isFinished not done, data full length = %d ,received length = %d", full_length,recv_len);

	return 0;
}

extern kal_int16 unicode_to_ansi(kal_uint8 *ansi, const kal_uint16* uni, kal_int32 boundlen);
extern void mmi_vcard_util_convert_to_ucs2(kal_int8 *dst, kal_uint8 dst_size, kal_int8 *src, kal_uint8 encode);

/******************************************************************************
 * nq_zh_http_callback  
 *  
 * Description:
 *  用户发送数据后的回调函数
 *  
 * Input: 
 *  recvd_len     >=0 接收数据长度
 			<0 发送或接收失败
 *  
 * Output: 
 *  
 * Returns: 
 *  
 * 
 * modification history
 * -----------------------------------	-------
 * 
 ******************************************************************************/
void nq_zh_http_callback(kal_int32 recvd_len)
{
	//kal_uint8 testStr[1024*4] = {0};
	if(recvd_len < 0)
	{
		//error
		__NQ_ZH_DEBUG(" nq_zh_http_callback , error = %d", recvd_len);
	}
	else
	{
		NQ_zh_httpinfo httpinfo = {0};
		g_nq_zh_http_context_p->recv_offset = recvd_len;
		nq_zh_http_GetInfo(&httpinfo, g_nq_zh_http_context_p->recv_buf, g_nq_zh_http_context_p->recv_offset);
		
		__NQ_ZH_DEBUG(" nq_zh_http_callback ,recvd result = %d,  recvd buf = %s",httpinfo.StatueCode, httpinfo.pBody);
		//mmi_vcard_util_convert_to_ucs2((kal_int8*)testStr, 1024*4, httpinfo.pBody, 0);
		//__NQ_ZH_DEBUG(" nq_zh_http_callback ,222 recvd result = %d,  testStr = %s", testStr);
		//unicode_to_ansi((kal_uint8*)testStr2, (kal_uint16*)testStr, 1024*4);
		
		//__NQ_ZH_DEBUG(" nq_zh_http_callback ,333 recvd result = %d,  testStr2 = %s", testStr2);
		nq_zh_http_destroy();		
	}
}

void nq_zh_http_SendHttpReq(void)
{
	if(nq_zh_http_init() == NQ_ZH_FAILED)
	{
		__NQ_ZH_DEBUG(" nq_zh_http_SendHttpReq , init failed");
		return;
	}
	
	//nq_zh_http_SetOption(NQ_ZH_HTTPREQF_GET, "http://www.591mo.com/stat/update.php");
	
	
	nq_zh_http_SetOption(NQ_ZH_HTTPREQF_GET, "http://211.136.107.7:8180/traveler/port.do?funcId=1000&%20serial=1&%20vsn=V1.0&type=0&%20flag=0%20&innertype=1%20&channel=&%20username=test&%20password=test&city=%E4%B8%8A%E6%B5%B7");	
	nq_zh_http_SetDefaultOption();

	nq_zh_http_SetOption(NQ_ZH_HTTPREQF_UserAgent, "nokia7610");
	
	nq_zh_http_SetBodyData(NULL, 0);
	
	nq_zh_core_send_req(g_nq_zh_http_context_p->request_buf, g_nq_zh_http_context_p->request_offset, 
		g_nq_zh_http_context_p->recv_buf, g_nq_zh_http_context_p->recv_len_max, 
		nq_zh_http_recv_isFinished, 
		nq_zh_http_callback);
}

⌨️ 快捷键说明

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