Loading examples/httpclient.cpp +81 −35 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include <algorithm> #include <memory> #include <chrono> #include <thread> #include <iostream> Loading Loading @@ -63,22 +65,35 @@ T Hex2Int(const char* const hexstr, bool* overflow=nullptr) return result; } size_t readchunk(const char *data,size_t datasize,size_t &pos){ size_t start=pos; while( (pos < datasize || pos < 512)&& data[pos++]!='\r'); int readchunk(const char* data, size_t datasize, size_t& pos) { int start = pos; char value[512]; if(pos-start > 512){ return 0; while ((pos < datasize) && data[pos] != '\r') { ++pos; }; int len = pos - start; if (len > 511) { libhttppp::HTTPException ee; ee[libhttppp::HTTPException::Error] << "nginxfiler: chunck size: " << len << " to big aborting !"; throw ee; } memcpy(value,data+start,pos-start); memcpy(value, data + start, len); ++pos; value[len] = '\0'; return Hex2Int(value,nullptr); if (len < 1) { return 0; } int result = strtol(value,nullptr, 16); return result; } int main(int argc, char** argv){ #ifndef Windows signal(SIGPIPE, SIG_IGN); Loading @@ -103,23 +118,21 @@ int main(int argc, char** argv){ return -1; } char *data = new char[16384]; size_t recv= cltsock.recvData(&srvsock,data,16384); std::shared_ptr<char[]> data(new char[16384], std::default_delete<char[]>()); size_t recv= cltsock.recvData(&srvsock,data.get(), 16384); std::string html; std::vector<char> html; libhttppp::HttpResponse res; size_t len=recv,chunklen=0,hsize=0; bool chunked=false; long long rlen=0; hsize=res.parse(data,recv); hsize+=2; hsize=res.parse(data.get(), recv); try { const char *rctype=res.getTransferEncoding(); if(strcmp(rctype,"chunked")==0){ chunklen=readchunk(data,recv,hsize); chunked=true; } }catch(...){ Loading @@ -127,32 +140,65 @@ int main(int argc, char** argv){ rlen=(long)res.getContentLength(); }; size_t cpos = hsize; if(!chunked){ do{ html.append(data+hsize,recv-hsize); rlen-=((long)recv-hsize); std::copy(data.get() + cpos, data.get()+recv, std::back_inserter(html)); rlen-=((long)recv- cpos); if(rlen>0){ recv=(long)srvsock.recvData(&cltsock,data,16384); hsize=0; recv=(long)cltsock.recvData(&srvsock,data.get(), 16384); cpos=0; } }while(rlen>0); }else{ size_t cpos=hsize; do{ if((cpos+chunklen)<recv){ html.append(data+cpos,chunklen); size_t readed = 0; for (;;) { if (recv - cpos > 0) { if (readed == chunklen) { if ((chunklen = readchunk(data.get(), recv, cpos)) == 0) { break; }else if(chunklen>recv){ html.append(data+cpos,recv-cpos); chunklen-=(recv-cpos); } std::cout << chunklen << std::endl; readed = 0; } size_t len = (chunklen - readed) < (recv - cpos) ? (chunklen - readed) : (recv - cpos); std::copy(data.get() + cpos, data.get() + (cpos + len), std::back_inserter(html)); cpos += len; readed += len; } else { try { for (;;) { cpos = 0; try { recv = cltsock.recvData(&srvsock, data.get(), 16384); break; } catch (netplus::NetException& e) { if (e.getErrorType() == netplus::NetException::Note) { std::this_thread::sleep_for(std::chrono::milliseconds(10)); continue; } throw e; } }while((chunklen=readchunk(data,recv,cpos))>0); } } catch (netplus::NetException& e) { libhttppp::HTTPException ee; ee[libhttppp::HTTPException::Error] << e.what(); throw ee; } } }; delete[] data; } std::cout << html << std::endl; std::cout.write(html.data(), html.size())<< std::endl; return 0; }catch(netplus::NetException &exp){ std::cerr << exp.what() <<std::endl; Loading Loading
examples/httpclient.cpp +81 −35 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ #include <algorithm> #include <memory> #include <chrono> #include <thread> #include <iostream> Loading Loading @@ -63,22 +65,35 @@ T Hex2Int(const char* const hexstr, bool* overflow=nullptr) return result; } size_t readchunk(const char *data,size_t datasize,size_t &pos){ size_t start=pos; while( (pos < datasize || pos < 512)&& data[pos++]!='\r'); int readchunk(const char* data, size_t datasize, size_t& pos) { int start = pos; char value[512]; if(pos-start > 512){ return 0; while ((pos < datasize) && data[pos] != '\r') { ++pos; }; int len = pos - start; if (len > 511) { libhttppp::HTTPException ee; ee[libhttppp::HTTPException::Error] << "nginxfiler: chunck size: " << len << " to big aborting !"; throw ee; } memcpy(value,data+start,pos-start); memcpy(value, data + start, len); ++pos; value[len] = '\0'; return Hex2Int(value,nullptr); if (len < 1) { return 0; } int result = strtol(value,nullptr, 16); return result; } int main(int argc, char** argv){ #ifndef Windows signal(SIGPIPE, SIG_IGN); Loading @@ -103,23 +118,21 @@ int main(int argc, char** argv){ return -1; } char *data = new char[16384]; size_t recv= cltsock.recvData(&srvsock,data,16384); std::shared_ptr<char[]> data(new char[16384], std::default_delete<char[]>()); size_t recv= cltsock.recvData(&srvsock,data.get(), 16384); std::string html; std::vector<char> html; libhttppp::HttpResponse res; size_t len=recv,chunklen=0,hsize=0; bool chunked=false; long long rlen=0; hsize=res.parse(data,recv); hsize+=2; hsize=res.parse(data.get(), recv); try { const char *rctype=res.getTransferEncoding(); if(strcmp(rctype,"chunked")==0){ chunklen=readchunk(data,recv,hsize); chunked=true; } }catch(...){ Loading @@ -127,32 +140,65 @@ int main(int argc, char** argv){ rlen=(long)res.getContentLength(); }; size_t cpos = hsize; if(!chunked){ do{ html.append(data+hsize,recv-hsize); rlen-=((long)recv-hsize); std::copy(data.get() + cpos, data.get()+recv, std::back_inserter(html)); rlen-=((long)recv- cpos); if(rlen>0){ recv=(long)srvsock.recvData(&cltsock,data,16384); hsize=0; recv=(long)cltsock.recvData(&srvsock,data.get(), 16384); cpos=0; } }while(rlen>0); }else{ size_t cpos=hsize; do{ if((cpos+chunklen)<recv){ html.append(data+cpos,chunklen); size_t readed = 0; for (;;) { if (recv - cpos > 0) { if (readed == chunklen) { if ((chunklen = readchunk(data.get(), recv, cpos)) == 0) { break; }else if(chunklen>recv){ html.append(data+cpos,recv-cpos); chunklen-=(recv-cpos); } std::cout << chunklen << std::endl; readed = 0; } size_t len = (chunklen - readed) < (recv - cpos) ? (chunklen - readed) : (recv - cpos); std::copy(data.get() + cpos, data.get() + (cpos + len), std::back_inserter(html)); cpos += len; readed += len; } else { try { for (;;) { cpos = 0; try { recv = cltsock.recvData(&srvsock, data.get(), 16384); break; } catch (netplus::NetException& e) { if (e.getErrorType() == netplus::NetException::Note) { std::this_thread::sleep_for(std::chrono::milliseconds(10)); continue; } throw e; } }while((chunklen=readchunk(data,recv,cpos))>0); } } catch (netplus::NetException& e) { libhttppp::HTTPException ee; ee[libhttppp::HTTPException::Error] << e.what(); throw ee; } } }; delete[] data; } std::cout << html << std::endl; std::cout.write(html.data(), html.size())<< std::endl; return 0; }catch(netplus::NetException &exp){ std::cerr << exp.what() <<std::endl; Loading