Http POST multipart x-mmixed-replace - http-post

I am sending this request to the server:
POST /stream.php?K=pparam HTTP/1.0
Content-Type: multipart/form-data;boundary=MY_BOUNDARY_STRING_NOONE_HAS
Host: someweb.com
Content-Length:22182
--MY_BOUNDARY_STRING_NOONE_HAS
Content-Disposition: form-data; name="XXXXX16" filename="YYYYY17"
Content-Type: application/octet-stream
[IMAGE 22182 BUFFER]
--MY_BOUNDARY_STRING_NOONE_HAS
Content-Disposition: form-data; name="XXXXX12" filename="YYYYY13"
Content-Type: application/octet-stream
[IMAGE 22163 BUFFER]
--MY_BOUNDARY_STRING_NOONE_HAS
But at the server:
The php $_FILES is empty
Array
(
)
<?php
print_r($_FILES);
?>

The whole request should have the Accept: header
Now I am able to upload a camera stream
POST /stream.php?K=127.0.0.1_camera1 HTTP/1.1
Host: localhost
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Liveimage: camera1
Content-Type: multipart/form-data; boundary=212367691630846570233068106084
Content-Length:20209
Connection: keep-alive
--212367691630846570233068106084
Content-Disposition: form-data; name="file10"; filename="S11"
Content-Type: application/octet-stream
[IMAGE 20209]
boundary=--212367691630846570233068106084
Content-Disposition: form-data; name="file12"; filename="S13"
Content-Type: application/octet-stream
[IMAGE 20209]
boundary=--212367691630846570233068106084
RRRRRR POST
Content-Disposition: form-data; name="file14"; filename="S15"
Content-Type: application/octet-stream
[IMAGE 20209]
boundary=--212367691630846570233068106084

Related

In Jmeter, mandatory validation error is showing in response even though the key has correct values in the request

Request:
POST data:
--RSTXvNAvF6qiZc6NOcKWqw9HHxFBxbOOrs
Content-Disposition: form-data; name="ProjectUID"
Content-Type: form-data; charset=UTF-8
Content-Transfer-Encoding: 8bit
127
--RSTXvNAvF6qiZc6NOcKWqw9HHxFBxbOOrs
Content-Disposition: form-data; name="Customer"
Content-Type: form-data; charset=UTF-8
Content-Transfer-Encoding: 8bit
23
--RSTXvNAvF6qiZc6NOcKWqw9HHxFBxbOOrs
Content-Disposition: form-data; name="LoansInsertedVia"
Content-Type: form-data; charset=UTF-8
Content-Transfer-Encoding: 8bit
Single
--RSTXvNAvF6qiZc6NOcKWqw9HHxFBxbOOrs
Content-Disposition: form-data; name="LoanNumber"
Content-Type: form-data; charset=UTF-8
Content-Transfer-Encoding: 8bit
loan0106_3
--RSTXvNAvF6qiZc6NOcKWqw9HHxFBxbOOrs
Content-Disposition: form-data; name="ProductUID"
Content-Type: form-data; charset=UTF-8
Content-Transfer-Encoding: 8bit
8
Response:
{"validation_error":1,"message":" Please complete all mandatory fields","Customer":"This Field is required","LoanNumber":"This Field is required","Single-ProductUID":"This Field is required","Single-ProjectUID":"This Field is required"}
Try unticking Use multipart/form-data box in the HTTP Request sampler, it might be the case your server expects "normal" form-data parameters, not the multipart ones.
Also if you're capable of successfully executing your request with the browser you can just record it using JMeter's HTTP(S) Test Script Recorder or JMeter Chrome Extension

multiparts email in shell script

I have a problem with sending emails consisting of text/plain and text/html parts.
--AlternativeBoundaryString
Content-Type: text/plain;
Content-ID: <email.text/plain>
TEXT email
After sending the message only the HTML part is visible.
If I remove the HTML part and leave only the text/plain then the text part is sent correctly.
The attachments are sent correctly.
I would like to be able to send emails consisting of two parts: html and text with attachments.
Thanks in advance for your suggestions.
function createMail
{
local EMAIL
EMAIL=${1}
cat > ${MAIL_FILE} << EOF
From: ${MAIL_FROM}
To: ${EMAIL}
Cc: ${TO_RECIPIENTS_CC}
Bcc: ${TO_RECIPIENTS_BCC}
Subject: =?UTF-8?Q?${SUBJECT}?=
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="MixedBoundaryString"
--MixedBoundaryString
Content-Type: multipart/related; boundary="RelatedBoundaryString"
--RelatedBoundaryString
Content-Type: multipart/alternative; boundary="AlternativeBoundaryString"
--AlternativeBoundaryString
Content-Type: text/plain;
Content-ID: <email.text/plain>
**TEXT email**
--AlternativeBoundaryString
Content-Type: text/html;
Content-ID: <email.text/html>
<html>
<head>
</head>
<body>
<h1>Result</h1>
<p>HTML email</p>
<p><img border=0 width=1024 height=503 style='width:10.6666in;height:5.2416in' id=id.obrazek1 src="cid:id.obrazek1" alt="Opis: cid:id.obrazek1"></p>
</body>
</html>
--AlternativeBoundaryString--
--RelatedBoundaryString
Content-Type: image/jpeg; name=$(basename 'picture_png.png')
Content-Transfer-Encoding: uuencode
Content-ID: <id.obrazek1>
Content-Disposition: inline; filename="picture_png.png"
$(python -c 'import sys,uu; uu.encode("picture_png.png", sys.stdout)')
--RelatedBoundaryString--
--MixedBoundaryString
Content-Type: text/plain; name=$(basename 'test_log.log')
Content-Transfer-Encoding: uuencode
Content-Disposition: attachment; filename="test_log.log"
$(uuencode test_log.log test_log.log )
--MixedBoundaryString
Content-Type: text/plain; name=$(basename 'test_pdf.pdf')
Content-Transfer-Encoding: uuencode
Content-Disposition: attachment; filename="test_pdf.pdf"
$(python -c 'import sys,uu; uu.encode("test_pdf.pdf", sys.stdout)')
--MixedBoundaryString
Content-Type: application/vnd.ms-excel; name=$(basename 'test_excel.xlsx')
Content-Transfer-Encoding: uuencode
Content-Disposition: attachment; filename="test_excel.xlsx"
$(python -c 'import sys,uu; uu.encode("test_excel.xlsx", sys.stdout)')
--MixedBoundaryString--
EOF
}
function sendMail
{
cat ${MAIL_FILE} | /usr/sbin/sendmail -t
}

Getting Invalid CSRF Token while replaying the script

I am facing some weird problem while replaying my recorded script. I have correlated everything and for rest of the steps the CSRF token is working fine but for the below step its giving error for me.
The recorded script is:
web_add_header("X-CSRF-TOKEN",
"1f285aef-f9b1-4709-a76b-6789e785ca8a");
web_add_header("X-Requested-With",
"XMLHttpRequest");
lr_think_time(33);
web_custom_request("saveScheduleAcademyMapping",
"URL=http://localhost:8080/ams/saveScheduleAcademyMapping",
"Method=POST",
"Resource=0",
"RecContentType=application/json",
"Referer=http://localhost:8080/ams/manage_academy?scheduleInstanceId={scheduleID}",
"Snapshot=t1553.inf",
"Mode=HTTP",
"EncType=application/json; charset=UTF-8",
"Body=[{JSON values]",
LAST);
Below are the request and response while recording and replaying the script
For Recording
Request:
POST /ams/saveScheduleAcademyMapping HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 791
Accept: */*
Origin: http://localhost:8080
X-CSRF-TOKEN: 1f285aef-f9b1-4709-a76b-6789e785ca8a
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
Content-Type: application/json; charset=UTF-8
Referer: http://localhost:8080/ams/manage_academy?scheduleInstanceId=230044
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: JSESSIONID=B9C8BB02040E49246E1C7BA4CC16F6CF
[{JSON VALUE}]
Response:
HTTP/1.1 200
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
X-Application-Context: application:dev
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 25 Apr 2018 12:09:17 GMT
[{JSON VALUE}]
For Replay:
Request:
POST /ams/saveScheduleAcademyMapping HTTP/1.1
Content-Type: application/json; charset=UTF-8
Referer: http://localhost:8080/ams/manage_academy?scheduleInstanceId=230046
Origin: http://localhost:8080
X-CSRF-TOKEN: 1f285aef-f9b1-4709-a76b-6789e785ca8a
X-Requested-With: XMLHttpRequest
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Accept: */*
Connection: Keep-Alive
Host: localhost:8080
Cookie: JSESSIONID=E61AF0BA93B173F3D597244508FE11DD
Content-Length: 791
[{JSON VALUE}]
Response:
HTTP/1.1 403
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 25 Apr 2018 12:25:05 GMT
{"timestamp":"2018-04-25T12:25:05.690+0000","status":403,"error":"Forbidden","message":"Invalid CSRF Token '1f285aef-f9b1-4709-a76b-6789e785ca8a' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.","path":"/ams/saveScheduleAcademyMapping"}
Can anyone help me with this.
Its weird to answer my question itself but need to close it hence postintg it.
Just correlated one more time and added the lines in script like below and its working now. using web_reg_save_param_ex() function fetched the CSRF and used it.
web_add_header("X-CSRF-TOKEN",
"{CSRF}");
web_add_header("X-Requested-With",
"XMLHttpRequest");

How RESTTemplate Supports for Multipart/mixed in consumption

The REST service provider returns a media type of multipart/mixed and it has several boundaries such as application/xml and octstream. Which HttpMessageConverter could be used to satisfy this scenario.
POST: someUrl
Content-Type: multipart/mixed
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="meta-data"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit
{
"name": "value"
}
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="file-data"; filename="file.properties"
Content-Type: text/xml
Content-Transfer-Encoding: 8bit
... File Data ...
Thanks

Why does my multi part post request fail when sending from Marklogic instead of a browser form?

I am trying to send a multi part post request from my local Marklogic server using this xquery script:
xquery version "1.0-ml";
let $uri := "http://uri_to_service"
let $data :=
'------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="projectId"
1DBC9DEE-6B5D-0001-D76C-13F516502B00
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="language"
de
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Das ist ein Test.
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundaryq3PKI0zfbTv08rDu--
'
let $options :=
<options xmlns="xdmp:http">
<authentication method="basic">
<username>abc</username>
<password>123</password>
</authentication>
<data>{$data}</data>
<headers>
<Connection>keep-alive</Connection>
<Cache-Control>max-age=0</Cache-Control>
<Accept>text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8</Accept>
<Origin>null</Origin>
<User-Agent>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36</User-Agent>
<Content-Type>multipart/form-data; boundary=----WebKitFormBoundaryq3PKI0zfbTv08rDu</Content-Type>
<Accept-Encoding>gzip,deflate,sdch</Accept-Encoding>
<Accept-Language>en-US,en;q=0.8,de;q=0.6</Accept-Language>
</headers>
</options>
return
xdmp:http-post($uri, $options)
In Wireshark I see the following outgoing request:
POST /api/extract HTTP/1.1
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: null
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryq3PKI0zfbTv08rDu
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,de;q=0.6
From: admin#marcos-macbook-pro.local
Host: some_service_uri
Content-Length: 509
Authorization: Basic some_basic_code
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="projectId"
1DBC9DEE-6B5D-0001-D76C-13F516502B00
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="language"
de
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Das ist ein Test.
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundaryq3PKI0zfbTv08rDu--
HTTP/1.1 400 Bad Request
Server: nginx/1.6.1
Date: Fri, 22 Aug 2014 14:18:47 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 1246
Connection: keep-alive
Set-Cookie: JSESSIONID=B677A4E57DB4E8E8076EB4C9DD3E0AF4; Path=/extractor
<html><head><title>Apache Tomcat/6.0.36 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 400 - Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: Stream ended unexpectedly</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: Stream ended unexpectedly</u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/6.0.36</h3></body></html>
As you can see, the request is failing for some reason.
Then I tried the same request from Chrome Browser with a small html form.
<html>
<head>
<title>Test Form</title>
</head>
<body>
<form action="service_uri" method="post" enctype="multipart/form-data">
<input type="text" name="projectId" value="1DBC9DEE-6B5D-0001-D76C-13F516502B00">
<input type="text" name="language" value="de">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
The browser asks me for username/password and everything goes fine.
In Wireshark I can see:
POST /api/extract HTTP/1.1
Host: some_service_uri
Connection: keep-alive
Content-Length: 527
Cache-Control: max-age=0
Authorization: Basic some_basic_code
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: null
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryq3PKI0zfbTv08rDu
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,de;q=0.6
Cookie: JSESSIONID=469591D4A83F24BB77547B6C235F25B7
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="projectId"
1DBC9DEE-6B5D-0001-D76C-13F516502B00
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="language"
de
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Das ist ein Test.
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundaryq3PKI0zfbTv08rDu--
HTTP/1.1 200 OK
Server: nginx/1.6.1
Date: Fri, 22 Aug 2014 13:38:04 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
80
{"text":"Das ist ein Test.\n","metadata":{},"document":{"freeTerms":[{"textValue":"test","score":100,"frequencyInDocument":1}]}}
0
Why is my request failing when send from Marklogic? Based on the outgoing request (captured by Wireshark) I can find no difference, except Content-Length.
What is happening? Or what could be the reason? Could encoding change the Content-Length?
The server error was Stream ended unexpectedly so content-length seems like a good candidate: 527 vs 509.
Rather than writing your own multipart code, have you tried this library? https://github.com/ableasdale/consultant-tools/blob/da92815e1322fe8e479ba2ba3741857670498c2a/src/main/resources/modules/example/lib-multipart-post.xqy
One key difference is that it uses https://docs.marklogic.com/xdmp:multipart-encode

Resources