Search code examples
c#character-encodinghttpwebrequesthttpwebresponse

HttpWebRequest not downloading file correctly


I can't use WebClient, before anyone suggests that because it makes my legit application seem like a virus to McAfee. So please don't suggest that.

I have a binary.txt file stored on my server. It is approximately 1,240kb. However, HttpWebRequest downloads random amounts from 1,300kb to 1,700kb.

HttpWebRequest httpRequest = (HttpWebRequest)
WebRequest.Create("http://deviantsmc.com/binary.txt");
httpRequest.Method = WebRequestMethods.Http.Get;
HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
Stream httpResponseStream = httpResponse.GetResponseStream();
byte[] buffer = new byte[1240];
int bytesRead = 0;
StringBuilder sb = new StringBuilder();

//FileStream fileStream = File.Create(@"tcontent.txt");
while ((bytesRead = httpResponseStream.Read(buffer, 0, 1240)) != 0)
{
    sb.Append(Encoding.ASCII.GetString(buffer));
    //fileStream.Write(buffer, 0, bytesRead);
}
File.WriteAllText(@"tcontent1.txt", sb.ToString());

(The contents of the binary.txt file on the server are in ASCII, therefore I get the Encoding string to ASCII as well).

This is how I encoded that text file (on that server)

My file is basically this:

byte[] bytes = File.ReadAllBytes("binary.txt");
String encBytes = Encoding.ASCII.GetString(bytes);
File.WriteAllText(file("binary.txt"), encBytes);

I contacted the AV company about the WebDownloader being seen as some malicious import in C#, but they didn't get back to me, so I'm forced to use HttpWebRequest.


Solution

  • If your only goal is to fetch that binary and write it to disk you can simply copy the stream to a file with the CopyTo method that exists on a Stream object.

    Your file looks like a broken zip file btw, given the first characters that are PK, and is used in the zip specificaton.

    From wikipedia:

    Viewed as an ASCII string this reads "PK", the initials of the inventor Phil Katz. Thus, when a .ZIP file is viewed in a text editor the first two bytes of the file are usually "PK".

    I used 7-zip to open your file as the Windows default didn't accept it as a valid file. It contains a manifest.mf file but the content itself seems missing. the file itself has a size of 1.269.519 bytes.

    HttpWebRequest httpRequest = (HttpWebRequest)
    WebRequest.Create("http://deviantsmc.com/binary.txt");
    httpRequest.Method = WebRequestMethods.Http.Get;
    HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
    Stream httpResponseStream = httpResponse.GetResponseStream();
    
    // create and open a FileStream, using calls dispose when done
    using(var fs= File.Create(@"c:\temp\bin.7z"))
    {
         // Copy all bytes from the responsestream to the filestream
         httpResponseStream.CopyTo(fs);
    }