Un Google Chrome POST rompe este SSL_read. ¿Alguien tiene un código que funcione?

Necesito unmínim Servidor SSL y se le ocurrió lo siguiente:

confirm(WSAStartup(MakeWord(1,1), WData) = 0);
SSL_library_init;
SSL_load_error_strings;
ctx := SSL_CTX_new(SSLv23_server_method);
confirm(ctx <> nil);
confirm(SSL_CTX_use_certificate_chain_file(ctx, 'cert.pem') > 0);
confirm(SSL_CTX_use_PrivateKey_file(ctx, 'key.pem', SSL_FILETYPE_PEM) > 0);
confirm(SSL_CTX_check_private_key(ctx));
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
listen_socket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
confirm(listen_socket <> 0);
sa_serv.sin_family := AF_INET;
sa_serv.sin_port := htons(DEFAULTPORT);
sa_serv.sin_addr.s_addr := INADDR_ANY;
confirm(bind(listen_socket, sa_serv, SizeOf(sa_serv)) = 0);
while TRUE do
  begin
  if listen(listen_socket, 100) <> 0 then continue;
  client_len := SizeOf(sa_cli);
  sock := accept(listen_socket, @sa_cli, @client_len);
  if sock = INVALID_SOCKET then continue;
  ssl := SSL_new(ctx);
  if ssl = nil then continue;
  SSL_set_fd(ssl, sock);
  if SSL_accept(ssl) = 1 then
    begin
    bytesin := SSL_read(ssl, buffer, sizeof(buffer)-1);
    if bytesin > 0 then
      begin
      buffer[bytesin] := #0;
      response := getresponse(buffer);
      SSL_write(ssl, pchar(response)^, length(response));
      end;
    end;
  SSL_set_shutdown(ssl, SSL_SENT_SHUTDOWN or SSL_RECEIVED_SHUTDOWN);
  CloseSocket(sock);
  SSL_free(ssl);
  end;

El único SSL_read tomará una solicitud GET o POST completa de Firefox, y todo funciona muy bien. Por otro lado, un Chrome GET hará que las primeras llamadas SSL_read devuelvan cero bytes, pero eventualmente un SSL_read tomará toda la solicitud GET y el código seguirá funcionando.

Pero cuando Chrome envía una POST, las primeras llamadas SSL_read obtienen cero bytes, y la siguiente SSL_read tomará SOLO LOS CABECEROS. La rutina getresponse () no tiene sentido para la POST porque se necesita un SSL_read más para obtener el contenido de la POST.

SSL_MODE_AUTO_RETRY se configuró, esperando que SSL_read no regresara hasta que se completara una solicitud, pero eso no funciona. SSL_pending siempre devuelve cero, antes o después de cada SSL_read, por lo que tampoco ayuda.

Comoa respuesta de esta pregunta dice, SSL sin bloqueo parece implicar mucha tortura y acidez estomacal. He jugado haciendo SSL_reads en un hilo separado y matando el hilo después de agotar el tiempo en una lectura bloqueada, pero eso parece peligroso ya que se desconoce en qué estado se encuentra SSL (o cómo restablecerlo) cuando se mata el hilo.

¿Alguien tiene código para un bucle mínimo similar al anterior, pero eso no se cuelga en un Chrome POST o SSL_read, eso es simple y lo suficientemente vainilla como para convertirlo fácilmente a Delphi 6?

Respuestas a la pregunta(2)

Su respuesta a la pregunta