HTTP POST with binary data in .NET - 404 error

mathsvn

New member
Joined
Jul 22, 2007
Messages
1
Programming Experience
Beginner
Hi

From VB.NET I want to simulate the POST request of the following HTML form

VB.NET:
<html>    
<title>HTTP Post Testing</title>    
<body>    
<form action=http://www.example.com/postdata    
enctype="multipart/form-data" method="post" name="testform">    
<input id="user_login" name="user[login]" size="30" type="hidden"    
value="user01" />    
<input id="user_password" name="user[password]" size="30"    
type="hidden" value="123456" />    
               <table>    
                       <tr>    
                               <td>File:</td>    
  
                               <td><input id="file" name="file"    
type="file" /></td>    
                       </tr>    
                       <tr>    
                               <td colspan="2"><input name="commit"    
type="submit" value="Upload" name="upload"/></td>    
                       </tr>    
               </table>    
       </form>    
</body>    
</html>

The target URL would return "OK" for successful upload and empty otherwise.

My code to generate the POST request is as followed:

VB.NET:
        Try  
            Dim request As HttpWebRequest = CType(WebRequest.Create(Me.txtURL.Text), HttpWebRequest) 'this textbox contains the target URL of the request   
            ' Set the Method property of the request to POST.   
            request.Method = "POST"  
            request.Accept = "*/*"  
            request.UserAgent = "curl/7.16.3"  
            request.ProtocolVersion = HttpVersion.Version11   
            request.Referer = "http://www.mydomain.com/"  
            request.SendChunked = True  
  
            System.Net.ServicePointManager.Expect100Continue = False  
  
            ' Create POST data and convert it to a byte array.   
            Dim postData As String = ""  
  
            postData += Boundary + Chr(13) + Chr(10) + "Content-Disposition: form-data; name=""user[login]""" + Chr(13) + Chr(10) + Chr(13) + Chr(10)   
            postData += "gape" + Chr(13) + Chr(10)   
            postData += Boundary + Chr(13) + Chr(10) + "Content-Disposition: form-data; name=""user[password]""" + Chr(13) + Chr(10) + Chr(13) + Chr(10)   
            postData += "telipoint8" + Chr(13) + Chr(10)   
            postData += Boundary + Chr(13) + Chr(10) + "Content-Disposition: form-data; name=""file""; filename=""helpcurl.txt""" + Chr(13) + Chr(10)   
            postData += "Content-Type: text/plain" + Chr(13) + Chr(10) + Chr(13) + Chr(10)   
            postData += "fdfgfggfbfgggggggggggggggg" + Chr(13) + Chr(10) + Boundary + "--" + Chr(13) + Chr(10)   
  
            Dim encoding As New System.Text.ASCIIEncoding()   
            Dim byteArray As Byte() = encoding.GetBytes(postData)   
  
            ' Set the ContentType property of the WebRequest.   
            'request.ContentType = "application/x-www-form-urlencoded"   
            request.ContentType = "multipart/form-data; boundary=" + Me.Boundary + vbCrLf + vbCrLf   
            ' Set the ContentLength property of the WebRequest.   
            request.ContentLength = byteArray.Length   
  
            ' Get the request stream.   
            Dim dataStream As Stream = request.GetRequestStream()   
            ' Write the data to the request stream.   
            dataStream.Write(byteArray, 0, byteArray.Length)   
            ' Close the Stream object.   
            dataStream.Close()   
  
            ' Get the response.   
            Dim response As WebResponse = request.GetResponse()   
            ' Display the status.   
            MsgBox(CType(response, HttpWebResponse).StatusDescription, MsgBoxStyle.Information, "Response Code")   
  
            ' Get the stream containing content returned by the server.   
            dataStream = response.GetResponseStream()   
  
            ' Open the stream using a StreamReader for easy access.   
            Dim reader As New StreamReader(dataStream)   
            ' Read the content.   
            Dim responseFromServer As String = reader.ReadToEnd()   
  
            ' Display the content.   
            txtResponse.Text = responseFromServer 'this textbox shows the response from the server   
  
            ' Clean up the streams.   
            reader.Close()   
            dataStream.Close()   
            response.Close()   
        Catch Ex As Exception   
            MsgBox(Ex.Message, MsgBoxStyle.Exclamation, "Error Encountered")   
        End Try

Here I tried to simulate the upload of a text file. When I tried this code the server alays return 404 (Resource not Found) even though the URL is correct. When the ContentType is changed to "application/x-www-form-urlencoded", i.e. no file upload but only transfer normal text fields, the server seems to accept the request and returns empty (unsucessful upload), which is correct. When I tried the above code (with content-type=multipart-formdata) against an ASP script put on my locahost:

VB.NET:
<%   
  
test1 = Request.Form("user[login]")   
test2 = Request.Form("user[password]")   
  
Response.Write(test1 + "<br>" + test2)   
  
%>

my script returns empty strings, which means the POST request generated by my VB code is malformed. But I cannot see what's wrong. I have compared it to the output of the following curl command

VB.NET:
curl -F user[login]=user01 -F user[password]=123456 -F
file=@myfile.txt http://www.readysnap.com/print/mup and everything is exactly the same.

Can anyone suggest what's wrong? Thanks. :)
 
Back
Top