Hi
From VB.NET I want to simulate the POST request of the following HTML form
The target URL would return "OK" for successful upload and empty otherwise.
My code to generate the POST request is as followed:
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:
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
Can anyone suggest what's wrong? Thanks.
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.