Loading examples/httpclient.cpp +7 −5 Changes for examples/httpclient.cpp: 7 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -51,7 +51,6 @@ int main(int argc, char** argv){ *req.setData("connection") << "keep-alive"; *req.setData("host") << argv[1] << ":" << argv[2]; *req.setData("accept") << "text/html"; *req.setData("scheme") << "http"; *req.setData("user-agent") << "libhttppp/1.0 (Alpha Version 0.1)"; req.send(cltsock,&srvsock); }catch(libhttppp::HTTPException &e){ Loading @@ -60,11 +59,11 @@ int main(int argc, char** argv){ } char data[16384]; int recv=cltsock->recvData(&srvsock,data,16384); size_t recv=cltsock->recvData(&srvsock,data,16384); std::string html; libhttppp::HttpResponse res; size_t amount = 0,rlen=0,len=recv; size_t amount = 0,rlen=-1,len=recv; try { size_t hsize=res.parse(data,len); Loading @@ -73,20 +72,23 @@ int main(int argc, char** argv){ if(amount>0) html.assign(data+hsize,amount); size_t rlen; try{ rlen=res.getContentLength(); html.resize(rlen); }catch(...){ rlen=0; rlen=-1; } }catch(libhttppp::HTTPException &e){ std::cerr << e.what() << std::endl; }; while(amount<rlen){ recv=cltsock->recvData(&srvsock,data,16384); if(recv!=0){ amount+=recv; html.append(data,recv); } } delete cltsock; if(!html.empty()) std::cout << html << std::endl; Loading src/http.cpp +28 −22 Changes for src/http.cpp: 28 added lines, 22 removed lines. Original line number Diff line number Diff line Loading @@ -288,6 +288,8 @@ void libhttppp::HttpResponse::send(netplus::con* curconnection,const char* data, curconnection->sending(true); } #include <iostream> size_t libhttppp::HttpResponse::parse(const char *data,size_t inlen){ if(inlen <9){ HTTPException excep; Loading Loading @@ -321,32 +323,45 @@ size_t libhttppp::HttpResponse::parse(const char *data,size_t inlen){ std::copy(data+v,data+ve,std::begin(_State)); while(ve<inlen){ if(data[ve]!='\n') break; ++ve; } ++ve; size_t helen=inlen; for(size_t cur=ve; cur<inlen; ++cur){ if(cur+3 < inlen && memcmp(data+cur,"\r\n\r\n",4)==0 ){ helen=cur+4; break; }else if(cur+1 < inlen && memcmp(data+cur,"\n\n",2)==0){ helen=cur+2; break; } } /*parse the http header fields*/ size_t lrow=0,delimeter=0,startkeypos=0; size_t lrow=0,delimeter=0,startkeypos=0,pos=ve; while(pos< inlen){ for(size_t pos=ve; pos< helen; ++pos){ if(delimeter==0 && data[pos]==':'){ delimeter=pos; } 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){ if(keylen>0 && keylen <= helen){ std::string key; key.resize(keylen); std::copy(data+startkeypos,data+delimeter,std::begin(key)); for (size_t it = 0; it < keylen; ++it) { if(isalpha(key[it])) key[it] = (char)tolower(key[it]); } size_t valuelen=(pos-delimeter)-1; if(pos > 0 && valuelen <= inlen){ size_t valuelen=pos-delimeter; if(pos > 0 && valuelen <=helen){ std::string value; size_t vstart=++delimeter; value.resize(valuelen); std::copy(data+(delimeter+1),data+(pos-1),std::begin(value)); std::copy(data+delimeter,data+pos,std::begin(value)); for (size_t it = 0; it < valuelen; ++it) { if(isalpha(value[it])) value[it] = (char)tolower(value[it]); } *setData(key.c_str())<<value.c_str(); Loading @@ -356,25 +371,16 @@ size_t libhttppp::HttpResponse::parse(const char *data,size_t inlen){ delimeter=0; lrow=pos; startkeypos=lrow+2; } if(delimeter==0 && data[pos]==':'){ }else if(delimeter==0 && data[pos]==':'){ delimeter=pos; } if(data[pos]=='\r' && data[pos+3]=='\n'){ pos+=3; break; }else if(data[pos]=='\n' && data[pos+1]=='\n'){ ++pos; break; } ++pos; } _ContentLength=getData("content-length"); _Connection=getData("connection"); _ContentType=getData("content-type"); return ++pos; return helen; } libhttppp::HttpResponse::~HttpResponse(){ Loading Loading
examples/httpclient.cpp +7 −5 Changes for examples/httpclient.cpp: 7 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -51,7 +51,6 @@ int main(int argc, char** argv){ *req.setData("connection") << "keep-alive"; *req.setData("host") << argv[1] << ":" << argv[2]; *req.setData("accept") << "text/html"; *req.setData("scheme") << "http"; *req.setData("user-agent") << "libhttppp/1.0 (Alpha Version 0.1)"; req.send(cltsock,&srvsock); }catch(libhttppp::HTTPException &e){ Loading @@ -60,11 +59,11 @@ int main(int argc, char** argv){ } char data[16384]; int recv=cltsock->recvData(&srvsock,data,16384); size_t recv=cltsock->recvData(&srvsock,data,16384); std::string html; libhttppp::HttpResponse res; size_t amount = 0,rlen=0,len=recv; size_t amount = 0,rlen=-1,len=recv; try { size_t hsize=res.parse(data,len); Loading @@ -73,20 +72,23 @@ int main(int argc, char** argv){ if(amount>0) html.assign(data+hsize,amount); size_t rlen; try{ rlen=res.getContentLength(); html.resize(rlen); }catch(...){ rlen=0; rlen=-1; } }catch(libhttppp::HTTPException &e){ std::cerr << e.what() << std::endl; }; while(amount<rlen){ recv=cltsock->recvData(&srvsock,data,16384); if(recv!=0){ amount+=recv; html.append(data,recv); } } delete cltsock; if(!html.empty()) std::cout << html << std::endl; Loading
src/http.cpp +28 −22 Changes for src/http.cpp: 28 added lines, 22 removed lines. Original line number Diff line number Diff line Loading @@ -288,6 +288,8 @@ void libhttppp::HttpResponse::send(netplus::con* curconnection,const char* data, curconnection->sending(true); } #include <iostream> size_t libhttppp::HttpResponse::parse(const char *data,size_t inlen){ if(inlen <9){ HTTPException excep; Loading Loading @@ -321,32 +323,45 @@ size_t libhttppp::HttpResponse::parse(const char *data,size_t inlen){ std::copy(data+v,data+ve,std::begin(_State)); while(ve<inlen){ if(data[ve]!='\n') break; ++ve; } ++ve; size_t helen=inlen; for(size_t cur=ve; cur<inlen; ++cur){ if(cur+3 < inlen && memcmp(data+cur,"\r\n\r\n",4)==0 ){ helen=cur+4; break; }else if(cur+1 < inlen && memcmp(data+cur,"\n\n",2)==0){ helen=cur+2; break; } } /*parse the http header fields*/ size_t lrow=0,delimeter=0,startkeypos=0; size_t lrow=0,delimeter=0,startkeypos=0,pos=ve; while(pos< inlen){ for(size_t pos=ve; pos< helen; ++pos){ if(delimeter==0 && data[pos]==':'){ delimeter=pos; } 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){ if(keylen>0 && keylen <= helen){ std::string key; key.resize(keylen); std::copy(data+startkeypos,data+delimeter,std::begin(key)); for (size_t it = 0; it < keylen; ++it) { if(isalpha(key[it])) key[it] = (char)tolower(key[it]); } size_t valuelen=(pos-delimeter)-1; if(pos > 0 && valuelen <= inlen){ size_t valuelen=pos-delimeter; if(pos > 0 && valuelen <=helen){ std::string value; size_t vstart=++delimeter; value.resize(valuelen); std::copy(data+(delimeter+1),data+(pos-1),std::begin(value)); std::copy(data+delimeter,data+pos,std::begin(value)); for (size_t it = 0; it < valuelen; ++it) { if(isalpha(value[it])) value[it] = (char)tolower(value[it]); } *setData(key.c_str())<<value.c_str(); Loading @@ -356,25 +371,16 @@ size_t libhttppp::HttpResponse::parse(const char *data,size_t inlen){ delimeter=0; lrow=pos; startkeypos=lrow+2; } if(delimeter==0 && data[pos]==':'){ }else if(delimeter==0 && data[pos]==':'){ delimeter=pos; } if(data[pos]=='\r' && data[pos+3]=='\n'){ pos+=3; break; }else if(data[pos]=='\n' && data[pos+1]=='\n'){ ++pos; break; } ++pos; } _ContentLength=getData("content-length"); _Connection=getData("connection"); _ContentType=getData("content-type"); return ++pos; return helen; } libhttppp::HttpResponse::~HttpResponse(){ Loading