void Client::request( Method method, Uri uri, Header header, void *data, int len){ TCPSocket *socket = new TCPSocket( uri.getDomain().c_str(), uri.getPort(), [=](int err, TCPSocket *socket){ if( err != eNoError ){ EP_SAFE_DEFER( responseCallback, err, Header(),"" ); } else{ string *buffer = new string(); socket->onReceive( [=](void *data, int len){ buffer->append( (char*)data ); }); socket->onUnbind( [=](){ Header header; string body; int offset = header.load( *buffer ); /* todo : parse chunked content-length */ header.getField( "Transfer-Encoding"); if( offset == - 1 ){ EP_SAFE_DEFER( responseCallback, eParseError, Header(),"" ); } else{ body = buffer->substr( offset ); EP_SAFE_DEFER( responseCallback, eNoError, header, body ); } delete buffer; }); string requestLine = generateRequestLine( method, uri.getRequestUri(), "HTTP/1.1" ); string headerString = header.dump(); socket->write( (void*)requestLine.c_str(), requestLine.size()); socket->write( (void*)headerString.c_str(), headerString.size()); if( len > 0 ){ socket->write( data, len ); } } }); }