// @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(); }
// @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; }