Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Post Method + WinHttpRequest + multipart/form-data

I'm stumped why this doesn't work can't seem to find any problems.

Here is the code.

Public Const MULTIPART_BOUNDARY = "speed"
Function getBalance() As String
Dim sEntityBody As String
Dim postBody() As Byte
Dim username As String
Dim password As String

username = CStr(frmMain.txtUser.text)
password = CStr(frmMain.txtPass.text)

sEntityBody = "--" & MULTIPART_BOUNDARY & vbCrLf
sEntityBody = sEntityBody & "Content-Disposition: form-data; name=""function""" & vbCrLf & vbCrLf & "balance" & vbCrLf
sEntityBody = sEntityBody & "--" & MULTIPART_BOUNDARY & vbCrLf
sEntityBody = sEntityBody & "Content-Disposition: form-data; name=""username""" & vbCrLf & vbCrLf & username & vbCrLf
sEntityBody = sEntityBody & "--" & MULTIPART_BOUNDARY & vbCrLf
sEntityBody = sEntityBody & "Content-Disposition: form-data; name=""password""" & vbCrLf & vbCrLf & password & vbCrLf
sEntityBody = sEntityBody & "--" & MULTIPART_BOUNDARY & "--" & vbCrLf

postBody = StrConv(sEntityBody, vbFromUnicode)

Dim xhr As Object
Set xhr = CreateObject("WinHttp.WinHttpRequest.5.1")
xhr.Option(WinHttpRequestOption_EnableRedirects) = False
If xhr Is Nothing Then Set xhr = CreateObject("WinHttp.WinHttpRequest")
If xhr Is Nothing Then Set xhr = CreateObject("MSXML2.ServerXMLHTTP")
If xhr Is Nothing Then Set xhr = CreateObject("Microsoft.XMLHTTP")
xhr.open "POST", "http://poster.example.com", False

xhr.setRequestHeader "User-Agent", "Alalala"
xhr.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & MULTIPART_BOUNDARY
xhr.setRequestHeader "Content-Length", Len(sEntityBody)
xhr.send "" + sEntityBody 'postBody 'URLEncode(sEntityBody)

    If xhr.Status = 200 Then
        getBalance = xhr.responseText
    Else
        frmMain.addToChatbox "Failed at getting response from blah ErrCode:" & xhr.Status
    End If
End Function

Now this below works (although it's just a HTML FORM).

<form 
 method="post" 
 action="http://poster.example.com/" 
 enctype="multipart/form-data">
 <input type="hidden" name="function" value="balance">
 <input type="text"   name="username" value="blah">
 <input type="text"   name="password" value="blah">
 <input type="submit" value="Send">
</form>

Here is a packet sniff. (Altered the host etc to example after)

POST / HTTP/1.1..User-Agent: Alalala..Content-Type: multipart/form-data; boundary=speed..Content-Length: 233..Accept: /..Host: poster.example.com..Connection: Keep-Alive....--speed..Content-Dispostion: form-data; name="function"....balance..--speed..Content-Dispostion: form-data; name="username"....blah..--speed..Content-Dispostion: form-data; name="password"....blah..--speed--..

response is empty

HTTP/1.1 200 OK..Date: Thu, 07 Oct 2010 20:31:20 GMT..Server: Apache..Content-Length: 0..Connection: close..Content-Type: text/html; charset=UTF-8....

P.S.> The submit button with value Send doesn't have to be sent so thats not it if anyone is wondering. What it could be and i've noticed from sniffing is that it sends the header + post data (upload data) as one packet and firefox/chrome sends it as 2 seperate packets.

Thank you

like image 616
SSpoke Avatar asked Oct 07 '10 20:10

SSpoke


1 Answers

Mis-spelled Content-Dispostion has to be Content-Disposition yup thanks to that i've been suffering for 6? maybe 7 hours.

solved finally

like image 115
SSpoke Avatar answered Sep 28 '22 01:09

SSpoke