Beispiel #1
0
// @brief Send post request
// @param string uri the request uri
// @return If no error occurs returns the number of receive data in bytes,
// Otherwise -1 is returns
int HTTPClient::post( string uri, Chars &body )
{
	string str;
	m_method = "POST";
	str += "POST " + uri + " " + m_version;
	str += "\r\n";
	str += "Host: " + m_host;
	str += "\r\n";
	map<string, string>::iterator iter = m_requestHeader.begin();
	while (iter != m_requestHeader.end()) {
		str += iter->first + ": ";
		str += iter->second;
		str += "\r\n";
		++iter;
	}
	// Set 'Content-length'
	str += "Content-Length: ";
	char buf[25];
	snprintf(buf, 25, "%ld", body.length());
	str += buf;
	str += "\r\n";

	// Headers end
	str += "\r\n";

	Chars data;
	data.assign(str.c_str(), str.length());
	data.append(body.c_str(), body.length());

	if (!isBlocking()) {
		setBlocking();
	}

	// Set receive and send timeout to 5 seconds
	int nTimeout = 5000;
	if (m_host == "127.0.0.1") {
		nTimeout = 100;
	}
	setRcvTimeout(nTimeout);
	setSndTimeout(nTimeout);

	int n = this->send(data.c_str(), data.length());
	if (n == -1) {
		return n;
	}
	//this->shutdown(SHUT_WD);

	/**
	 * Receive response data
	 */

	// Receive all response data to socket buffer including HTTP headers
	while ( this->recv(1024) > 0 )
		;
	return decodeHttpData();
}
Beispiel #2
0
// @brief 获取Chars的一部分
// @param beg 开始索引, size 指定大小
// @return 切割后的Chars
Chars Chars::substr(size_t beg, size_t size)
{
	Chars ch;
	if (isEmpty() || beg > m_length ) {
		// Return an empty Chars
		return ch;
	}
	char *s = new char[size];
	if (s == NULL) {
		return ch;
	}

	char *b = m_data + beg;
	if (beg + size > m_length) {
		size = m_length - beg;
	}
	memcpy(s, b, size);
	ch.assign(s, size);
	delete[] s;
	return ch;
}