Example #1
0
  inline bool downloadContent() {

    if(header.iposition("\r\nTransfer-Encoding: chunked\r\n")) {
      while(true) {
        unsigned length = hex(downloadChunkLength());
        if(length == 0) break;

        while(length) {
          char buffer[2048];
          int packetlength = recv(serversocket, buffer, min(sizeof(buffer), length), 0);
          if(packetlength <= 0) break;
          total_read += packetlength;
          length -= packetlength;

          write_cb(buffer, packetlength);
          if(progress_cb && !progress_cb(total_read, total_length))
            return false;
        }
      }
    } else if(auto position = header.iposition("\r\nContent-Length: ")) {
      unsigned length = decimal((const char*)header + position() + 18);
      total_length = length;
      while(length) {
        char buffer[2048];
        int packetlength = recv(serversocket, buffer, min(sizeof(buffer), length), 0);
        if(packetlength <= 0) break;
        total_read += packetlength;
        length -= packetlength;

        write_cb(buffer, packetlength);
        if(progress_cb && !progress_cb(total_read, total_length))
          return false;
      }

      if(total_read < total_length)
        return false;
    } else {
      while(true) {
        char buffer[2048];
        int packetlength = recv(serversocket, buffer, 2048, 0);
        if(packetlength <= 0) break;
        total_read += packetlength;

        write_cb(buffer, packetlength);
        if(progress_cb && !progress_cb(total_read, total_length))
          return false;
      }
    }

    return true;
  }
Example #2
0
  inline void downloadContent(uint8_t *&data, unsigned &size) {
    unsigned capacity = 0;

    if(header.iposition("\r\nTransfer-Encoding: chunked\r\n")) {
      while(true) {
        unsigned length = hex(downloadChunkLength());
        if(length == 0) break;
        capacity += length;
        data = (uint8_t*)realloc(data, capacity);

        char buffer[length];
        while(length) {
          int packetlength = recv(serversocket, buffer, length, 0);
          if(packetlength <= 0) break;
          memcpy(data + size, buffer, packetlength);
          size += packetlength;
          length -= packetlength;
        }
      }
    } else if(auto position = header.iposition("\r\nContent-Length: ")) {
      unsigned length = decimal((const char*)header + position() + 18);
      while(length) {
        char buffer[256];
        int packetlength = recv(serversocket, buffer, min(256, length), 0);
        if(packetlength <= 0) break;
        capacity += packetlength;
        data = (uint8_t*)realloc(data, capacity);
        memcpy(data + size, buffer, packetlength);
        size += packetlength;
        length -= packetlength;
      }
    } else {
      while(true) {
        char buffer[256];
        int packetlength = recv(serversocket, buffer, 256, 0);
        if(packetlength <= 0) break;
        capacity += packetlength;
        data = (uint8_t*)realloc(data, capacity);
        memcpy(data + size, buffer, packetlength);
        size += packetlength;
      }
    }

    data = (uint8_t*)realloc(data, capacity + 1);
    data[capacity] = 0;
  }