Вопрос по – Случайный Indy ResponseCode = -1 / EIdSocketError Сокет Ошибка # 0 исключения

4

У меня есть код Delphi, который в основном загружать файлы на удаленныйsecure использование сервераIndy 10.4.704:

 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

Проблема в том, чтоsometimes код не работает с Indy бросаяEIdSocketError Socket Error # 0 исключение (idHTTP.ResponseCode это -1)

Учитывая мое дрянное подключение к Интернету, я запустил экземпляр Windows EC2 и проверил на нем свой код (экземпляр windows работает в облаке, поэтому я предполагаю подключениеis not проблема), но я получил ту же проблему!

Ошибка кажется случайной, иногда загрузка работает, иногда нет. Я отладил с TidLogFile, все, что я мог найти, это что-то вроде этого:

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.

Кто-нибудь знает, что вызывает это / как это исправить?

EDIT

япроследил исключение обратно в TIdSSLIOHandlerSocketOpenSSL, Я много гуглил, похоже, что это не ошибка SSL.

@mjn: я редактировал свой пост, это действительно странно, так как связь должна бытьalmost perfect (по крайней мере, это не должно давать мне столько ошибок сокета # 0) TheDude
Вы пытались использовать отладчик и найти строку источника Indy, которая вызывает исключение? Я также попробовал бы более новую версию Indy, чтобы увидеть, отличается ли сообщение об исключении, как «ошибка сокета 0». не является стандартным номером ошибки сокета, может быть, это означает «нет соединения с сервером»; mjn

Ваш Ответ

1   ответ
2

10.5.8 r4743, Проблемы с SSL с кодом ошибки 0 были исправлены более года назад.

Хорошо, я потратил немного времени на проверку кода, кажется, что эта проблемаclosely related вmy last question about cookies, Когда я звонюGlobalCookieManager.CookieCollection.AddCookie() вTUploadThread.NewCookie()много разinternal cookies list contains a extra, broken cookies, ноonly the first two cookies are valid! TheDude
Большое спасибо, Реми! Я удалил старую версию Indy (включая старые файлы dcu, bpl и т. Д.), Заново собрал все, и теперь я 'mnot смог увидеть ошибку при запуске тестов на EC2 / Windows (т.е. загрузить файлы из EC2 в S3). Однако яstill see the same errors при загрузке с моей машины ... TheDude
Тот факт, чтоResponseCode -1 означает, что либо ответ искажен, либо ошибка происходит доTIdHTTP даже получает первую строку ответа. Можете ли вы увидеть ответ правильно в анализаторе пакетов, как Wireshark или Fiddler? Как выглядит стек вызовов в отладчике при возникновении ошибки?
Stack is here а такжеTidLogFile content is here, но я ошеломлен выводом Уиншарка, я даже не могу решить, какой вывод связан с ошибкой, думал, что нашел какой-то[TCP Retransmission] Ignored Unknown Record а такжеSecure Sockets Layer Ignored Unknown Record записи TheDude
AddCookie() вступает во владение файлом cookie, который передается ему. Таким образом, вы в конечном итоге с несколькимиTIdCookieManager объекты, ссылающиеся на те же физические объекты cookie. Это было бы причиной того, что файлы cookie были уничтожены. Я вижу два возможных решения: естьOnNewCookie вызовAddCookie() с копиейACookie вместоACookie напрямую или позвонитеAddServerCookie(ACookie.ServerCookie) вместоAddCookie().

Похожие вопросы