1
- const normalize = args => {
2
- const shortMap = {
3
- X : 'request' ,
4
- A : 'user-agent' ,
5
- e : 'referer' ,
6
- G : 'get' ,
7
- F : 'form' ,
8
- H : 'header' ,
9
- d : 'data' ,
10
- }
11
-
12
- const result = [ ]
13
-
14
- args . forEach ( ( item , index ) => {
15
- if ( isURL ( item ) ) {
16
- result . push ( '--url' , item )
17
- } else if ( item . length > 1 && item [ 0 ] === '-' && item [ 1 ] !== '-' ) {
18
- result . push ( `--${ shortMap [ item . substring ( 1 ) ] } ` )
19
- } else if ( / ^ [ \' \" ] ( .* \s * ) * [ \' \" ] $ / . test ( item ) ) {
20
- result . push ( item . slice ( 1 , - 1 ) )
21
- } else {
22
- result . push ( item )
23
- }
24
- } )
25
-
26
- return result
27
- }
28
-
29
- const parseOptions = args => {
30
- const result = { }
31
- let lastOption = ''
32
-
33
- args . forEach ( item => {
34
- if ( / ^ - - / . test ( item ) ) {
35
- lastOption = item . substring ( 2 )
36
- } else if ( parametersSupportingMultipleValues . includes ( lastOption ) ) {
37
- if ( ! result [ lastOption ] ) {
38
- result [ lastOption ] = [ ]
39
- }
40
-
41
- result [ lastOption ] . push ( item )
42
- } else {
43
- result [ lastOption ] = item
44
- }
45
- } )
46
-
47
- return result
48
- }
49
-
50
- export const parametersSupportingMultipleValues = [ 'header' ]
1
+ import { isJSON , isQueryString , parseQueryString } from './utils'
51
2
52
- export function isCURL ( cmd ) {
53
- return cmd . startsWith ( 'curl' )
3
+ const parseField = ( s ) => {
4
+ return s . split ( / : ( . + ) / )
54
5
}
55
6
56
7
export function isURL ( url ) {
@@ -63,22 +14,114 @@ export function isURL(url) {
63
14
return urlRegexp . test ( url ) || localhost . test ( url )
64
15
}
65
16
66
- export function resolveArgs ( cmd ) {
67
- const rawArgs = cmd . substring ( 5 )
68
- const argsList = rawArgs
69
- . match ( / " [ ^ " ] + " | ' [ ^ ' ] + ' | \S + / g)
70
- . filter ( item => item . trim ( ) !== '\\' )
71
-
72
- return parseOptions ( normalize ( argsList ) )
17
+ export function isCURL ( cmd ) {
18
+ return cmd . startsWith ( 'curl ' )
73
19
}
74
20
75
- export function resolveHeaders ( headers ) {
76
- const result = { }
21
+ export default function curl ( cmd ) {
22
+ if ( ! isCURL ( cmd ) ) return
23
+
24
+ const args = cmd
25
+ . match ( / " [ ^ " ] + " | ' [ ^ ' ] + ' | \S + / g)
26
+ . filter ( item => item . trim ( ) !== '\\' )
77
27
78
- headers . forEach ( item => {
79
- const [ attr , value ] = item . split ( ':' )
28
+ const result = {
29
+ method : 'GET' ,
30
+ headers : { } ,
31
+ }
80
32
81
- result [ attr . trim ( ) ] = value . trim ( )
33
+ let state = ''
34
+
35
+ args . forEach ( function ( arg ) {
36
+ switch ( true ) {
37
+ case isURL ( arg ) :
38
+ result . url = arg
39
+ break ;
40
+
41
+ case arg == '-A' || arg == '--user-agent' :
42
+ state = 'user-agent'
43
+ break ;
44
+
45
+ case arg == '-H' || arg == '--header' :
46
+ state = 'header'
47
+ break ;
48
+
49
+ case arg == '-d' || arg == '--data' || arg == '--data-ascii' :
50
+ state = 'data'
51
+ break ;
52
+
53
+ case arg == '-u' || arg == '--user' :
54
+ state = 'user'
55
+ break ;
56
+
57
+ case arg == '-I' || arg == '--head' :
58
+ result . method = 'HEAD'
59
+ break ;
60
+
61
+ case arg == '-X' || arg == '--request' :
62
+ state = 'method'
63
+ break ;
64
+
65
+ case arg == '-b' || arg == '--cookie' :
66
+ state = 'cookie'
67
+ break ;
68
+
69
+ case arg == '--compressed' :
70
+ result . headers [ 'Accept-Encoding' ] = result . headers [ 'Accept-Encoding' ] || 'deflate, gzip'
71
+ break ;
72
+
73
+ case ! ! arg :
74
+ // Delete the start position and the end of the quotation mark
75
+ if ( / ^ [ ' " ] / . test ( arg ) ) {
76
+ arg = arg . slice ( 1 , - 1 )
77
+ }
78
+
79
+ switch ( state ) {
80
+ case 'header' :
81
+ var field = parseField ( arg )
82
+ result . headers [ field [ 0 ] ] = field [ 1 ]
83
+ state = ''
84
+ break ;
85
+ case 'user-agent' :
86
+ result . headers [ 'User-Agent' ] = arg
87
+ state = ''
88
+ break ;
89
+ case 'data' :
90
+ if ( result . method . toUpperCase ( ) === 'GET' || result . method . toUpperCase ( ) === 'HEAD' ) {
91
+ result . method = 'POST'
92
+ }
93
+
94
+ result . headers [ 'Content-Type' ] = result . headers [ 'Content-Type' ] || 'application/json'
95
+
96
+ if ( isJSON ( arg ) ) {
97
+ const data = JSON . parse ( arg )
98
+
99
+ result . data = result . data
100
+ ? Object . assign ( result . data , data )
101
+ : data
102
+ } else if ( isQueryString ( arg ) ) {
103
+ result . data = result . data
104
+ ? result . data + '&' + arg
105
+ : arg
106
+ }
107
+
108
+ state = ''
109
+ break ;
110
+ case 'user' :
111
+ result . headers [ 'Authorization' ] = 'Basic ' + btoa ( arg )
112
+ state = ''
113
+ break ;
114
+ case 'method' :
115
+ result . method = arg . toLowerCase ( )
116
+ state = ''
117
+ break ;
118
+ case 'cookie' :
119
+ result . headers [ 'Set-Cookie' ] = arg
120
+ state = ''
121
+ break ;
122
+ }
123
+ break ;
124
+ }
82
125
} )
83
126
84
127
return result
0 commit comments