Código aleatorio Indy ResponseCode = -1 / EIdSocketError Socket Error # 0 excepciones

Tengo un código de Delphi que básicamente carga archivos a remotoseguro servidor usandoIndy 10.4.704:

<code> IdHTTP                 := TIdHTTP.Create(nil);
 try
    TheCompressor       := TIdCompressorZLib.Create(nil);
    TheSSL              := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

    with IdHTTP do
    begin
         HTTPOptions     := [hoForceEncodeParams];
         AllowCookies    := True;
         HandleRedirects := True;
         ProtocolVersion := pv1_1;

         IOHandler       := TheSSL;
         Compressor      := TheCompressor;
    end;    // with

    // Get upload resume offset
    try
       IdHttp.Head('https://www.domain.com/my-file.bin');
       if (IdHttp.Response.ResponseCode <> 404) And (IdHttp.Response.ContentLength >= 0) then
          StartPos   := IdHttp.Response.ContentLength
       else
           StartPos  := 0;
    except
          StartPos   := 0;
    end;    // try/except

    // Upload File
    TheFile          := TFileStream.Create(FileName, fmOpenRead OR fmShareDenyWrite);
    RangeStream      := TIdHTTPRangeStream.Create(TheFile, StartPos, -1, True);
    try
       if (RangeStream.ResponseCode = 206) then
          IdHTTP.Post(https://www.domain.com/upload.php', RangeStream);
    finally
           RangeStream.Free;
    end;    // try/finally
 finally
        FreeAndNil(IdHTTP);
 end;    // try/finally
</code>

El problema es esealgunas veces el código falla con Indy lanzando unError EIdSocketError Socket # 0 excepciónidHTTP.ResponseCode es -1)

Dada mi mala conexión a Internet, lancé una instancia de Windows EC2 y probé mi código en ella (la instancia de Windows se ejecuta en la nube, así que asumo la conexiónno es un problema), pero tengo el mismo problema!

El error parece ser aleatorio, a veces la carga funciona, a veces no. Depuré con TidLogFile, todo lo que pude encontrar es algo como esto:

<code>Stat Connected.
Sent 4/26/2012 4:18:42: POST /app/upload.php...
Sent 4/26/2012 4:18:42: <uploaded_file_data_here>
Stat Disconnected.
</code>

¿Alguien sabe lo que está causando esto / cómo solucionar esto?

EDITAR

I rastreó la excepción de nuevo a TIdSSLIOHandlerSocketOpenSSL. Busqué en Google mucho, parece que no es un error de SSL.

 mjn26 abr. 2012 12:41
¿Ha intentado usar el depurador y ubicar la línea de origen Indy que genera la excepción? También probaría una versión más nueva de Indy para ver si el mensaje de excepción es diferente, ya que 'error de socket 0' no es un número de error de socket estándar, tal vez significa 'sin conexión con el servidor'
 TheDude26 abr. 2012 17:46
@mjn: edité mi publicación, esto es realmente extraño ya que se supone que la conexión escasi perfecto (Al menos no debería darme tantos errores de socket # 0)

Respuestas a la pregunta(1)

Solución de preguntas

Por favor, actualice a la última versión de Indy 10, que es10.5.8 r4743. Los problemas relacionados con SSL con el Código de error 0 se solucionaron hace más de un año.

 Remy Lebeau05 may. 2012 17:46
Edité mi respuesta en la otra pregunta.
 TheDude06 may. 2012 11:20
Muchas gracias Remy! Continuaré monitoreando esto, ¡pero mis pruebas iniciales sugieren que esto ha solucionado el problema!
 TheDude05 may. 2012 17:11
Esperemos que haya explicado bien el problema, ¿hay alguna forma de evitar esta excepción? Esto está causando innecesarios POST / re-upload, haciendo que el proceso de carga de mi aplicación sea dolorosamente lento. Estoy usando esencialmenteel código que has publicado aquí
 TheDude05 may. 2012 17:08
La presencia de cookies de basura causa una excepción al llamarTextIsSame() enTIdCookies.AddCookie(), porque (a partir de la tercera cookie enFCookieList) LOldCookie se le asignan algunos datos de mierda y la comparación de texto falla. Esto hace que el IdHTTP.Post () falle (a veces conResponseCode = -1, algunas vecesResponseCode = 200 pero POST todavía falla debido a la excepción mencionada)
 TheDude05 may. 2012 17:04
OK, me tomé el tiempo para inspeccionar el código un poco más, parece que este problema esestrechamente relacionada ami última pregunta sobre las cookies. Cuando llamoGlobalCookieManager.CookieCollection.AddCookie() enTUploadThread.NewCookie()muchas veces elLa lista interna de cookies contiene cookies extra, rotas., perosolo las dos primeras cookies son validas!
 TheDude30 abr. 2012 02:46
La pila está aquí yEl contenido de TidLogFile está aquí, pero estoy abrumado por la salida de Winshark. Ni siquiera puedo decidir qué salida está relacionada con el error, pensé que encontré algo[TCP Retransmission] Ignored Unknown Record ySecure Sockets Layer Ignored Unknown Record entradas
 Remy Lebeau05 may. 2012 17:36
AddCookie() toma posesión de la cookie que se le pasa. Así que terminas con múltiplesTIdCookieManager Objetos que se refieren a los mismos objetos físicos de cookie. Eso daría cuenta de que las cookies son destruidas. Veo dos soluciones posibles: tenerOnNewCookie llamadaAddCookie() con una copia deACookie en lugar deACookie directamente, o llameAddServerCookie(ACookie.ServerCookie) en lugar deAddCookie().
 TheDude27 abr. 2012 05:45
Muchas gracias Remy! Eliminé la versión antigua de Indy (incluidos los archivos antiguos dcu, bpl, etc ...), lo reconstruí todo y ahora estoyno capaz de ver el error al ejecutar las pruebas en EC2 / Windows (es decir, cargar archivos de EC2 a S3). Sin embargo, yoAún veo los mismos errores. al subir desde mi máquina ...
 Remy Lebeau27 abr. 2012 07:32
El hecho de que elResponseCode es -1 significa que la respuesta tiene un formato incorrecto o que el error se está produciendo antesTIdHTTP Incluso recibe la primera línea de la respuesta. ¿Puedes ver la respuesta correctamente en un detector de paquetes como Wireshark o Fiddler? ¿Cómo se ve la pila de llamadas en el depurador cuando se produce el error?

Su respuesta a la pregunta