Loading examples/httpclient.cpp +25 −2 Changes for examples/httpclient.cpp: 25 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -25,10 +25,13 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include <iostream> #include <netplus/socket.h> #include <netplus/exception.h> #include "http.h" #include "exception.h" int main(int argc, char** argv){ try{ Loading @@ -36,13 +39,33 @@ int main(int argc, char** argv){ netplus::socket *cltsock=srvsock.connect(); libhttppp::HttpRequest req; try{ req.setRequestType(GETREQUEST); req.setRequestURL(argv[3]); req.setRequestVersion(HTTPVERSION(1.1)); *req.setData("Connection") << "closed"; *req.setData("Host") << argv[1]; req.send(cltsock,&srvsock); }catch(libhttppp::HTTPException &e){ std::cerr << e.what() << std::endl; return -1; } char data[512]; int len=cltsock->recvData(&srvsock,data,512); libhttppp::HttpResponse res; size_t hsize=res.parse(data,len); std::cout << res.<<std::endl; std::string html; html.resize(len-hsize); html.assign(data+hsize,len-hsize); std::cout << html << std::endl; }catch(netplus::NetException &exp){ throw exp.what(); std::cerr << exp.what() <<std::endl; return -1; } } src/http.cpp +94 −4 Changes for src/http.cpp: 94 added lines, 4 removed lines. Original line number Diff line number Diff line Loading @@ -84,12 +84,18 @@ const char* libhttppp::HttpHeader::getValue(HttpHeader::HeaderData* pos){ } const char* libhttppp::HttpHeader::getData(const char* key,HttpHeader::HeaderData **pos){ for(HeaderData *curdat=_firstHeaderData; curdat; curdat=curdat->_nextHeaderData){ HeaderData *curdat; if(!pos) curdat =_firstHeaderData; else curdat = *pos; while(curdat){ if(curdat->_Key==key){ if(pos!=nullptr) *pos=curdat; return curdat->_Value.c_str(); } curdat=curdat->_nextHeaderData; } return nullptr; } Loading Loading @@ -235,8 +241,8 @@ void libhttppp::HttpResponse::setContentType(const char* type){ } void libhttppp::HttpResponse::setConnection(const char* type){ _ContentLength=setData("connection",_ContentType); *_ContentLength<<type; _Connection=setData("connection",_Connection); *_Connection<<type; } void libhttppp::HttpResponse::setVersion(const char* version){ Loading @@ -249,6 +255,17 @@ void libhttppp::HttpResponse::setVersion(const char* version){ _Version=version; } const char * libhttppp::HttpResponse::getState(){ return _State.c_str(); } size_t libhttppp::HttpResponse::getContentLength(){ return getDataSizet("content-length",&_ContentLength); } const char * libhttppp::HttpResponse::getContentType(){ return getData("content-type",&_ContentType); } void libhttppp::HttpResponse::send(netplus::con* curconnection, const char* data){ send(curconnection,data,strlen(data)); Loading Loading @@ -283,8 +300,80 @@ void libhttppp::HttpResponse::send(netplus::con* curconnection,const char* data, curconnection->sending(true); } void libhttppp::HttpResponse::parse(const char *data,size_t len){ size_t libhttppp::HttpResponse::parse(const char *data,size_t inlen){ if(inlen <9){ HTTPException excep; throw excep[HTTPException::Error] << "HttpResponse header too small aborting!"; } int v=5; if(memcmp(data,"HTTP/",5)==0){ while(v<inlen){ if(data[v]==' ') break; ++v; } } std::copy(data,data+v,std::begin(_Version)); size_t ve=v; while(ve<inlen){ if(data[ve]=='\r' || data[ve]=='\n') break; ++ve; }; std::copy(data+v,data+ve,std::begin(_State)); while(ve<inlen){ if(data[ve]!='\r' || data[ve]!='\n') break; ++ve; } size_t lrow=0,delimeter=0,startkeypos=0,pos=ve; while(pos< inlen){ if(delimeter==0 && data[pos]==':'){ delimeter=pos; } if( (data[pos]=='\r' && data[pos+2]=='\r') || (data[pos]!='\n' && data[pos+1]=='\n') ){ break; } if(data[pos]=='\r' || (data[pos-1]!='\r' && data[pos]=='\n') ){ if(delimeter>lrow && delimeter!=0){ size_t keylen=delimeter-startkeypos; if(keylen>0 && keylen <= inlen){ std::string key; key.resize(keylen); std::copy(data+startkeypos,data+delimeter,std::begin(key)); for (size_t it = 0; it < keylen; ++it) { key[it] = (char)tolower(key[it]); } size_t valuelen=(pos-delimeter)-2; if(pos > 0 && valuelen <= inlen){ std::string value; value.resize(valuelen); size_t vstart=delimeter+2; std::copy(data+vstart,data+(pos-2),std::begin(value)); for (size_t it = 0; it < valuelen; ++it) { value[it] = (char)tolower(value[it]); } *setData(key.c_str())<<value.c_str(); } } } delimeter=0; lrow=pos; startkeypos=lrow+2; } ++pos; } return pos; } Loading Loading @@ -460,6 +549,7 @@ void libhttppp::HttpRequest::printHeader(std::string &buffer){ buffer.append(getValue(curdat)); buffer.append("\r\n"); } buffer.append("\r\n"); } Loading src/http.h +8 −1 Changes for src/http.h: 8 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -91,6 +91,13 @@ namespace libhttppp { void setConnection(const char *type); void setVersion(const char* version); /*client methods*/ const char *getState(); const char *getContentType(); size_t getContentLength(); const char *getConnection(); const char *getVersion(); size_t printHeader(std::string &buffer); /*server methods*/ Loading @@ -98,7 +105,7 @@ namespace libhttppp { void send(netplus::con *curconnection,const char* data, unsigned long datalen); //only use as server /*client method*/ void parse(const char *data,size_t len); size_t parse(const char *in,size_t inlen); private: std::string _State; std::string _Version; Loading Loading
examples/httpclient.cpp +25 −2 Changes for examples/httpclient.cpp: 25 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -25,10 +25,13 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include <iostream> #include <netplus/socket.h> #include <netplus/exception.h> #include "http.h" #include "exception.h" int main(int argc, char** argv){ try{ Loading @@ -36,13 +39,33 @@ int main(int argc, char** argv){ netplus::socket *cltsock=srvsock.connect(); libhttppp::HttpRequest req; try{ req.setRequestType(GETREQUEST); req.setRequestURL(argv[3]); req.setRequestVersion(HTTPVERSION(1.1)); *req.setData("Connection") << "closed"; *req.setData("Host") << argv[1]; req.send(cltsock,&srvsock); }catch(libhttppp::HTTPException &e){ std::cerr << e.what() << std::endl; return -1; } char data[512]; int len=cltsock->recvData(&srvsock,data,512); libhttppp::HttpResponse res; size_t hsize=res.parse(data,len); std::cout << res.<<std::endl; std::string html; html.resize(len-hsize); html.assign(data+hsize,len-hsize); std::cout << html << std::endl; }catch(netplus::NetException &exp){ throw exp.what(); std::cerr << exp.what() <<std::endl; return -1; } }
src/http.cpp +94 −4 Changes for src/http.cpp: 94 added lines, 4 removed lines. Original line number Diff line number Diff line Loading @@ -84,12 +84,18 @@ const char* libhttppp::HttpHeader::getValue(HttpHeader::HeaderData* pos){ } const char* libhttppp::HttpHeader::getData(const char* key,HttpHeader::HeaderData **pos){ for(HeaderData *curdat=_firstHeaderData; curdat; curdat=curdat->_nextHeaderData){ HeaderData *curdat; if(!pos) curdat =_firstHeaderData; else curdat = *pos; while(curdat){ if(curdat->_Key==key){ if(pos!=nullptr) *pos=curdat; return curdat->_Value.c_str(); } curdat=curdat->_nextHeaderData; } return nullptr; } Loading Loading @@ -235,8 +241,8 @@ void libhttppp::HttpResponse::setContentType(const char* type){ } void libhttppp::HttpResponse::setConnection(const char* type){ _ContentLength=setData("connection",_ContentType); *_ContentLength<<type; _Connection=setData("connection",_Connection); *_Connection<<type; } void libhttppp::HttpResponse::setVersion(const char* version){ Loading @@ -249,6 +255,17 @@ void libhttppp::HttpResponse::setVersion(const char* version){ _Version=version; } const char * libhttppp::HttpResponse::getState(){ return _State.c_str(); } size_t libhttppp::HttpResponse::getContentLength(){ return getDataSizet("content-length",&_ContentLength); } const char * libhttppp::HttpResponse::getContentType(){ return getData("content-type",&_ContentType); } void libhttppp::HttpResponse::send(netplus::con* curconnection, const char* data){ send(curconnection,data,strlen(data)); Loading Loading @@ -283,8 +300,80 @@ void libhttppp::HttpResponse::send(netplus::con* curconnection,const char* data, curconnection->sending(true); } void libhttppp::HttpResponse::parse(const char *data,size_t len){ size_t libhttppp::HttpResponse::parse(const char *data,size_t inlen){ if(inlen <9){ HTTPException excep; throw excep[HTTPException::Error] << "HttpResponse header too small aborting!"; } int v=5; if(memcmp(data,"HTTP/",5)==0){ while(v<inlen){ if(data[v]==' ') break; ++v; } } std::copy(data,data+v,std::begin(_Version)); size_t ve=v; while(ve<inlen){ if(data[ve]=='\r' || data[ve]=='\n') break; ++ve; }; std::copy(data+v,data+ve,std::begin(_State)); while(ve<inlen){ if(data[ve]!='\r' || data[ve]!='\n') break; ++ve; } size_t lrow=0,delimeter=0,startkeypos=0,pos=ve; while(pos< inlen){ if(delimeter==0 && data[pos]==':'){ delimeter=pos; } if( (data[pos]=='\r' && data[pos+2]=='\r') || (data[pos]!='\n' && data[pos+1]=='\n') ){ break; } if(data[pos]=='\r' || (data[pos-1]!='\r' && data[pos]=='\n') ){ if(delimeter>lrow && delimeter!=0){ size_t keylen=delimeter-startkeypos; if(keylen>0 && keylen <= inlen){ std::string key; key.resize(keylen); std::copy(data+startkeypos,data+delimeter,std::begin(key)); for (size_t it = 0; it < keylen; ++it) { key[it] = (char)tolower(key[it]); } size_t valuelen=(pos-delimeter)-2; if(pos > 0 && valuelen <= inlen){ std::string value; value.resize(valuelen); size_t vstart=delimeter+2; std::copy(data+vstart,data+(pos-2),std::begin(value)); for (size_t it = 0; it < valuelen; ++it) { value[it] = (char)tolower(value[it]); } *setData(key.c_str())<<value.c_str(); } } } delimeter=0; lrow=pos; startkeypos=lrow+2; } ++pos; } return pos; } Loading Loading @@ -460,6 +549,7 @@ void libhttppp::HttpRequest::printHeader(std::string &buffer){ buffer.append(getValue(curdat)); buffer.append("\r\n"); } buffer.append("\r\n"); } Loading
src/http.h +8 −1 Changes for src/http.h: 8 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -91,6 +91,13 @@ namespace libhttppp { void setConnection(const char *type); void setVersion(const char* version); /*client methods*/ const char *getState(); const char *getContentType(); size_t getContentLength(); const char *getConnection(); const char *getVersion(); size_t printHeader(std::string &buffer); /*server methods*/ Loading @@ -98,7 +105,7 @@ namespace libhttppp { void send(netplus::con *curconnection,const char* data, unsigned long datalen); //only use as server /*client method*/ void parse(const char *data,size_t len); size_t parse(const char *in,size_t inlen); private: std::string _State; std::string _Version; Loading