WinSock - Je opravdu nepoužitelný ?

Připojení k serveru
Toto je část kódu, kterou naleznete na události Click tlačítka "Načíst zdroj":

   If chkUseProxy.Value Then
      If Len(txtProxyPort) > 0 And Len(txtProxyServer) > 0 Then
         m_strRemoteHost = txtProxyServer
         intPort = CInt(txtProxyPort)
         m_strFilePath = XURLEncode(txtURL)
         If Not Left(m_strFilePath, 7) = "http://" Then
            m_strFilePath = "http://" & m_strFilePath
         End If
         If Left(txtURL, 7) = "http://" Then
            strURL = Mid(txtURL, 8)
         Else
            strURL = txtURL
         End If
         m_strProxyHost = Left$(strURL, InStr(1, strURL, "/") - 1)
      End If
   Else
      intPort = 80
      If Left(txtURL, 7) = "http://" Then
         strURL = Mid(txtURL, 8)
      Else
         strURL = txtURL
      End If
      m_strRemoteHost = Left$(strURL, InStr(1, strURL, "/") - 1)
      m_strFilePath = Mid$(strURL, InStr(1, strURL, "/"))
   End If

Právě zde probíhá větvení, které připravuje proměnné pro vygenerování HTTP požadavku. Záleží na tom, zda jedeme přes Proxy Server anebo ne. Hlavní rozdíl je v tom, že pokud se připojujeme přes Proxy Server, musím si ještě navíc zjistit i cílový server z URL adresy požadovaného zdroje. Nyní se můžeme připojit k serveru:

With wscHttp
   .Close
   .LocalPort = 0
   .Connect m_strRemoteHost, intPort
End With


Všimněte si, že pokud jsem připojen přes Proxy Server, tak jako server pro připojení udávám právě adresu Proxy Serveru a jeho port. Při přímém připojení k Internetu zasíláme rovnou adresu a defaultní port cílového serveru.

Pokud se úspěšně připojíme na server (ať již přímo na cílový nebo na Proxy Server, je vyvolána událost Connect prvku WinSock. Zde vygenerujeme HTTP požadavek a předáme:

   Dim strHttpRequest As String

   strHttpRequest = "GET " & XURLEncode(m_strFilePath) & " HTTP/1.1" & vbCrLf

   strHttpRequest = strHttpRequest & "Connection: close" & vbCrLf
   strHttpRequest = strHttpRequest & "Accept: */*" & vbCrLf

   
If Len(txtUserName.Text) > 0 And Len(txtPassword.Text) > 0 Then
      strHttpRequest = strHttpRequest & "Authorization: Basic "
      strHttpRequest = strHttpRequest & CStr(Base64_Encode(txtUserName.Text & ":" & txtPassword.Text)) & vbCrLf
   End If

   
If Len(txtProxyUserName.Text) > 0 And Len(txtProxyPassword.Text) > 0 Then
      strHttpRequest = strHttpRequest & "Host: " & m_strProxyHost & vbCrLf
      strHttpRequest = strHttpRequest & "Proxy-Authorization: Basic "
      strHttpRequest = strHttpRequest & Base64_Encode(txtProxyUserName.Text & ":" & _
txtProxyPassword.Text) & vbCrLf
   Else
      strHttpRequest = strHttpRequest & "Host: " & m_strRemoteHost & vbCrLf
   End If

   strHttpRequest = strHttpRequest & vbCrLf
   wscHttp.SendData strHttpRequest

Hned na začátku používám funkci XURLEncode. není to skutečné URL enkódování znaků, ale jenom nahrazuji mezery v řetězci za znak %20 (funkce je součástí projektu). Pak následuje generování řádek HTTP požadavku společné pro všechny případy připojení. A následně se kód větví podle toho, zda je cílový soubor chráněný jménem a heslem a zda jsem připojeni přes Proxy Server. Nejsou tu implementovány žádné složité procedury pro ověřování chyb (správnosti zadání údajů do polí), je to pouze demonstrační projekt a Vy si, pokud jej budete používat, jistě napíšete svoje a lepší :)

Takto vygenerovaný HTTP požadavek se zobrazí v příslušném RichTextBoxu a my můžeme čekat na odpověď.

Zpět Další

Autor: The Bozena

iReklama.cz - nový reklamní systém
iReklama.cz - nový reklamní systém