Ho una web app che rende frequenti TIdHTTP le chiamate alle API di Google Analytics (circa 25,000-50,000 al giorno). Ogni tanto chiamate all'API falliscono con il messaggio di errore nella riga dell'oggetto (non spesso - meno di 1 su 1000 volte). Non sono mai stato in grado di trovare un modello per farlo accadere. E riprovare la chiamata fallita di solito funziona. Quindi sembra del tutto casuale."1408F10B: routine SSL: SSL3_GET_RECORD: numero di versione errata chiamata:" su Indy
Ho l'ultima versione di openssl (1.0.2.1 - 03/20/2015). E l'ultima versione di Indy (file di codice sorgente del 01/07/2015).
Di seguito è riportato il codice sorgente di base per effettuare queste chiamate.
Qualcuno ha qualche idea di cosa potrebbe essere?
Effettuare due chiamate simultanee all'API influisce su alcune cose (ciò avviene in una Web App multi-thread)?
IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
IdSSLIOHandlerSocket1.PassThrough := True;
IdHTTP := TIdHTTP.create(nil);
IdHTTP.reusesocket := rsTrue;
IdSSLIOHandlerSocket1.reusesocket := rsTrue;
idhttp.handleredirects := True;
with IdSSLIOHandlerSocket1 do begin
SSLOptions.Method := sslvTLSv1_2;
SSLOptions.SSLVersions := [sslvTLSv1_2];
SSLOptions.VerifyMode := [];
SSLOptions.VerifyDepth := 2;
end;
with IdHTTP do begin
IOHandler := IdSSLIOHandlerSocket1;
ProxyParams.BasicAuthentication := False;
Request.UserAgent := 'EmbeddedAnalytics API Interface';
Request.ContentType := 'text/html';
request.connection := 'close';
Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
Request.BasicAuthentication := False;
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
HTTPOptions := [hoForceEncodeParams];
Request.AcceptEncoding := 'gzip,deflate';
Request.CustomHeaders.Add('Accept-Language: en-us,en;q=0.5');
idhttp.Request.CustomHeaders.Add('Authorization: Bearer '+FToken);
end;
idhttp.get(':https://www.googleapis.com/analytics/v3/data/realtime?ids=..........');
Update 1 aggiornamento alcune righe di codice a:
SSLOptions.Method := sslvSSLv3;
SSLOptions.SSLVersions := [sslvSSLv3];
Funziona. Controllerò e vedrò se gli errori SSL andranno via.
Soluzione Si scopre che è stato corretto apportare le modifiche a sslVSSLv3. Non ho più errori! Questo è un po 'sorprendente visto che la maggior parte degli altri servizi sta invece adottando TLS.
Non correlato alla tua domanda, ma dovresti 1) non usare 'ReuseSocket', 2) non aggiungere manualmente' deflate' o 'gzip' in' Request.AcceptEncoding' (imposta il 'TIdHT Proprietà TP.Compressor'), 2) usa 'Request.AcceptLanguage' invece di' Request.CustomHeaders.Add() ', e 4) rimuovi': 'davanti all'URL che stai passando a' Get() ' . E se stai facendo così tante richieste, potresti prendere in considerazione l'uso di 'Request.Connection: = 'keep-alive'' invece di'' close'' in modo da poter riutilizzare una singola connessione HTTP per più richieste. –
Grazie ancora @RemyLebeau per il tuo monitoraggio attivo dei problemi di Indy. Darò un'occhiata ai tuoi suggerimenti. Ho scoperto che tornare a sslvSSLv3 per le chiamate all'API di Google si prende cura del problema. Sorprendente vedere così tanti altri servizi si stanno allontanando da questo a causa di POODLE. Hai una spiegazione del perché la maggior parte delle volte sslvTLSv1_2 ha funzionato, ma ogni tanto no? –
@RemyLebeau - Grazie. Li ho implementati. In realtà ho un'impostazione per passare da 'close' e' keep-alive'. Al momento era impostato su "chiudi". Domanda: il "keep-alive" sarà efficace Se dopo la chiamata ho liberato l'oggetto idhttp? Inoltre, riguardo a ':', questo era un errore di battitura. –