Allows `requestInterceptor` to add options to the curl command.
For example:
```js
requestInterceptor: function (request) {
if (request.method === 'GET') {
request.curlOptions = ['-g']
request.url = request.url
.replace('%5B', '[')
.replace('%5D', ']')
.replace('%2C', ',');
}
return request;
}
```
76 lines
2.4 KiB
JavaScript
76 lines
2.4 KiB
JavaScript
import win from "./window"
|
|
import { Map } from "immutable"
|
|
|
|
/**
|
|
* if duplicate key name existed from FormData entries,
|
|
* we mutated the key name by appending a hashIdx
|
|
* @param {String} k - possibly mutated key name
|
|
* @return {String} - src key name
|
|
*/
|
|
const extractKey = (k) => {
|
|
const hashIdx = "_**[]"
|
|
if (k.indexOf(hashIdx) < 0) {
|
|
return k
|
|
}
|
|
return k.split(hashIdx)[0].trim()
|
|
}
|
|
|
|
export default function curl( request ){
|
|
let curlified = []
|
|
let isMultipartFormDataRequest = false
|
|
let headers = request.get("headers")
|
|
curlified.push( "curl" )
|
|
|
|
if (request.get("curlOptions")) {
|
|
curlified.push(...request.get("curlOptions"))
|
|
}
|
|
|
|
curlified.push( "-X", request.get("method") )
|
|
curlified.push( `"${request.get("url")}"`)
|
|
|
|
if ( headers && headers.size ) {
|
|
for( let p of request.get("headers").entries() ){
|
|
let [ h,v ] = p
|
|
curlified.push( "-H " )
|
|
curlified.push( `"${h}: ${v.replace(/\$/g, "\\$")}"` )
|
|
isMultipartFormDataRequest = isMultipartFormDataRequest || /^content-type$/i.test(h) && /^multipart\/form-data$/i.test(v)
|
|
}
|
|
}
|
|
|
|
if ( request.get("body") ){
|
|
if (isMultipartFormDataRequest && ["POST", "PUT", "PATCH"].includes(request.get("method"))) {
|
|
for( let [ k,v ] of request.get("body").entrySeq()) {
|
|
let extractedKey = extractKey(k)
|
|
curlified.push( "-F" )
|
|
if (v instanceof win.File) {
|
|
curlified.push(`"${extractedKey}=@${v.name}${v.type ? `;type=${v.type}` : ""}"` )
|
|
} else {
|
|
curlified.push(`"${extractedKey}=${v}"` )
|
|
}
|
|
}
|
|
} else {
|
|
curlified.push( "-d" )
|
|
let reqBody = request.get("body")
|
|
if (!Map.isMap(reqBody)) {
|
|
curlified.push( JSON.stringify( request.get("body") ).replace(/\\n/g, "").replace(/\$/g, "\\$") )
|
|
} else {
|
|
let curlifyToJoin = []
|
|
for (let [k, v] of request.get("body").entrySeq()) {
|
|
let extractedKey = extractKey(k)
|
|
if (v instanceof win.File) {
|
|
curlifyToJoin.push(`"${extractedKey}":{"name":"${v.name}"${v.type ? `,"type":"${v.type}"` : ""}}`)
|
|
} else {
|
|
curlifyToJoin.push(`"${extractedKey}":${JSON.stringify(v).replace(/\\n/g, "").replace("$", "\\$")}`)
|
|
}
|
|
}
|
|
curlified.push(`{${curlifyToJoin.join()}}`)
|
|
}
|
|
}
|
|
} else if(!request.get("body") && request.get("method") === "POST") {
|
|
curlified.push( "-d" )
|
|
curlified.push( "\"\"" )
|
|
}
|
|
|
|
return curlified.join( " " )
|
|
}
|