//Http解析协议部分 uint8 HttpDispose(_HttpInfo* pHttpInfo, ACE_Message_Block* pCurrMessage, IMessageBlockManager* pMessageBlockManager, _Packet_Info* pPacketInfo) { if((NULL == pHttpInfo)||(NULL == pCurrMessage)||(NULL == pMessageBlockManager)||(NULL == pPacketInfo)) { OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]ptrpoint is full.\n")); return PACKET_GET_ERROR; } char* pData = pCurrMessage->rd_ptr(); //得到这个数据块的首字节 uint32 u4Data = (uint32)pCurrMessage->length(); //得到这个数据块的长度 //将收到的数据粘入缓冲等待做切包处理 if(pHttpInfo->m_u4DataLength + u4Data > MAX_DECRYPTLENGTH) { OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]pHttpInfo is full.\n")); return PACKET_GET_ERROR; } //OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]sizeof()=%d.\n", sizeof(pHttpInfo->m_szData))); //OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]m_u4DataLength=%d.\n", pHttpInfo->m_u4DataLength)); //OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]u4Data=%d.\n", u4Data)); ACE_OS::memcpy(&pHttpInfo->m_szData[pHttpInfo->m_u4DataLength], pData, u4Data); pHttpInfo->m_u4DataLength += u4Data; //pHttpInfo->m_szData[pHttpInfo->m_u4DataLength] = '\0'; //寻找Http包头 char* pHttpHead = ACE_OS::strstr(pHttpInfo->m_szData, HTTP_HEAD_END); if(NULL == pHttpHead) { OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]pHttpHead is NULL.\n")); return PACKET_GET_NO_ENOUGTH; } //OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]http:\n%s", pHttpInfo->m_szData)); uint32 u4HttpHeadLen = (uint32)(pHttpHead - pHttpInfo->m_szData + 4); //OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]u4HttpHeadLen=%d.\n", u4HttpHeadLen)); //找到了完整的包头 pPacketInfo->m_pmbHead = pMessageBlockManager->Create(u4HttpHeadLen + 1); if(NULL == pPacketInfo->m_pmbHead) { OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]m_pmbHead is NULL.\n")); return PACKET_GET_ERROR; } memcpy(pPacketInfo->m_pmbHead->wr_ptr(), (char*)pHttpInfo->m_szData, u4HttpHeadLen); pPacketInfo->m_pmbHead->wr_ptr(u4HttpHeadLen); //设置命令字(HTTP固定命令字) pPacketInfo->m_u2PacketCommandID = 0xea01; pPacketInfo->m_u4HeadSrcLen = u4HttpHeadLen + 1; pPacketInfo->m_u4HeadCurrLen = u4HttpHeadLen + 1; //查看有没有包体 uint32 u4HttpBodyLength = 0; uint8 u1Ret = GetHttpBodyLen(pHttpInfo->m_szData, pHttpInfo->m_u4DataLength, u4HttpHeadLen, u4HttpBodyLength, pPacketInfo); if(u1Ret != PACKET_GET_ENOUGTH) { OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]u1Ret:%d.\n",u1Ret)); return u1Ret; } //OUR_DEBUG((LM_ERROR, "[CPacketParse::HttpDispose]u4HttpBodyLength=%d.\n", u4HttpBodyLength)); if(u4HttpBodyLength == 0) { //获得包体 pPacketInfo->m_pmbBody = NULL; pPacketInfo->m_u4BodySrcLen = 0; pPacketInfo->m_u4BodyCurrLen = 0; } else { //有包体,创建包体 pPacketInfo->m_pmbBody = pMessageBlockManager->Create(u4HttpBodyLength + 1); if(NULL == pPacketInfo->m_pmbBody) { OUR_DEBUG((LM_ERROR, "[HttpDispose]m_pmbBody is NULL.\n")); return PACKET_GET_ERROR; } memcpy(pPacketInfo->m_pmbBody->wr_ptr(), (char*)pHttpHead+4, u4HttpBodyLength); pPacketInfo->m_pmbBody->wr_ptr(u4HttpBodyLength); pPacketInfo->m_u4BodySrcLen = (uint32)u4HttpBodyLength + 1; pPacketInfo->m_u4BodyCurrLen = (uint32)u4HttpBodyLength + 1; } //处理完的数据从池中移除 pCurrMessage->rd_ptr(u4Data); pHttpInfo->Clear(); return (uint8)PACKET_GET_ENOUGTH; }
static int TestParseHttpRequest( struct HttpEnv *e , char *str ) { SOCKET connect_sock ; struct sockaddr_in connect_addr ; struct HttpBuffer *b = NULL ; int nret = 0 ; ResetHttpEnv( e ); connect_sock = socket( AF_INET , SOCK_STREAM , IPPROTO_TCP ) ; if( connect_sock == -1 ) { printf( "socket failed , errno[%d]\n" , errno ); return -1; } memset( & connect_addr , 0x00 , sizeof(struct sockaddr_in) ); connect_addr.sin_family = AF_INET; connect_addr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); connect_addr.sin_port = htons( (unsigned short)9527 ); nret = connect( connect_sock , (struct sockaddr *) & connect_addr , sizeof(struct sockaddr) ) ; if( nret == -1 ) { printf( "connect failed , errno[%d]\n" , errno ); return -1; } b = GetHttpRequestBuffer(e) ; nret = StrcatHttpBuffer( b , str ) ; if( nret ) { printf( "StrcatfHttpBuffer failed[%d] , errno[%d]\n" , nret , errno ); return -1; } nret = RequestHttp( connect_sock , NULL , e ) ; CLOSESOCKET( connect_sock ); if( nret ) { printf( "RequestHttp failed[%d] , errno[%d]\n" , nret , errno ); return -1; } else { if( CountHttpHeaders( e ) > 0 ) { struct HttpHeader *p_header = NULL ; p_header = TravelHttpHeaderPtr( e , NULL ) ; while( p_header ) { printf( "HTTP HREADER [%.*s] [%.*s]\n" , GetHttpHeaderNameLen(p_header) , GetHttpHeaderNamePtr(p_header,NULL) , GetHttpHeaderValueLen(p_header) , GetHttpHeaderValuePtr(p_header,NULL) ); p_header = TravelHttpHeaderPtr( e , p_header ) ; } } if( GetHttpBodyLen( e ) > 0 ) { printf( "HTTP BODY [%.*s]\n" , GetHttpBodyLen(e) , GetHttpBodyPtr(e,NULL) ); } } return 0; }