wqweto / VbAsyncSocket

Sockets with pure VB6 impl of TLS encryption
MIT License
164 stars 31 forks source link

Issue with Sending File over Form Data #43

Open mskhaled opened 3 months ago

mskhaled commented 3 months ago

I'm encountering an issue while attempting to send a file over form data in VB6 using cHTTPRequest. I'm trying to replicate a cURL request that uploads a document to an API endpoint. The cURL command works as expected, but I'm having trouble achieving the same functionality

curl --location --request POST "https://api.mindee.net/v1/products/mindee/invoices/v4/predict" \
--header 'Authorization: Token fd1e97c821b43579a93b571d95aec10d' \
--form 'document=@"/D:/Bon de Livraison.pdf"'
Dim urlText As String
urlText = "https://api.mindee.net/v1/products/mindee/invoices/v4/predict"

With myRequest
    .SetRequestHeader "Authorization", "Token <API TOKEN>"
    .SetRequestHeader "Content-Type", "multipart/form-data"
    .Open "POST", urlText, False
    .Send "document=@" & Chr(34) & "/D:/Bon de Livraison.pdf" & Chr(34)
End With

I would appreciate any insights or suggestions on how to correctly send a file over form data in VB6 using cHTTPRequest. Thank you for your assistance!

wqweto commented 3 months ago

I would appreciate any insights or suggestions on how to correctly send a file over form data in VB6 using cHTTPRequest.

It's the same way when using WinHttpRequest. You have to prepare request body you pass to Send method to include your binary file as part of multipart/form-data form values as specified in RFC 7578.

Currently you are emulating curl parameters but this is not how POST web requests work because curl translates its parameters to RFC compliant web requests while with WinHttpRequest/cHttpRequest you have to do this manually (i.e. load the binary file, format request boundaries, etc.)

Here is a sample in VB6 how to prepare request body in multipart/form-data format: Using WinInet to post binary file