-
Notifications
You must be signed in to change notification settings - Fork 3
/
parse-curl.js
126 lines (106 loc) · 3.33 KB
/
parse-curl.js
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// TODO -F, --form
// TODO --data-binary
// TODO --data-urlencode
// TODO -r, --range
/**
* Attempt to parse the given curl string.
*/
module.exports = exports.default = function (s) {
var out = { method: 'GET', header: {} }
var args = rewrite(s)
var state = ''
rewrite(args)
args.forEach(function (arg) {
switch (true) {
case isURL(arg):
out.url = arg
out.protocol = arg.split(':')[0]
break;
case arg == '-A' || arg == '--user-agent':
state = 'user-agent'
break;
case arg == '-H' || arg == '--header':
state = 'header'
break;
case arg == '-d' || arg == '--data' || arg == '--data-ascii':
state = 'data'
break;
case arg == '-u' || arg == '--user':
state = 'user'
break;
case arg == '-I' || arg == '--head':
out.method = 'HEAD'
break;
case arg == '-X' || arg == '--request':
state = 'method'
break;
case arg == '-b' || arg == '--cookie':
state = 'cookie'
break;
case arg == '--compressed':
out.header['Accept-Encoding'] = out.header['Accept-Encoding'] || 'deflate, gzip'
break;
case !!arg:
switch (state) {
case 'header':
var field = parseField(arg)
out.header[field[0]] = field[1]
state = ''
break;
case 'user-agent':
out.header['User-Agent'] = arg
state = ''
break;
case 'data':
if (out.method == 'GET' || out.method == 'HEAD') out.method = 'POST'
out.header['Content-Type'] = out.header['Content-Type'] || 'application/x-www-form-urlencoded'
out.body = out.body
? out.body + '&' + arg
: arg
state = ''
break;
case 'user':
out.header['Authorization'] = 'Basic ' + btoa(arg)
state = ''
break;
case 'method':
out.method = arg
state = ''
break;
case 'cookie':
out.header['Set-Cookie'] = arg
state = ''
break;
}
break;
}
})
return out
}
/**
* Rewrite args for special cases such as -XPUT.
*/
function rewrite (args) {
return args.reduce(function (args, a) {
if (0 == a.indexOf('-X')) {
args.push('-X')
args.push(a.slice(2))
} else {
args.push(a)
}
return args
}, [])
}
/**
* Parse header field.
*/
function parseField (s) {
return s.split(/: (.+)/)
}
/**
* Check if `s` looks like a url.
*/
function isURL (s) {
// TODO: others at some point
return /(^https?|ipns|ipfs|dat|hyper|gemini):\/\//.test(s)
}