int NDHttpRequest::_parseHeader() { int datasize = _getDataSize () ; char *p_start = _getCurParseAddr() ; char buf[1024] ; if (!p_start) { return 0 ; } char *p = p_start ; p = parser_valid(p, datasize) ; if (!p) { return 0 ; } p = (char*) ndstr_nstr_end(p,buf,':', datasize -(int) (p-p_start) ) ; if(*p != ':') { return 0 ; } std::string hdrName = buf ; ++p ; p = parser_valid(p, datasize -(int) (p-p_start)); char *_st = p ; if(parser_check_end(p, &p, datasize -(int) (p-p_start)) ) { int len =(int)( p-_st ); memcpy(buf,_st, len-2) ; buf[len-2] = 0 ; std::string hdrVal = buf ; httpHeaderNode node1 = {hdrName, hdrVal} ; m_header.push_back(node1) ; len = (int)( p- p_start ); ndlbuf_sub_data(&m_recvBuf, len) ; if (*p=='\r' && *(p+1)=='\n') { ndlbuf_sub_data(&m_recvBuf, 2) ; m_parseStat = 2 ; //_dumRequestHeader() ; if (_findBodySize()==0) { m_parseProgress = 3 ;//without body } } return len ; } return 0; }
int NDHttpRequest::_parseBody() { int datasize = _getDataSize () ; char *p_start = _getCurParseAddr() ; if (!p_start) { return 0 ; } char *p = p_start ; for (int i=0; i< datasize; ++i) { m_body.push_back(*p) ; ++p ; if (m_body.size() >= m_bodySize) { m_parseStat = 3 ; break ; } } ndlbuf_sub_data(&m_recvBuf, (p - p_start)) ; return (int) (p - p_start); }
static int __tcpnode_push_and_send(struct nd_tcp_node *node, void *msg_buf, size_t datalen, int is_write_all) { ENTER_FUNC(); signed int ret =0; nd_netbuf_t *pbuf = &(node->send_buffer); size_t length_in_buff = ndlbuf_datalen(pbuf); if (length_in_buff) { int flushlen = node->sock_write((nd_handle)node, ndlbuf_data(pbuf), length_in_buff); if (flushlen > 0) { nd_assert(flushlen <= length_in_buff); ndlbuf_sub_data(pbuf, (size_t)flushlen); } length_in_buff = ndlbuf_datalen(pbuf); } if (length_in_buff == 0) { ret = __tcpnode_send_with_save(node, msg_buf, datalen); } else { size_t space_len = ndlbuf_free_capacity(pbuf); if(is_write_all && space_len < datalen) { node->myerrno = NDERR_WOULD_BLOCK; ret = -1; } else { ret = ndlbuf_write(pbuf, (void*)msg_buf, datalen, EBUF_SPECIFIED); } } LEAVE_FUNC(); return ret ; }
int NDHttpRequest::_parseInit() { int len ; int datasize = _getDataSize () ; char *p_start = _getCurParseAddr() ; char buf[1024] ; if (!p_start) { return 0 ; } char *p = p_start ; p = (char*) ndstristr(p,(char*)"HTTP") ; if (p) { len = parser_fetch_data(p, buf, datasize -(int)( p - p_start)) ; if (len >= datasize) { return 0 ; } p+= len ; //get status m_httpProtocol = buf ; m_status = (int)strtol(p, &p, 10); if (!p) { return 0 ; } if (parser_check_end(p,&p, datasize -(int)( p - p_start)) ) { //parse prorocol success len = (int)( p- p_start ); ndlbuf_sub_data(&m_recvBuf, len) ; m_parseStat = 1 ; return len ; } } return 0; }