Example #1
0
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;
	

}
Example #2
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);
	
}
Example #3
0
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 ;
}
Example #4
0
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;
	
}