recv() mit Connection: keep-alive



  • Guten Abend!

    Im wesentlichen schreibe ich derzeit eine kleine HttpRequest-Klasse mit SSL/TLS-Unterstützung. Als SSL-Lib verwende ich hierbei PolarSSL (sehr empfehlenswert [habe auch schon OpenSSL getestet]), die als SSL-Variante der recv() -Funktion int ssl_read(ssl_context *ssl, unsigned char *buf, int len) bereit stellt. Die maximal unterstützte Buffer-Größe beträgt 2048 Bytes.

    Ich sende einen HTTP-Request:

    "GET /accounts/ServiceLogin HTTP/1.1\r\n"
    "Host: www.google.com\r\n"
    "Connection: keep-alive\r\n\r\n";
    

    Mein Code zum Empfangen der Response:

    int oxHttp::SSLRecvpacket(void) {
      // Assuming that the headers size is not 2048 bytes
      unsigned char intern_buf[2049] = {0};
    
      // Get the HTTP-header.
      int len = sizeof(intern_buf) - 1;
      int ret;
      recv_header_ = "";
      do {
        ret = ssl_read(&ssl_, intern_buf, len);
        intern_buf[ret] = 0;
    
        recv_header_ += reinterpret_cast<char*>(intern_buf);
      } while (ret == len);
    
      // Get the Content-Length.
      uint32_t content_len = 0;
      if (!GetContentLength(recv_header_.c_str(), content_len))
        return ret;
    
      // Read the data based on Content-Length;
      uint32_t tmp = 0;
      recv_content_ = "";
      do {
        ret = ssl_read(&ssl_, intern_buf, len);
        intern_buf[ret] = '\0';
    
        recv_content_ += reinterpret_cast<char*>(intern_buf);
    
        tmp += ret;
      } while (tmp < content_len);
      return tmp;
    }
    

    Wenn nun die Größe des Headers genau 2048 bytes beträgt, so wird die while-loop ein weiteres mal angesteuert und ssl_read() wird direkt anfangen den Content auszulesen.
    Da die Größe des Headers unbekannt ist muss die Einlese-Prozedur ja in einer Schleife formuliert werden ( ssl_read() unterstützt schließlich nur 2048 bytes), da sonst die Gefahr besteht, dass Teile des Headers nicht eingelesen werden.
    Generell muss allerdings vermieden werden, dass ssl_read() aufgerufen wird, obwohl keine Daten mehr vorliegen, die noch empfangen werden müssten. Sollte dieser Fall eintreten, so wird ssl_read() aufgrund Connection: keep-alive (welches ich beibehalten möchte) keine Rückgabe mehr liefern, da es weiterhin auf Daten wartet.

    Ich suche nun ein Verfahren, um den Header und den Content korrekt einzulesen und hierbei die oben genannte Situation zu umgehen.

    MfG, 0x2A



  • Schade, dass scheinbar keiner eine Antwort für mich hat.


Log in to reply