phreak87
Goto Top

VB.net Datei beim Download über Socket durch 5 wiederkehrende Zeichen beschädigt

Hallo Community,

ich hoffe ihr könnt mir bei meinem Problem helfen:

ich versuche einen Stream per Socket von einem WebServer herunterzuladen.
Die Daten des Streams kommen auch an, jedoch ist die heruntergeladene Datei
unbrauchbar weil 5 Zeichen (z.B. 3e8 + crlf) in verschiedenen Teilen des Streams
angefügt werden, die da nicht hingehören ...

Komischerweise ist das nicht bei allen Servern der Fall ...
vielleicht ist das auch in irgendeiner Spezifikation beschrieben
dass die ersten Teile des Streams zusätzliche Informationen enthalten ??

Der Source für den Empfang der Daten:

        Sub Start()
            Dim IP As IPAddress
            Dim URL2 As String = RegularExpressions.Regex.Match(_URLStart, "(http|https)://(.*?)(:[0-9])?/").Groups(2).Value  
            Dim PORT As String = RegularExpressions.Regex.Match(_URLStart, "(http|https)://(.*?)(:[0-9])?/").Groups(3).Value  
            IP = IPAddress.Parse(URL2) : If PORT = "" Then PORT = 80  
            Dim IPEP As IPEndPoint = New IPEndPoint(IP, PORT)

            _Sock = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            _Sock.Connect(IPEP) : Thread.Sleep(50) : If _Sock.Connected = False Then Exit Sub
            _Sock.ReceiveTimeout = 60000 : _Sock.SendTimeout = 1000

            Dim Header As New StringBuilder
            Header.AppendLine("GET " & Mid(_URLStart, InStr(_URLStart, IP.ToString) + IP.ToString.Length) & " HTTP/1.1")  
            Header.AppendLine("Host: " & IP.ToString)  
            Header.AppendLine("Connection: keep-alive")  
            Header.AppendLine() : _Sock.Send(Encoding.UTF8.GetBytes(Header.ToString))

            Do Until _Sock.Connected = False
                Dim B(_Sock.Available - 1) As Byte : _Sock.Receive(B)
                _MS.Write(B, 0, B.Length) : Thread.Sleep(50)
            Loop
        End Sub

Der Response-Header im Webbrowser (bei dem die Datei richtig ankommt) lautet:
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-type: application/octet-stream
Date: Thu, 03 May 2018 19:42:06 GMT
Keep-Alive: timeout=60, max=300
Content-Disposition: attachment; filename=export.ext

Ich hoffe Ihr habt eine Idee woran es liegen könnte ...

Content-Key: 372906

Url: https://administrator.de/contentid/372906

Printed on: April 27, 2024 at 11:04 o'clock

Member: Phreak87
Phreak87 May 03, 2018 at 20:21:22 (UTC)
Goto Top
nach langem Suchen und Debuggen hier die Lösung:

es liegt an dem Http-Header Transfer-Encoding: Chunked.

dieser gibt die Anzahl der Bytes des Chunks gefolgt von crlf
für jeden Chunk aus.

dadurch entsteht:

HTTP/1.1 200 OK 
Content-Type: text/plain 
Transfer-Encoding: chunked

7\r\n
Mozilla\r\n 
9\r\n
Developer\r\n
7\r\n
Network\r\n
0\r\n 
\r\n

Mozilla Devs

wobei eben die Zahlen für die Anzahl der nachfolgenden Bytes stehen und
der Stream mit 0\r\n\r\n abgeschlossen wird. Wie im obigen Beispiel empfange
ich demnach viele Chunks mit je 0x3e8 Bytes (= 1000 Bytes).

Ich danke trotzdem allen, die sich Gedanken darüber gemacht haben.