Italian community of Lazarus and Free Pascal

Programmazione => Lazarus e il web => Topic aperto da: bonmario - Dicembre 29, 2021, 04:31:26 pm

Titolo: THTTPSend e proxy
Inserito da: bonmario - Dicembre 29, 2021, 04:31:26 pm
Ciao a tutti,
per fare il download di file da internet, uso THTTPSend o TFPHTTPClient.
In tutti e 2 i casi, se il programma gira sul PC del lavoro, devo impostare i dati del proxy, perché altrimenti non funziona.

Stavo però pensando una cosa: in parecchi software, come ad esempio in Firefox, c'è l'opzione "Utilizza le impostazioni proxy del sistema".

E' possibile fare qualcosa di simile anche con Lazarus, riuscendo cioè a determinare da codice eventuale nome del proxy e porta?

Grazie, Mario
Titolo: Re:THTTPSend e proxy
Inserito da: nomorelogic - Dicembre 29, 2021, 04:46:19 pm
per windows, rimanendo in ambito shell:
Codice: [Seleziona]
netsh winhttp show proxy
Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Dicembre 29, 2021, 05:38:21 pm
Ma un proxy, se impostato a livello di sistema operativo (Windows ha il rilevamento automatico) non dovrebbe in automatico fungere da "gateway" verso la rete esterna (rete esterna chiaramente difinita da chi ha creato la rete ed le regole proxy).

Perchè è necessario impostare un proxy in quei componenti ?

Quei componenti derivano da Synapse e FPC, usano particolari tecniche o il proxy dell'azienda di @bonmario che usa certo tipo di configurazione ?

Non ho grande esperienza sui proxy, anche perchè quando c'erano non ho mai dovuto cambiare alcunchè nelle applicazioni. Sò che ci sono proxy di vario tipo e genere (non stiamo qui a disquisire sull'ergomento .... MAGARI SUL BLOG in futuro  ;D ), ma tali da impostare il setting direttamente sull'applicazione (almeno sulle mie applicazioni) non mi è mai capitato.

Ciao

Titolo: Re:THTTPSend e proxy
Inserito da: bonmario - Dicembre 29, 2021, 06:06:21 pm
@nomorelogic Non funziona, mi dice che non c'è nessun proxy ...

@DragoRosso non me ne intendo, so solo che se non imposto il nome dell'host e della relativa porta, ho errori nel download, se non ricordo male errore 500.
Impostando quei 2 campi, funziona tutto. Magari è un'impostazione particolare del proxy della mia azienda, non ne ho idea !!!
Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Dicembre 29, 2021, 07:02:50 pm
@nomorelogic Non funziona, mi dice che non c'è nessun proxy ...

Il Proxy non viene rilevato dal sistema operativo e non è nemmeno settato manualmente, è per quello che devi inserirlo nella tua applicazione.

Se lo imposti manualmente, nella tua azienda il PC funzionerà, ma non a casa tua (dovrai disattivare il proxy a mano).

Però non dovrebbero funzionare nessuno degli altri programmi che usano internet (il browser ad esempio), a meno che attivi e disattivi il proxy all'interno delle applicazioni ad ogni cambio di rete.

......
Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Dicembre 29, 2021, 07:17:41 pm
Le tecniche per trovare un proxy sono note e standardizzate, per via automatica (automatica tra parentesi) o via file di configurazione.

Se il sistema operativo non lo trova, vuol dire che chi ha "costruito" il proxy e la rete non voleva farlo trovare in automatico.
In questo caso non c'è modo di trovarlo in automatico.

L'unica Una cosa che potresti fare, è inserire nel tuo programma una piccola procedura che fà il "get" http suo un indirizzo noto di internet (google ad esempio) e se fallsice imposta i valori proxy "già a te noti" nel componente.

Ciao.
Titolo: Re:THTTPSend e proxy
Inserito da: nomorelogic - Dicembre 29, 2021, 07:19:27 pm
@nomorelogic Non funziona, mi dice che non c'è nessun proxy ...

strano

se esegui questo comando ti mostra i giusti valori?
Codice: [Seleziona]
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
Titolo: Re:THTTPSend e proxy
Inserito da: bonmario - Dicembre 30, 2021, 08:04:22 am
se esegui questo comando ti mostra i giusti valori?

Sì, sono quelli corretti ... praticamente mi hai dato la riposta: leggendo prima la chiave "ProxyEnable" determino se è attivo o meno, e leggendo poi la chiave "ProxyServer", determino Host e porta

Grazie, Mario
Titolo: Re:THTTPSend e proxy
Inserito da: nomorelogic - Dicembre 30, 2021, 10:42:29 am
a questo punto puoi evitare di lanciare il comando con ShellExecute
basta che vai a leggere quella chiave nel registry
Titolo: Re:THTTPSend e proxy
Inserito da: bonmario - Dicembre 30, 2021, 12:46:42 pm
Sì, grazie, ho fatto proprio così !!!
Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Dicembre 30, 2021, 02:30:41 pm
Vorrei approfondire il discorso proxy, legato a Windows e legato ai componenti che usi.

Nelle sedi di un cliente internazionale gira il mio software per il tracciamento dei colli. La rete è sotto proxy, ma l'applicazione non necessita di settaggi particolari per andare "dove vuole".

Il proxy limita l'accesso a Internet dei browser, ma altri software ci accedono tranquillamente (il mio, altri di diagnostica, antivirus, Windows Update, etc ...).

In allegato ci sono i settaggi del registro di Windows. Ho dovuto oscurare un pò di dati ....

Riesci a mettere in copia anche lo screenshot del tuo registro ?

Vorrei capire eventuali differenze e poi per conto mio approfondisco il tema.

Grazie. 
Titolo: Re:THTTPSend e proxy
Inserito da: bonmario - Dicembre 30, 2021, 02:51:20 pm
Eccolo ...

Ho incolonnato l'output per renderlo più leggibile, ed ho messo "CENSURATO !!!" dove c'era scritto qualcosa, ma erano dati "sensibili".

Ricapitolando, con i miei programmi fatti con Lazarus, funziona così: se ad esempio uso Synapse per scaricare un file, riesce a fare il download solo se imposto Host e relativa porta del proxy, in caso contrario, il download fallisce.


Codice: [Seleziona]
c:\Tmp>reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
    CertificateRevocation       REG_DWORD    0x1
    DisableCachingOfSSLPages    REG_DWORD    0x0
    IE5_UA_Backup_Flag          REG_SZ       5.0
    PrivacyAdvanced             REG_DWORD    0x1
    SecureProtocols             REG_DWORD    0xa80
    User Agent                  REG_SZ       Mozilla/4.0 (compatible; MSIE 8.0; Win32)
    ProxyServer                 REG_SZ       CENSURATO !!!:8080
    ProxyOverride               REG_SZ       CENSURATO !!!
    ProxyEnable                 REG_DWORD    0x1
    EnableNegotiate             REG_DWORD    0x1
    MigrateProxy                REG_DWORD    0x1
    ZonesSecurityUpgrade        REG_BINARY    100EBD5A88EBD701
    WarnonZoneCrossing          REG_DWORD    0x0
    LockDatabase                REG_QWORD    0x1d7fce2e8ab9c88
    AutoConfigURL               REG_SZ       CENSURATO !!!

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\5.0
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Cache
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Http Filters
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Lockdown_Zones
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\P3P
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Passport
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Protocols
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\TemplatePolicies
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Wpad
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones
Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Dicembre 30, 2021, 03:14:55 pm
Grazie per la celerità, mi paiono molto simili i settaggi (a parte un file di configurazione pac che il tuo amministratore ha agganciato al DHCP probabilmente). Questo file di "autoconfigurazione" potrebbe cambiare effettivamente qualcosa.

Per adesso facciamo finta che non esista.

Provo a replicare il tutto con la mia rete inserendo un proxy, facendo un piccolo programmino stupido usando Synapse e altri componenti.

Potrebbe uscire un buon Articolo per il nuovo blog. Tra l'altro potrebbe essere utile per ulteriori utenti che si trovano nelle tue stesse condizioni (cosa abbastanza comune adesso che gli amministratori di rete stanno prendendo coscenza del loro ruolo).

Il mio obiettivo sarebbe quello di eliminare accessi a shell, registri di Windows o altro, proponendo delle soluzioni alternative valide nelle varie condizioni.

Tieni presente che programmo in Windows prevalentemente, e anche io faccio uso della shell (per l'eliminazione di gruppi di file non c'è metodo più veloce ad esempio), però vedo questo come anche l'accesso al registry una soluzione alquanto critica ed in bilico.

Non rivanghiamo la storia però ....

Grazie ancora e buon lavoro.

Ciao

EDIT: diimenticavo, il file pac potrebeb anche dare istruzione al PC di cambiare il proxy in fuzione a particolari situazioni. In questo caso occorrerebbe leggere il resgistry di Windows ocni qualvolta si cerca di accedere alla rete.
Titolo: Re:THTTPSend e proxy
Inserito da: nomorelogic - Dicembre 30, 2021, 03:35:58 pm
se c'è possibilità di farlo cross-platform è meglio
 :)

Edit:
magari anche con una classe che incapsula diverse procedure per diversi OS
Titolo: Re:THTTPSend e proxy
Inserito da: bonmario - Dicembre 30, 2021, 04:37:13 pm
Il problema grosso è che di queste cose io non ci capisco una mazza !!!

Oggi ho provato a lavorare per la prima volta col portatile nuovo, senza collegarlo al cavo ethernet, ma solo in Wi-Fi ... ora ho le idee ancora più confuse !!!

- Le impostazioni del proxy che ho io sono diverse da quelle di altri colleghi
- Se uso le loro impostazioni ho problemi, ma a loro funziona tutto bene
- Ho chiamato l'ufficio tecnico, e mi hanno impostato il proxy così come ho postato prima

Sembrava funzionare tutto, poi ho lanciato uno dei miei programmi fatti con Lazarus e mi da un errore ...
Dopo un'ora circa di smanettamenti, ho scoperto che, anche se nelle impostazioni del proxy c'è l'Host "proxy01", nei miei programmi devo mettete "proxy03", altrimenti non funzionano !!!

Ciao, Mario
Titolo: Re:THTTPSend e proxy
Inserito da: nomorelogic - Dicembre 30, 2021, 04:39:54 pm
hai provato a cercare "proxy03" nel registry?
magari viene fuori qualcosa di utile
Titolo: Re:THTTPSend e proxy
Inserito da: bonmario - Dicembre 30, 2021, 04:45:44 pm
Sì, ci avevo provato, senza capirci molto ...

C'è questo "ramo"
Codice: [Seleziona]
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iphlpsvc\Parameters\ProxyMgr\

Che contiene questi altri 2 rami:
Codice: [Seleziona]
{7FC8942A-C395-4C9E-8A45-844C2262AC3E}
{D7F5E7BD-E3CB-4CCB-B90C-DFEAA6180DA1}

Ognuno dei 2, ha una chiave che si chiama "StaticProxy", valorizzata rispettivamente con "proxy01:8080" e con "proxy03:8080"

Ciao, Mario
Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Dicembre 30, 2021, 04:48:37 pm
Il problema grosso è che di queste cose io non ci capisco una mazza !!!

Oggi ho provato a lavorare per la prima volta col portatile nuovo, senza collegarlo al cavo ethernet, ma solo in Wi-Fi ... ora ho le idee ancora più confuse !!!

- Le impostazioni del proxy che ho io sono diverse da quelle di altri colleghi
- Se uso le loro impostazioni ho problemi, ma a loro funziona tutto bene
- Ho chiamato l'ufficio tecnico, e mi hanno impostato il proxy così come ho postato prima

Sembrava funzionare tutto, poi ho lanciato uno dei miei programmi fatti con Lazarus e mi da un errore ...
Dopo un'ora circa di smanettamenti, ho scoperto che, anche se nelle impostazioni del proxy c'è l'Host "proxy01", nei miei programmi devo mettete "proxy03", altrimenti non funzionano !!!

Ciao, Mario

Il file di configurazione può generare dei settting proxy secondo una certa logica. Quindi non è escluso che via wi-fi, magari per una perdita temporanea di rete, il settaggio del proxy si risetta.

Dall'ultimo post, sembrerebbe che il pac dica che vengano usati o uno o l'atro in alternativa (quando uno cade ad esempio).

Ciao
Titolo: Re:THTTPSend e proxy
Inserito da: bonmario - Dicembre 30, 2021, 04:50:35 pm
Alla fine, già in passato, non è che ci ho capito molto ... mettendo insieme un po di informazioni trovate in giro, avevo capito che i download non funzionavano a causa del proxy, ed avevo risolto così ...
Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Dicembre 30, 2021, 04:54:01 pm
Altra cosa, normalmente per usare un componente di rete come quelli di Synapse, occorre fare il binding ad una "rete". Fai il binding corretto ? (magari è una domanda sciocca).
Titolo: Re:THTTPSend e proxy
Inserito da: bonmario - Dicembre 30, 2021, 05:02:24 pm
Altra cosa, normalmente per usare un componente di rete come quelli di Synapse, occorre fare il binding ad una "rete". Fai il binding corretto ? (magari è una domanda sciocca).

Onestamente non so di cosa stai parlando ...
Quando ho avuto bisogno la prima volta, avevo trovato del codice in rete, non ricordo se sul forum o sul wiki di Lazarus, ed avevo adattato quel codice.

Ciao, Mario
Titolo: Re:THTTPSend e proxy
Inserito da: nomorelogic - Dicembre 30, 2021, 06:15:57 pm
Sì, ci avevo provato, senza capirci molto ...

C'è questo "ramo"
Codice: [Seleziona]
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iphlpsvc\Parameters\ProxyMgr\

Che contiene questi altri 2 rami:
Codice: [Seleziona]
{7FC8942A-C395-4C9E-8A45-844C2262AC3E}
{D7F5E7BD-E3CB-4CCB-B90C-DFEAA6180DA1}

Ognuno dei 2, ha una chiave che si chiama "StaticProxy", valorizzata rispettivamente con "proxy01:8080" e con "proxy03:8080"

Ciao, Mario

potrebbero essere i 2 proxy per la scheda di rete via cavo e per la scheda wireless
ma qua onestamente non ho esperienza

forse potresti cercare i 2 GUID per vedere se ci sono altri nodi legati logicamente a questi 2 rami

Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Dicembre 30, 2021, 06:46:55 pm
potrebbero essere i 2 proxy per la scheda di rete via cavo e per la scheda wireless
ma qua onestamente non ho esperienza

forse potresti cercare i 2 GUID per vedere se ci sono altri nodi legati logicamente a questi 2 rami

Se così fosse, in "Internet Settings" non protrebbe esserci il proxy non in linea.

Andare a cercare nel registro di sistema non è la cosa giusta, ci sono mille settaggi, tra cui cache, schede che magari non sono più montate.

E quali stà usando il sistema operativo non è dato sapere. Ad esempio, faccio un esempio pratico, io potrei inserire 1 gateway per nic (o anche più di uno). Non è dal registro che si capisce quale è in uso ..... alle volte non lo sà neanche il sistem aoperativo stesso ....  ;D :o ;D :o
Titolo: Re:THTTPSend e proxy
Inserito da: nomorelogic - Dicembre 30, 2021, 07:42:47 pm
Andare a cercare nel registro di sistema non è la cosa giusta

siete voi che usate windows...
io cerco solo di dare una mano  ;D

Edit:
aggiunta la citazione

Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Dicembre 31, 2021, 03:43:59 pm
Eseguite alcune prove.
Intanto, per ciò che riguarda le mie applicazioni (in riferimento ai post precedenti), ho usato il componente TNetHttpClient (Delphi) che non sembra abbia un componente equivalente in Lazarus (stò verificando con FPHttpClient).

E ciò nonostante usi normalmente Indy. Il perchè è presto detto: quel componente gestisce in autonomia tutti protocolli di sicurezza (SSL e TLS) e lo fà con le risorse del sistema operativo. Non si appoggia a OpenSSL e non usa dll aggiuntive (ssleay e libleay). Gestisce i proxy in autonomia usando il sistema operativo, non c'è da settare nulla.

Lo usai diversi anni fà (Delphi XE7 o XE8 mi pare) quando "incocciai" con problemi di SSL e proprio di proxy (me ne ero dimenticato, ho dovuto spulciare sulle note di release  :P ).

Quel componente lo uso ancora quando ho a che fare con HTTP(s) o FTP(s) su internet, mentre uso Indy per tutte le altre forme di comunicazione (abbinando le OpenSSL quando il cliente chiede un pò più di "sicurezza).

Quindi, l'arcano (per me) mistero del perchè le applicazioni che facevo non avevano i problemi incontrati da @bonmario è stato svelato.

Indy sembra, almeno da quello che ho provato, abbia necessità del settaggio dei dati del proxy nei suoi componenti (devo comunque ancora approfondire).

Ora vedo come risolverla in Lazarus .... a presto.

Ciao
Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Dicembre 31, 2021, 05:32:20 pm
News:
Per quello che sono riuscito a testare sembra che Lazarus e FPC non implementano alcun modo per rilevare un proxy da sistema operativo (almeno per Windows).

Ho implementato una Api di Windows per fare ciò, senza quindi impostare alcunchè nel programma. Le applicazioni rimangono quindi indipendenti dalla presenza o meno del proxy (salvo che questo non necessiti di credenziali per l'accesso).

Stò testandola in varie condizioni (anche reali in una rete multiserver) con Lazarus. Pazienza ... e domani pubblico il sorgente.

Ovviamente tale soluzione funziona solo sotto Windows.

Ciao e buon San Silvestro.
Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Gennaio 01, 2022, 06:52:12 pm
Questa è l'unità in Pascal per il riporto delle informazioni sul proxy in uso nel sistema operativo.
Per adesso funziona in Windows e fà uso di una API ben precisa, "che fa questo di mestiere".

L'uso è più che semplice. Basta inserire l'unità nelle Uses nella sezione Interface della vostra Form o Unità principale.

Si inserisce in una sola Unit.

All'inizio del Vs. programma si inizializza da sola e riporta nelle variabili globali LPI_ProxyHost di tipo string e LPI_ProxyPort di tipo integer i valori del Proxy se trovato (altrimenti rimane la stringa vuota e l'intero a 0).

Se volete durante il programma ricercare nuovamente i dati del Proxi, semplicemnete chiamate:

Codice: [Seleziona]
DiscoveryProxyInfo;

e i due dati verranno "rinfrescati".

Le due variabili le potete usare all'interno del vs. programma per settare i componenti che necessitano di tali valori.

ATTENZIONE: i proxy che richiedono l'autenticazione necessitano di ulteriori passaggi (normalmente previsti dai componenti).

L'unità non è completa ed esaustiva, con il tempo potrà essere perfezionata. Riportate eventuali varianti che trovate (ad esempio un formato diverso riportato per i vs. proxy).

Spero che questa unità sia di aiuto.

Ciao

EDIT: Rimosso  l'allegato per aggiornamenti
Titolo: Re:THTTPSend e proxy
Inserito da: bonmario - Gennaio 01, 2022, 07:27:26 pm
Grazie, se riesco la provo settimana prossima al lavoro.

Ciao, Mario
Titolo: Re:THTTPSend e proxy
Inserito da: DragoRosso - Gennaio 01, 2022, 11:59:50 pm
Ho rimesso l'allegato aggiornato.

Ho inserito nella chiamata un parametro opzionale (true / false).
Se c'è qualcosa che non và, chiama la funzione direttamente dal tuo codice con il parametro true.
Visualizzerà una box con la stringa di definizione del proxy, facendo uno screenshoot può essere utile per debug.

Codice: [Seleziona]
DiscoveryProxyInfo(true);

Ulteriori info nel sorgente.

Ciao