Page 1 sur 1

Question de Proxy

Publié : dim. 13/mars/2016 17:26
par cage
Bonjour a tous,

Voici un petit bout de code qui fonctionne correctement lorsqu'on est directement connecté a Internet sans Proxy

Code : Tout sélectionner

EnableExplicit

;Global URL$     = "http://standards-oui.ieee.org/oui.txt"
Global URL$     = "https://www.purebasic.com/index.php"
Global OUIFILE$ = "oui.txt"

Global header$, result$, retval

If InitNetwork()
  Debug "get oui.txt"
  header$ = GetHTTPHeader(URL$)
  result$ = StringField(header$, 1, #LF$)
  Debug result$
  If FindString(result$, "200 OK",1,#PB_String_NoCase)
    retval = ReceiveHTTPFile(URL$, OUIFILE$, #PB_HTTP_NoRedirect)
    If retval : Debug "get oui.txt ok" : EndIf
  EndIf
EndIf
Mon soucis vient du fait que mes applications sont utilisées en entreprise derrière un Proxy et que dans ce cas, ce code ne fonctionne plus car la boite de dialogue pour s'autentifier sur le Proxy n'apparait pas.
Ma première question est: peut-on utiliser les 2 fonctions GetHTTPHeader() et ReceiveHTTPFile() au travers d'un Proxy ?
Pour pallier au soucis de proxy, j'utilise le code suivant:

Code : Tout sélectionner

WebGadget(#web, 0, 0, 0, 0, #Null$)
URL$ = "https://www.purebasic.com/index.php"
SetGadgetText(#web, URL$)
dans une fenêtre et la demande d'autentification du Proxy apparait.
Ma deuxième question est: comment savoir ou se trouve le fichier enregistré (je suppose que cela dépends du navigateur utilisé) et comment savoir si le code HTTP de la page est bien "200 OK"

Merci par avance de votre retour.
Gérard

Re: Question de Proxy

Publié : lun. 14/mars/2016 10:35
par Marc56
(Je ne sais pas si ces quelques réponses peuvent être utiles. J'ai sans doutes mal compris l’énoncé)
cage a écrit :dans une fenêtre et la demande d’authentification du Proxy apparait.
Le WebGadget utilise le composant d'IE. Donc si IE est configuré pour utiliser le proxy, alors il déclenche l'ouverture de l'éventuelle fenêtre authentification.
De mémoire, cette fenêtre n'est demandée qu'une seule fois par session.
cage a écrit : Ma deuxième question est: comment savoir ou se trouve le fichier enregistré (je suppose que cela dépends du navigateur utilisé)
Le nom du fichier de configuration du proxy ou le nom du fichier téléchargé par ReceiveHTTPFile ?
Si c'est ce dernier, alors, dixit la doc:
« NomFichier$ Le nom du fichier qui sera enregistré sur le disque.
Si le nom de fichier ne contient pas de chemin complet, il sera enregistré dans le répertoire courant.
Si le fichier existe, il sera écrasé.
»
(répertoire courant n'étant pas forcément celui ou est lancé le programme dans l'IDE)

Bonne habitude: Toujours mettre un chemin lors de l'écriture de fichiers même en mode dév.
Global OUIFILE$ = GetTemporaryDirectory() + "oui.txt" ; ou GetHomeDirectory()

PS. Je recommande toujours Search Everything (http://www.voidtools.com/) pour suivre les fichiers perdus
cage a écrit :et comment savoir si le code HTTP de la page est bien "200 OK"
Debug header$

Re: Question de Proxy

Publié : lun. 14/mars/2016 11:44
par Kwai chang caine
Je ne sais pas si tu veux etre crossplatform, j'ai moi aussi le même probleme tous les jours au boulot
Parfois ça marche parfois non, faut voir sur place, mais moi j'y connais rien :oops: et les proxy sont capricieux :?

Entre autre, pour windows, j'avais ce code mais il y en a d'autres sur les forums en tapant PROXY :wink:
http://www.purebasic.fr/french/viewtopi ... 42#p124342

Re: Question de Proxy

Publié : lun. 14/mars/2016 14:15
par cage
Merci pour vos réponses.

@Marc56: Ma question concernait le fichier reçu avec le code:

Code : Tout sélectionner

WebGadget(#web, 0, 0, 0, 0, #Null$)
URL$ = "https://www.purebasic.com/index.php"
SetGadgetText(#web, URL$)
Je suppose qu'il est dans le cache du navigateur ?
Mais comment savoir a l'avance ou est le cache du navigateur d'un utilisateur dont on ne connait rien en terme d'OS Windows utilisé ni de navigateur.
Pour le code de retour, c'est celui du WebGadget() que je voudrais connaitre, car une demande d'une page Web sur internet retourne toujours un résultat même si la page n'existe pas.
Bonne habitude: Toujours mettre un chemin lors de l'écriture de fichiers même en mode dév.
Global OUIFILE$ = GetTemporaryDirectory() + "oui.txt" ; ou GetHomeDirectory()

PS. Je recommande toujours Search Everything (http://www.voidtools.com/) pour suivre les fichiers perdus
Effectivement, je met toujours un chemin complet pour l'écriture de mes fichiers, cela m'évite pas mal de soucis dans certains cas.
J'utilise aussi Everything en mode service pour chercher des fichiers sur les disques. Pour ma part, j'utilise toujours la dernière version beta disponible. Excellent logiciel que je recommande aussi.

@Kwai chang caine: J'ai effectué pas mal de recherches sur "PROXY" dans les forums Français et Anglais et effectivement il y a du grain a moudre.
Mais je voulais rester le plus simple possible au niveau code, et je ne programme que sous Windows.

Pour résoudre le problème de Proxy, je teste d'abord si l'utilisateur est directement sur Internet. Dans ce cas j'utilise les 2 fonctions GetHTTPHeader() et ReceiveHTTPFile().
Si l'utilisateur est derrière un Proxy, j'utilise un WebGadget(). J'obtiens bien un demande d’authentification de la part du Proxy et le fichier est bien téléchargé. Par contre, je ne sais pas comment vérifier si le code est bien "200 OK" ni comment récupérer le fichier a coup sur.

J’espère avoir été plus clair dans mes explications.

D'après vos réponses, j'en conclu qu'il faut définitivement oublier GetHTTPHeader() et ReceiveHTTPFile() lorsqu'on travaille derrière un Proxy.

Re: Question de Proxy

Publié : lun. 14/mars/2016 15:17
par Marc56
cage a écrit : Je suppose qu'il est dans le cache du navigateur ?
Mais comment savoir a l'avance ou est le cache du navigateur d'un utilisateur dont on ne connait rien en terme d'OS Windows utilisé ni de navigateur.
Oui.
À moins que l'utilisateur ait personnalisé l’emplacement du cache, l'emplacement est indiqué dans le panneau de configuration / Options Internet

Le cache IE pour l'utilisateur en cours est (par défaut) dans %LocalAppData%\Microsoft\Windows\INetCache\IE\
(Ce sont des répertoires cachés donc Dir /a:h pour les voir en ligne de commande, ou l'indispensable Total Commander (en cochant afficher les fichiers système), ou Search Everything en mettant « index[ » (sans les RegEx) ou « index\[ » avec)

Le fichier index.php dans le cache s'appelle index[1].htm (je ne sais pas pourquoi?)

J'ai trouvé ça en vidant le cache, puis en lançant l'exemple de PB.

Le WebGadget utilise bien le proxy, mais effectivement pas GetHTTPHeader() et ReceiveHTTPFile() (testé)
J'ai trouvé aussi ça (mais pas testé)
viewtopic.php?f=1&t=10838

Re: Question de Proxy

Publié : mar. 26/avr./2016 0:23
par digital
Alors si je me trompe pas le WebGadget de PureBasic repose sur internet explorer.
Tu peut changer le proxy via cette clé:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer

Type: REG_SZ
Valeur: "IP:80"

De mémoire ça doit etre un proxy de type HTTP.
Tu active aussi le proxy IE:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable
C'est une clé REG_DWORD à "1" tu l'active à "0" tu la désactive.

Là t'es sur que ton WebGadjet passe par le Proxy donc sans afficher ta boite boite d'authentification.

------------------------------------------------------------------------------------------------------------------------------------

Pour le code HTTP 200.
Pourquoi ne pas utiliser un EventType() via #PB_EventType_TitleChange (voir: https://www.purebasic.com/french/docume ... adget.html)

Si j'envoie mon webgadjet sur une page qui n'existe pas sur IE le titre de ma fenetre change en "Petit problème ..." ou " " rien ?

On récupère le titre de la page via:
string$ = GetGadgetItemText(0, #PB_Web_PageTitle)


Si mon string à une valeur plus petite que < 3 donc c'est que y'a rien = (la fenetre est pas afficher correctement)
OU si elle contient "petit problème" (voir fonction findstring(): https://www.purebasic.com/french/docume ... tring.html)
c'est que pareil la page est pas afficher :)

Voila ça se tient même si c'est borderline.

Re: Question de Proxy

Publié : mer. 27/avr./2016 23:26
par cage
Merci digital pour ta réponse.

Je fais des petits programmes pour d'anciens collègues de travail qui sont en entreprises et l'utilisation de proxy est réglementée, de plus ils utilisent un proxypac.

J'ai solutionné le problème avec ceci (code partiel)

Code : Tout sélectionner

If OpenWindow(#WinHlp, X, Y, #WinHlpWidth, #WinHlpHeight, #Null$, Flags)
  //
  WebGadget(#web, 0, 0, 0, 0, #Null$)
  //
  Repeat
    Event = WaitWindowEvent()
    //
    Select Event
      Case #PB_Event_Gadget
        indexGadget     = EventGadget()
        indexGadgetType = EventType()
          Case #web
            Select indexGadgetType
              Case #PB_EventType_TitleChange
                version$ = GetGadgetItemText(#web, #PB_Web_PageTitle)
            EndSelect
  //
Puis dans un Thread, j'ai ceci (exemple pour tester s'il existe une nouvelle version de mon programme)

Code : Tout sélectionner

  Repeat
    Delay(50)
  Until version$ <> #Null$
  version$ = Trim(version$)
  Debug "version="+version$
  If FindString(version$, "::::", 9) ; "16.02.17::::::::"
    yy = Val(StringField(version$, 1, "."))
    mm = Val(StringField(version$, 2, "."))
    dd = Val(StringField(version$, 3, "."))
    yy+mil
    retval = Date(yy,mm,dd,0,0,1)
    If Not retval
      version$ = #Null$
    EndIf
    Debug "version="+version$
  Else
    version$ = #Null$
    Debug "version="+version$
  EndIf
Voila, c'est simple, cela reste du pur PB mais j'ai abandonné l'idée de pouvoir récupérer des fichiers en étant derrière un Proxy.
Là t'es sur que ton WebGadjet passe par le Proxy donc sans afficher ta boite boite d'authentification.
On est obligé de s'identifier au moins une fois derrière un Proxy en entreprise.
C'est pour cela que je gère cela dans un Thread car le client peut mettre 2 heures a s'identifier.
S'il ferme le programme avant, alors le Thread est suspendu et terminé a la sortie du programme.
De plus tout cela n'est pas très simple car étant a la retraite, je n'ai plus accès a l'entreprise.

Re: Question de Proxy

Publié : jeu. 28/avr./2016 8:19
par Mesa
Pour windows seulement et je ne sais pas si ce code fonctionne encore.

On peut utiliser le proxy que l'on veut.

A l'époque il fonctionnait avec un proxy indien hautement anonyme. Quelque temps plus tard, le hasard a fait que, pendant que je regardais un reportage télévisé d'une élection primaire pour élire un candidat à la candidature de la présidence de la république française, le journaliste se demandait bien pourquoi un nombre impressionnant de français votait par internet depuis l'inde... :D :D :D

Je ne sais pas si PB est aussi populaire mais les proxy, eux, le sont :wink:

Code : Tout sélectionner

;adresse proxy
; http://www.freeproxylists.net


EnableExplicit
Structure INTERNET_PROXY_INFO
  dwAccessType.l
  *lpszProxy
  *lpszProxyBypass
EndStructure
#INTERNET_OPTION_PROXY = 38
#INTERNET_OPEN_TYPE_PROXY = 3
#INTERNET_OPEN_TYPE_DIRECT = 1
Procedure SetProxy(Proxy.s, Port.l, flags.l=#INTERNET_OPEN_TYPE_PROXY)
  Protected ProxyServer.s = Proxy + ":" + Str(Port)
  Protected PIInfo.INTERNET_PROXY_INFO
  PIInfo\dwAccessType = flags
  PIInfo\lpszProxy = @ProxyServer
  PIInfo\lpszProxyBypass = @""
  If UrlMkSetSessionOption_(#INTERNET_OPTION_PROXY, @PIInfo, SizeOf(INTERNET_PROXY_INFO), 0) = #S_OK
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure
If OpenWindow(0, 0, 0, 800, 600, "WebGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ; www.freeproxylists.net => Liste de proxy gratuit
  If Not SetProxy("14.139.225.83", 3128) ;=> un proxy en Inde (Haut Anonyme)
    Debug "La commande a échoué"
  EndIf
  WebGadget(0, 10, 10, 780, 580, "www.mon-ip.com")
  Repeat
    Global Event.l = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf
M.

Re: Question de Proxy

Publié : jeu. 28/avr./2016 18:56
par Kwai chang caine
Sujet hautement intéressant pour moi, qui me bat contre le même proxy depuis plus de 10 ans.
Je ne connaissais pas l'obligation du proxy de se connecter manuellement au moins une fois.
Et moi aussi le notre utilise un proxypac je ne savais pas ce que c'était jusqu'à ya pas vieux.
Jusqu'au jour ou une super tronche intérimaire est venu bosser et m'a montré un peu comment ça marche...
Mais bon...le plus dur reste à faire. ..
Avant Yavait quelques cadors en internet sur le forum FR, je pense à CLS mais aussi d'autres. ..
C'est déjà eux qui m'avaient aidé à passer le proxy
On ne les lis plus depuis bien longtemps