Commit 4684b415 authored by jan.koester's avatar jan.koester
Browse files

test

parent 18fd6a0d
Loading
Loading
Loading
Loading
+81 −35
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *******************************************************************************/

#include <algorithm>
#include <memory>
#include <chrono>
#include <thread>
#include <iostream>
@@ -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);
@@ -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(...){
@@ -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;