File size: 2,681 Bytes
271613e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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
    }

    // eslint-disable-next-line no-control-regex
    if (/[\0-\x1F\x7F-\x9F!]|'/.test(str)) {
      return (
        "$'" +
        str
          .replace(/\\/g, '\\\\')
          .replace(/'/g, "\\'")
          .replace(/\n/g, '\\n')
          .replace(/\r/g, '\\r')
          // eslint-disable-next-line no-control-regex
          .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  ') : ' '
    )
  )
}