| import last from 'licia/last' |
| import detectOs from 'licia/detectOs' |
| import arrToMap from 'licia/arrToMap' |
|
|
| export function getType(contentType) { |
| if (!contentType) return 'unknown' |
|
|
| const type = contentType.split(';')[0].split('/') |
|
|
| return { |
| type: type[0], |
| subType: last(type), |
| } |
| } |
|
|
| export function curlStr(request) { |
| let platform = detectOs() |
| if (platform === 'windows') { |
| platform = 'win' |
| } |
| let command = [] |
| const ignoredHeaders = arrToMap([ |
| 'accept-encoding', |
| 'host', |
| 'method', |
| 'path', |
| 'scheme', |
| 'version', |
| ]) |
|
|
| function escapeStringWin(str) { |
| const encapsChars = /[\r\n]/.test(str) ? '^"' : '"' |
| return ( |
| encapsChars + |
| str |
| .replace(/\\/g, '\\\\') |
| .replace(/"/g, '\\"') |
| .replace(/[^a-zA-Z0-9\s_\-:=+~'/.',?;()*`&]/g, '^$&') |
| .replace(/%(?=[a-zA-Z0-9_])/g, '%^') |
| .replace(/\r?\n/g, '^\n\n') + |
| encapsChars |
| ) |
| } |
|
|
| function escapeStringPosix(str) { |
| function escapeCharacter(x) { |
| const code = x.charCodeAt(0) |
| let hexString = code.toString(16) |
| while (hexString.length < 4) { |
| hexString = '0' + hexString |
| } |
|
|
| return '\\u' + hexString |
| } |
|
|
| |
| if (/[\0-\x1F\x7F-\x9F!]|'/.test(str)) { |
| return ( |
| "$'" + |
| str |
| .replace(/\\/g, '\\\\') |
| .replace(/'/g, "\\'") |
| .replace(/\n/g, '\\n') |
| .replace(/\r/g, '\\r') |
| |
| .replace(/[\0-\x1F\x7F-\x9F!]/g, escapeCharacter) + |
| "'" |
| ) |
| } |
| return "'" + str + "'" |
| } |
|
|
| const escapeString = platform === 'win' ? escapeStringWin : escapeStringPosix |
|
|
| command.push(escapeString(request.url()).replace(/[[{}\]]/g, '\\$&')) |
|
|
| let inferredMethod = 'GET' |
| const data = [] |
| const formData = request.requestFormData() |
| if (formData) { |
| data.push('--data-raw ' + escapeString(formData)) |
| ignoredHeaders['content-length'] = true |
| inferredMethod = 'POST' |
| } |
|
|
| if (request.requestMethod !== inferredMethod) { |
| command.push('-X ' + escapeString(request.requestMethod)) |
| } |
|
|
| const requestHeaders = request.requestHeaders() |
| for (let i = 0; i < requestHeaders.length; i++) { |
| const header = requestHeaders[i] |
| const name = header.name.replace(/^:/, '') |
| if (ignoredHeaders[name.toLowerCase()]) { |
| continue |
| } |
| command.push('-H ' + escapeString(name + ': ' + header.value)) |
| } |
| command = command.concat(data) |
| command.push('--compressed') |
|
|
| return ( |
| 'curl ' + |
| command.join( |
| command.length >= 3 ? (platform === 'win' ? ' ^\n ' : ' \\\n ') : ' ' |
| ) |
| ) |
| } |
|
|