Seite 1 von 1

Datei über Proxy Verbindung Herunterladen

Verfasst: 12.07.2009 10:53
von X360 Andy
Es ist ja bekannt das die PB HTTP LIB keine Proxy Verbindungen unterstützt, aber wie kann ich (ohne API am besten) eine Datei runterladen aus dem WWW mit aktiven Proxy ?

Beim Suchen bin ich auf den Auto Updater von HeX0R gekommen
> http://purebasic.fr/german/viewtopic.php?t=18904

Source hab ich mir mal angeschaut, den HTTP Download Teil sticht finde ich nicht wirklich raus, da ich nich weiß welche Teile ich alles brauche.

Gibt es irgendwo ein einfaches Beispiel wie ich eben eine Datei über eine Proxy Verbindung runterladen kann.

Würde mich über ein Beispiel/Link etc. freuen.


Die Info ob eine Proxy aktiv ist steht doch in der Registry oder ?
Wenn ja dann bräuchte das Programm ab Vista ja admin rechte oder ?

Verfasst: 12.07.2009 11:03
von cxAlex
Hier mal ein Code mit dem man sich über einen HTTP/Socks4/Socks5 Proxy, IPVv4 & IPv6 verbinden kann. Leider weiß ich nicht mehr wo ich den Code gefunden hab, Credits an den Autor:

Die Connection-ID kann man dann mit den normalen PB - Netzwerkbefehlen verwenden.

Code: Alles auswählen

InitNetwork()

Procedure.l IsIP(ip.s)
  ;ReturnValues :
  ;0 = no ip
  ;1 = IPv4 - IP
  ;2 = IPv6 - IP
  count.l = CountString(ip, ".")
  If count = 3
    ret.l = 1
  ElseIf count = 5
    ret.l = 2
  Else
    ProcedureReturn 0
  EndIf
  For i = 0 To count
    a$ = StringField(ip, i + 1, ".")
    If a$ = "" Or Str(Val(a$))<>a$ Or Val(a$)>255 Or Val(a$)<0
      ProcedureReturn 0
    EndIf
  Next i
  ProcedureReturn ret
EndProcedure

Procedure.l Proxy_Connect(proxy_ip.s, proxy_port.l, ip_to_connect.s, port_to_connect.l, type.l, username.s, userpass.s, timeout.l)
  ;proxy_ip        = IP or URL of the Proxy-Server
  ;proxy_port      = Port of the Proxy-Server
  ;ip_to_connect   = IP or URL of where you want to connect through proxy. ATTENTION:
  ;  SOCKS4 only supports IP in IPv4-format! You have to get the IP first before using this on urls, otherwise it will fail!
  ;port_to_connect = Port of where you want to connect through proxy
  ;type            = 0 -> http-proxy
  ;type            = 1 -> socks4-proxy
  ;type            = 2 -> socks5-proxy
  ;If no authorization is needed set username and userpass = ""
  ;timeout         -> Time after connection-trial will time out (in SECONDS)
  ;Return-Value    = 0 -> error ; Return-Value > 0 -> ConnectionID
  
  *buffer = AllocateMemory(1024)
  If *buffer = 0
    ProcedureReturn #False
  EndIf
  
  netid.l = OpenNetworkConnection(proxy_ip, proxy_port)
  
  If netid = 0
    FreeMemory(*buffer)
    ProcedureReturn #False
  EndIf
  
  Select type
      
    Case 0
      ;====================
      ;HTTP-Proxy
      ;====================
      ;Based on Num3's http-proxy-snippet , THX! ->
      ;http://purebasic.myforums.net/viewtopic.php?t=10327
      
      text$ = "CONNECT " + ip_to_connect + ":" + Str(port_to_connect) + " HTTP/1.0" + #CRLF$
      
      If username And userpass
        user$ = username + ":" + userpass
        length.l = Len(user$)*2
        If length<64
          length = 64
        EndIf
        Base64Encoder(@user$, Len(user$), *buffer, length)
        encoded$ = PeekS(*buffer)
        text$ + "Authorization: Basic " + encoded$ + #CRLF$
        text$ + "Proxy-Authorization: Basic " + encoded$ + #CRLF$
      EndIf
      text$ + #CRLF$
      
      SendNetworkData(netid, @text$, Len(text$))
      check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          Content$ = Space(14500)
          length.l = ReceiveNetworkData(netid, @Content$, 14500)
          While length = 14500
            ;Clear Input-Buffer
            length = ReceiveNetworkData(netid, *buffer, 14500)
          Wend
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      Result.l = 0
      For i = 1 To CountString(Content$, Chr(10))
        a$ = Trim(StringField(Content$, i, Chr(10)))
        If Left(a$, 7) = "HTTP/1."
          Result = Val(StringField(Content$, 2, Chr(32)))
          Break
        EndIf
      Next i
      If check_timeout<ElapsedMilliseconds() Or Result<>200
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      FreeMemory(*buffer)
      ProcedureReturn netid
      
    Case 1
      ;====================
      ;Socks4 - Proxy
      ;====================
      
      ;Socks4 only supports IPv4 !
      ;You have to do a DNS-Lookup before using this on urls, otherwise it will fail!
      If IsIP(ip_to_connect)<>1
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      ;Phase 1 SOCK4
      ;Send Request
      PokeB(*buffer, 4)
      PokeB(*buffer + 1, 1)
      hi.l = Int(port_to_connect/256)
      lo.l = port_to_connect-(256*hi)
      PokeB(*buffer + 2, hi)
      PokeB(*buffer + 3, lo)
      For i = 1 To 4
        PokeB(*buffer + 3 + i, Val(StringField(ip_to_connect, i, ".")) & 255)
      Next i
      PokeS(*buffer + 8, username)
      length.l = 9 + Len(username)
      SendNetworkData(netid, *buffer, length)
      ;Check if connection is established
      check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          ReceiveNetworkData(netid, *buffer, 1024)
          ver.l = PeekB(*buffer) & 255
          CD.l = PeekB(*buffer + 1) & 255
          port.l = (PeekB(*buffer + 2) & 255)*256
          port + (PeekB(*buffer + 3) & 255)
          ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
          ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255)
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      If check_timeout<ElapsedMilliseconds() Or ver<>0 Or CD<>90
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      ;IP and Port should be the same like ip_to_connect/port_to_connect and is just for information
      FreeMemory(*buffer)
      ProcedureReturn netid
      
    Case 2
      ;====================
      ;Socks5 - Proxy
      ;====================
      
      ;Phase 1 SOCK5
      ;Send wished method
      If username = "" And userpass = ""
        length.l = 3
        PokeB(*buffer, 5)
        PokeB(*buffer + 1, 1)
        PokeB(*buffer + 2, 0)
      Else
        length.l = 4
        PokeB(*buffer, 5)
        PokeB(*buffer + 1, 2)
        PokeB(*buffer + 2, 0)
        PokeB(*buffer + 3, 2)
      EndIf
      SendNetworkData(netid, *buffer, length)
      ;Check if method is allowed
      check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          ReceiveNetworkData(netid, *buffer, 2)
          ver.l = PeekB(*buffer) & 255
          method.l = PeekB(*buffer + 1) & 255
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      If check_timeout<ElapsedMilliseconds() Or ver<>5 Or method = 255
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      If method = 2
        ;Phase 2 SOCK5
        ;Send Username/Password (if allowed)
        PokeB(*buffer, 1)
        PokeB(*buffer + 1, Len(username))
        PokeS(*buffer + 2, username)
        k = 2 + Len(username)
        PokeB(*buffer + k, Len(userpass))
        PokeS(*buffer + k + 1, userpass)
        SendNetworkData(netid, *buffer, Len(userpass) + 1 + k)
        ;Check if Username/Password is accepted
        check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
        Repeat
          Delay(10)
          If NetworkClientEvent(netid) = 2
            ReceiveNetworkData(netid, *buffer, 2)
            passver.l = PeekB(*buffer) & 255
            status.l = PeekB(*buffer + 1) & 255
            Break
          EndIf
        Until check_timeout<ElapsedMilliseconds()
        If check_timeout<ElapsedMilliseconds() Or passver<>1 Or status<>0
          FreeMemory(*buffer)
          CloseNetworkConnection(netid)
          ProcedureReturn #False
        EndIf
      EndIf
      ;Phase 3 SOCK5
      ;Send Connect-Request
      PokeB(*buffer, 5)
      PokeB(*buffer + 1, 1)
      PokeB(*buffer + 2, 0)
      Select IsIP(ip_to_connect)
        Case 0
          PokeB(*buffer + 3, 3)
          PokeB(*buffer + 4, Len(ip_to_connect))
          For i = 1 To Len(ip_to_connect)
            PokeB(*buffer + 4 + i, Asc(Mid(ip_to_connect, i, 1)))
          Next i
          cont.l = 4 + i
        Case 1
          PokeB(*buffer + 3, 1)
          For i = 1 To 4
            PokeB(*buffer + 3 + i, Val(StringField(ip_to_connect, i, ".")) & 255)
          Next i
          cont.l = 8
        Case 2
          PokeB(*buffer + 3, 4)
          For i = 1 To 6
            PokeB(*buffer + 3 + i, Val(StringField(ip_to_connect, i, ".")) & 255)
          Next i
          cont.l = 10
      EndSelect
      hi.l = Int(port_to_connect/256)
      lo.l = port_to_connect-(256*hi)
      PokeB(*buffer + cont, hi)
      PokeB(*buffer + cont + 1, lo)
      SendNetworkData(netid, *buffer, cont + 2)
      ;Now Check the reply
      check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          length.l = ReceiveNetworkData(netid, *buffer, 1024)
          ver.l = PeekB(*buffer) & 255
          reply.l = PeekB(*buffer + 1) & 255
          reserved.l = PeekB(*buffer + 2) & 255
          atyp.l = PeekB(*buffer + 3) & 255
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      If check_timeout<ElapsedMilliseconds() Or ver<>5 Or reply<>0 Or reserved<>0
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      Select atyp
        Case 1
          ;IPv4
          ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
          ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255)
          port.l = (PeekB(*buffer + 8) & 255)*256
          port + (PeekB(*buffer + 9) & 255)
        Case 3
          ;Name
          ip.s = ""
          For i = 1 To (PeekB(*buffer + 4) & 255)
            ip + Chr(PeekB(*buffer + 4 + i) & 255)
          Next i
          port.l = (PeekB(*buffer + 4 + i) & 255)*256
          port + (PeekB(*buffer + 5 + i) & 255)
        Case 4
          ;IPv6
          ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
          ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255) + "."
          ip + Str(PeekB(*buffer + 8) & 255) + "." + Str(PeekB(*buffer + 9) & 255)
          port.l = (PeekB(*buffer + 10) & 255)*256
          port + (PeekB(*buffer + 11) & 255)
      EndSelect
      ;Following IP and Port is just for information...
      ;this is proxy-internal and not necessarily the same as ip_to_connect/port_to_connect
      FreeMemory(*buffer)
      ProcedureReturn netid
      
  EndSelect
  
EndProcedure

Verfasst: 12.07.2009 11:09
von X360 Andy
Danke schonmal bringt mir jetzt aber nicht besonders viel, da ich ja nicht weiß ob Proxy aktiviert sind und wenn ja was für Daten dieser hat.

Verfasst: 12.07.2009 11:13
von cxAlex
Das findest du unter:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings

ProxyEnable - Proxy aktiviert (REG_DWORD)
ProxyServer - ProxyServer IP:Port (REG_SZ)

Der Proxy-Server muss eigentlich ein HTTP-Proxy sein.
Mit dem Registry Codes die im Forum rumschwirren sollte der Rest kein Problem mehr sein.

Verfasst: 12.07.2009 11:17
von X360 Andy
Dann braucht das Programm aber Admin Mode unter Vista/Win7 oder ?
Gibts keine andere Möglichkeit ?

EDIT
OK selber testen bringt doch immer noch am meisten :D

Nur eine frage

Code: Alles auswählen

Procedure.s ReadReg(HKEY, Ort$, Var$)
 RetVal = RegOpenKeyEx_(HKEY, Ort$, 0, #KEY_ALL_ACCESS, @lhkey)
 cch = 255 : sValue$ = Space(255)
 lType = #REG_SZ
 lrc = RegQueryValueEx_(lhkey, Var$, 0, @lType, @sValue$, @cch)   
 RegCloseKey_(lhkey)
 ProcedureReturn sValue$
EndProcedure
Debug ReadReg(#HKEY_CURRENT_USER,"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable") 
Debug ReadReg(#HKEY_CURRENT_USER,"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyServer") 

Die Abfrage ob eine Proxy Verbinung an sind gibt mir kein Ergebnis zurück, liegt das an dem Typ ?

Verfasst: 12.07.2009 12:01
von HeX0R
cxAlex hat geschrieben: [...]
Credits an den Autor
[...]
Danke! <)

Übrigens:
Wenn du anstatt #KEY_ALL_ACCESS, #KEY_READ nimmst, brauchst du auch keine Adminrechte.

Verfasst: 12.07.2009 13:21
von cxAlex
HeX0R hat geschrieben:
cxAlex hat geschrieben: [...]
Credits an den Autor
[...]
Danke! <)
Super Code :allright:.

Hab ihn mal schnell überarbeitet, Enable Explicit - kompatibel und ein paar andere Späße:

Code: Alles auswählen

; EnableExplicit

; InitNetwork()

Procedure IsIP(ip.s)
  Protected count, ret, i, a$, va
  ;ReturnValues :
  ;0 = no ip
  ;1 = IPv4 - IP
  ;2 = IPv6 - IP
  count = CountString(ip, ".")
  If count = 3
    ret = 1
  ElseIf count = 5
    ret = 2
  Else
    ProcedureReturn 0
  EndIf
  For i = 0 To count
    a$ = StringField(ip, i + 1, ".")
    va = Val(a$)
    If a$ = "" Or Str(va)<>a$ Or va>255 Or va<0
      ProcedureReturn 0
    EndIf
  Next i
  ProcedureReturn ret
EndProcedure

; führt einen DNS - Lockup aus
Procedure DNS_Lookup(Host$)
  Protected ret, *host.hostent
  *host = gethostbyname_(host$)
  If *host
    ret = PeekL(PeekL(*host\h_addr_list))
  Else
    ret = *host
  EndIf
  ProcedureReturn ret
EndProcedure

Structure ByteArray
  *b.b[0]
EndStructure

Procedure Proxy_Connect(proxy_ip.s, proxy_port.l, ip_to_connect.s, port_to_connect.l, type.l, username.s, userpass.s, timeout.l)
  Protected *buffer.ByteArray, netid, text$, user$, length, encoded$, check_timeout, Content$, Result, i, a$
  Protected hi, lo, ver, CD, Port, method, k, cont, reply, reserved, atyp, passver, status, cnts
  
  ;proxy_ip        = IP or URL of the Proxy-Server
  ;proxy_port      = Port of the Proxy-Server
  ;ip_to_connect   = IP or URL of where you want to connect through proxy. ATTENTION:
  ;  SOCKS4 only supports IP in IPv4-format! You have to get the IP first before using this on urls, otherwise it will fail!
  ;port_to_connect = Port of where you want to connect through proxy
  ;type            = 0 -> http-proxy
  ;type            = 1 -> socks4-proxy
  ;type            = 2 -> socks5-proxy
  ;If no authorization is needed set username and userpass = ""
  ;timeout         -> Time after connection-trial will time out (in SECONDS)
  ;Return-Value    = 0 -> error ; Return-Value > 0 -> ConnectionID
  
  proxy_ip = IPString(DNS_Lookup(proxy_ip))
  ip_to_connect = IPString(DNS_Lookup(ip_to_connect))
  
  *buffer = AllocateMemory(1024)
  If *buffer = 0
    ProcedureReturn #False
  EndIf
  
  netid = OpenNetworkConnection(proxy_ip, proxy_port)
  
  If netid = 0
    FreeMemory(*buffer)
    ProcedureReturn #False
  EndIf
  
  Select type
      
    Case 0
      ;====================
      ;HTTP-Proxy
      ;====================
      ;Based on Num3's http-proxy-snippet , THX! ->
      ;http://purebasic.myforums.net/viewtopic.php?t=10327
      
      text$ = "CONNECT " + ip_to_connect + ":" + Str(port_to_connect) + " HTTP/1.0" + #CRLF$
      
      If username And userpass
        user$ = username + ":" + userpass
        length = Len(user$)*2
        If length<64
          length = 64
        EndIf
        Base64Encoder(@user$, Len(user$), *buffer, length)
        encoded$ = PeekS(*buffer)
        text$ + "Authorization: Basic " + encoded$ + #CRLF$
        text$ + "Proxy-Authorization: Basic " + encoded$ + #CRLF$
      EndIf
      text$ + #CRLF$
      
      SendNetworkData(netid, @text$, Len(text$))
      check_timeout = ElapsedMilliseconds() + (timeout*1000) ; Timeout
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = #PB_NetworkEvent_Data
          Content$ = Space(14500)
          length = ReceiveNetworkData(netid, @Content$, 14500)
          While length = 14500
            ;Clear Input-Buffer
            length = ReceiveNetworkData(netid, *buffer, 14500)
          Wend
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      
      Result = 0
      cnts = CountString(Content$, Chr(10))
      For i = 1 To cnts
        a$ = Trim(StringField(Content$, i, Chr(10)))
        If Left(a$, 7) = "HTTP/1."
          Result = Val(StringField(Content$, 2, Chr(32)))
          Break
        EndIf
      Next i
      
      If check_timeout<ElapsedMilliseconds() Or Result<>200
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      FreeMemory(*buffer)
      ProcedureReturn netid
      
    Case 1
      ;====================
      ;Socks4 - Proxy
      ;====================
      
      ;Socks4 only supports IPv4 !
      ;You have to do a DNS-Lookup before using this on urls, otherwise it will fail!
      If IsIP(ip_to_connect)<>1
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      ;Phase 1 SOCK4
      ;Send Request
      *buffer\b[0] = 4
      *buffer\b[1] = 1
      hi = Int(port_to_connect/256)
      lo = port_to_connect-(256*hi)
      *buffer\b[2] = hi
      *buffer\b[3] = lo
      For i = 1 To 4
        *buffer\b[3 + i] = Val(StringField(ip_to_connect, i, ".")) & 255
      Next i
      PokeS(*buffer + 8, username)
      length = 9 + Len(username)
      SendNetworkData(netid, *buffer, length)
      ;Check if connection is established
      check_timeout = ElapsedMilliseconds() + (timeout*1000)
      
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = #PB_NetworkEvent_Data
          ReceiveNetworkData(netid, *buffer, 1024)
          ver = *buffer\b[0] & 255
          CD = *buffer\b[1] & 255
          port = (*buffer\b[2] & 255)*256
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      
      If check_timeout<ElapsedMilliseconds() Or ver<>0 Or CD<>90
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      
      ;IP and Port should be the same like ip_to_connect/port_to_connect and is just for information
      FreeMemory(*buffer)
      ProcedureReturn netid
      
    Case 2
      ;====================
      ;Socks5 - Proxy
      ;====================
      
      ;Phase 1 SOCK5
      ;Send wished method
      If username = "" And userpass = ""
        length = 3
        *buffer\b[0] = 5
        *buffer\b[1] = 1
        *buffer\b[2] = 0
      Else
        length = 4
        *buffer\b[0] = 5
        *buffer\b[1] = 2
        *buffer\b[2] = 0
        *buffer\b[3] = 2
      EndIf
      
      SendNetworkData(netid, *buffer, length)
      ;Check if method is allowed
      check_timeout = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          ReceiveNetworkData(netid, *buffer, 2)
          ver = *buffer\b[0] & 255
          method = *buffer\b[1] & 255
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      
      If check_timeout<ElapsedMilliseconds() Or ver<>5 Or method = 255
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      
      If method = 2
        ;Phase 2 SOCK5
        ;Send Username/Password (if allowed)
        *buffer\b[0] = 1
        *buffer\b[1] = Len(username)
        PokeS(*buffer + 2, username)
        k = 2 + Len(username)
        *buffer\b[k] = Len(userpass)
        PokeS(*buffer + k + 1, userpass)
        SendNetworkData(netid, *buffer, Len(userpass) + 1 + k)
        
        ;Check if Username/Password is accepted
        check_timeout = ElapsedMilliseconds() + (timeout*1000)
        Repeat
          Delay(10)
          If NetworkClientEvent(netid) = #PB_NetworkEvent_Data
            ReceiveNetworkData(netid, *buffer, 2)
            passver = *buffer\b[0] & 255
            status = *buffer\b[1] & 255
            Break
          EndIf
        Until check_timeout<ElapsedMilliseconds()
        
        If check_timeout<ElapsedMilliseconds() Or passver<>1 Or status<>0
          FreeMemory(*buffer)
          CloseNetworkConnection(netid)
          ProcedureReturn #False
        EndIf
      EndIf
      
      ;Phase 3 SOCK5
      ;Send Connect-Request
      *buffer\b[0] = 5
      *buffer\b[1] = 1
      *buffer\b[2] = 0
      Select IsIP(ip_to_connect)
        Case 0
          *buffer\b[3] = 4
          *buffer\b[4] = Len(ip_to_connect)
          cnts = Len(ip_to_connect)
          For i = 1 To cnts
            *buffer\b[4 + i] = Asc(Mid(ip_to_connect, i, 1))
          Next i
          cont = 4 + i
          
        Case 1
          *buffer\b[3] = 1
          For i = 1 To 4
            *buffer\b[3 + i] = Val(StringField(ip_to_connect, i, ".")) & 255
          Next i
          cont = 8
          
        Case 2
          *buffer\b[3] = 4
          For i = 1 To 6
            *buffer\b[3 + i] = Val(StringField(ip_to_connect, i, ".")) & 255
          Next i
          cont = 10
          
      EndSelect
      
      hi = Int(port_to_connect/256)
      lo = port_to_connect-(256*hi)
      *buffer\b[cont] = hi
      *buffer\b[cont + 1] = lo
      SendNetworkData(netid, *buffer, cont + 2)
      
      ;Now Check the reply
      check_timeout = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = #PB_NetworkEvent_Data
          length = ReceiveNetworkData(netid, *buffer, 1024)
          ver = *buffer\b[0] & 255
          reply = *buffer\b[1] & 255
          reserved = *buffer\b[2] & 255
          atyp = *buffer\b[3] & 255
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      
      If check_timeout<ElapsedMilliseconds() Or ver<>5 Or reply<>0 Or reserved<>0
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      
      FreeMemory(*buffer)
      ProcedureReturn netid
      
  EndSelect
  
EndProcedure

Verfasst: 12.07.2009 16:45
von HeX0R
cxAlex hat geschrieben: Super Code :allright:.
Naja, ich würde einiges davon heute anders machen.
Aber ist ja auch nen 5 Jahre alter Code.

Verfasst: 12.07.2009 17:05
von X360 Andy
Mich würde ja intressieren wieso mein zusammengebastler Code nicht geht.


Habs mit verschiedenen Proxys versucht, als Ergebnis bekomme ich jedes mal 0 aus.

Meine weitere frage wäre jetzt, selbst wenn es gehen würde, wie würde ich an die Datei rankommen ?
Z.b http://purebasic.fr/german/templates/Ap ... _phpBB.gif

Code: Alles auswählen

InitNetwork()
Procedure.l Proxy_Connect(proxy_ip.s, proxy_port.l, ip_to_connect.s, port_to_connect.l, username.s, userpass.s, timeout.l)
  ;proxy_ip        = IP or URL of the Proxy-Server
  ;proxy_port      = Port of the Proxy-Server
  ;ip_to_connect   = IP or URL of where you want to connect through proxy. ATTENTION:
  ;  SOCKS4 only supports IP in IPv4-format! You have to get the IP first before using this on urls, otherwise it will fail!
  ;port_to_connect = Port of where you want to connect through proxy
  ;type            = 0 -> http-proxy
  ;type            = 1 -> socks4-proxy
  ;type            = 2 -> socks5-proxy
  ;If no authorization is needed set username and userpass = ""
  ;timeout         -> Time after connection-trial will time out (in SECONDS)
  ;Return-Value    = 0 -> error ; Return-Value > 0 -> ConnectionID
 
  *buffer = AllocateMemory(1024)
  If *buffer = 0
    ProcedureReturn #False
  EndIf
 
  netid.l = OpenNetworkConnection(proxy_ip, proxy_port)
 
  If netid = 0
    FreeMemory(*buffer)
    ProcedureReturn #False
  EndIf
 

      ;====================
      ;HTTP-Proxy
      ;====================
      ;Based on Num3's http-proxy-snippet , THX! ->
      ;http://purebasic.myforums.net/viewtopic.php?t=10327
     
      text$ = "CONNECT " + ip_to_connect + ":" + Str(port_to_connect) + " HTTP/1.0" + #CRLF$
     
      If username And userpass
        user$ = username + ":" + userpass
        length.l = Len(user$)*2
        If length<64
          length = 64
        EndIf
        Base64Encoder(@user$, Len(user$), *buffer, length)
        encoded$ = PeekS(*buffer)
        text$ + "Authorization: Basic " + encoded$ + #CRLF$
        text$ + "Proxy-Authorization: Basic " + encoded$ + #CRLF$
      EndIf
      text$ + #CRLF$
     
      SendNetworkData(netid, @text$, Len(text$))
      check_timeout.l = ElapsedMilliseconds() + (timeout*1000)
      Repeat
        Delay(10)
        If NetworkClientEvent(netid) = 2
          Content$ = Space(14500)
          length.l = ReceiveNetworkData(netid, @Content$, 14500)
          While length = 14500
            ;Clear Input-Buffer
            length = ReceiveNetworkData(netid, *buffer, 14500)
          Wend
          Break
        EndIf
      Until check_timeout<ElapsedMilliseconds()
      Result.l = 0
      For i = 1 To CountString(Content$, Chr(10))
        a$ = Trim(StringField(Content$, i, Chr(10)))
        If Left(a$, 7) = "HTTP/1."
          Result = Val(StringField(Content$, 2, Chr(32)))
          Break
        EndIf
      Next i
      If check_timeout<ElapsedMilliseconds() Or Result<>200
        FreeMemory(*buffer)
        CloseNetworkConnection(netid)
        ProcedureReturn #False
      EndIf
      FreeMemory(*buffer)
      ProcedureReturn netid
      
      
      
      
    EndProcedure
    
    url$ = "http://purebasic.fr"
    ip$ = "138.246.99.250"
    port = 3127
Debug Proxy_Connect(ip$, port,url$, 80 ,"", "",10)

Verfasst: 12.07.2009 22:34
von HeX0R
Du kannst doch selbst schauen, was der Proxy von deinem Verbindungsversuch hält.
Dein genannter z.B. sagt:
138.246.99.250 hat geschrieben: HTTP/1.0 405 Method Not Allowed
Content-Type: text/html
Allow: GET

You are trying to use a node of the CoDeeN CDN Network. Your IP address is not recognized as a valid PlanetLab address, so your access to CoDeeN does not include all HTTP types [...]