@ohos-ports/curlconverter 4.12.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/src/Headers.d.ts +23 -0
- package/dist/src/Headers.js +287 -0
- package/dist/src/Headers.js.map +1 -0
- package/dist/src/Query.d.ts +8 -0
- package/dist/src/Query.js +136 -0
- package/dist/src/Query.js.map +1 -0
- package/dist/src/Request.d.ts +200 -0
- package/dist/src/Request.js +1191 -0
- package/dist/src/Request.js.map +1 -0
- package/dist/src/Warnings.d.ts +15 -0
- package/dist/src/Warnings.js +111 -0
- package/dist/src/Warnings.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +333 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/curl/auth.d.ts +12 -0
- package/dist/src/curl/auth.js +40 -0
- package/dist/src/curl/auth.js.map +1 -0
- package/dist/src/curl/form.d.ts +28 -0
- package/dist/src/curl/form.js +218 -0
- package/dist/src/curl/form.js.map +1 -0
- package/dist/src/curl/opts.d.ts +2052 -0
- package/dist/src/curl/opts.js +1000 -0
- package/dist/src/curl/opts.js.map +1 -0
- package/dist/src/curl/url.d.ts +14 -0
- package/dist/src/curl/url.js +218 -0
- package/dist/src/curl/url.js.map +1 -0
- package/dist/src/generators/ansible.d.ts +5 -0
- package/dist/src/generators/ansible.js +282 -0
- package/dist/src/generators/ansible.js.map +1 -0
- package/dist/src/generators/c.d.ts +12 -0
- package/dist/src/generators/c.js +1230 -0
- package/dist/src/generators/c.js.map +1 -0
- package/dist/src/generators/cfml.d.ts +5 -0
- package/dist/src/generators/cfml.js +134 -0
- package/dist/src/generators/cfml.js.map +1 -0
- package/dist/src/generators/clojure.d.ts +7 -0
- package/dist/src/generators/clojure.js +436 -0
- package/dist/src/generators/clojure.js.map +1 -0
- package/dist/src/generators/csharp.d.ts +8 -0
- package/dist/src/generators/csharp.js +356 -0
- package/dist/src/generators/csharp.js.map +1 -0
- package/dist/src/generators/dart.d.ts +5 -0
- package/dist/src/generators/dart.js +273 -0
- package/dist/src/generators/dart.js.map +1 -0
- package/dist/src/generators/elixir.d.ts +8 -0
- package/dist/src/generators/elixir.js +296 -0
- package/dist/src/generators/elixir.js.map +1 -0
- package/dist/src/generators/go.d.ts +5 -0
- package/dist/src/generators/go.js +228 -0
- package/dist/src/generators/go.js.map +1 -0
- package/dist/src/generators/har.d.ts +7 -0
- package/dist/src/generators/har.js +115 -0
- package/dist/src/generators/har.js.map +1 -0
- package/dist/src/generators/http.d.ts +7 -0
- package/dist/src/generators/http.js +165 -0
- package/dist/src/generators/http.js.map +1 -0
- package/dist/src/generators/httpie.d.ts +5 -0
- package/dist/src/generators/httpie.js +446 -0
- package/dist/src/generators/httpie.js.map +1 -0
- package/dist/src/generators/java/httpurlconnection.d.ts +5 -0
- package/dist/src/generators/java/httpurlconnection.js +123 -0
- package/dist/src/generators/java/httpurlconnection.js.map +1 -0
- package/dist/src/generators/java/java.d.ts +8 -0
- package/dist/src/generators/java/java.js +247 -0
- package/dist/src/generators/java/java.js.map +1 -0
- package/dist/src/generators/java/jsoup.d.ts +5 -0
- package/dist/src/generators/java/jsoup.js +152 -0
- package/dist/src/generators/java/jsoup.js.map +1 -0
- package/dist/src/generators/java/okhttp.d.ts +5 -0
- package/dist/src/generators/java/okhttp.js +232 -0
- package/dist/src/generators/java/okhttp.js.map +1 -0
- package/dist/src/generators/javascript/axios.d.ts +5 -0
- package/dist/src/generators/javascript/axios.js +332 -0
- package/dist/src/generators/javascript/axios.js.map +1 -0
- package/dist/src/generators/javascript/got.d.ts +5 -0
- package/dist/src/generators/javascript/got.js +277 -0
- package/dist/src/generators/javascript/got.js.map +1 -0
- package/dist/src/generators/javascript/http.d.ts +8 -0
- package/dist/src/generators/javascript/http.js +183 -0
- package/dist/src/generators/javascript/http.js.map +1 -0
- package/dist/src/generators/javascript/javascript.d.ts +37 -0
- package/dist/src/generators/javascript/javascript.js +676 -0
- package/dist/src/generators/javascript/javascript.js.map +1 -0
- package/dist/src/generators/javascript/jquery.d.ts +15 -0
- package/dist/src/generators/javascript/jquery.js +297 -0
- package/dist/src/generators/javascript/jquery.js.map +1 -0
- package/dist/src/generators/javascript/ky.d.ts +7 -0
- package/dist/src/generators/javascript/ky.js +245 -0
- package/dist/src/generators/javascript/ky.js.map +1 -0
- package/dist/src/generators/javascript/request.d.ts +5 -0
- package/dist/src/generators/javascript/request.js +113 -0
- package/dist/src/generators/javascript/request.js.map +1 -0
- package/dist/src/generators/javascript/superagent.d.ts +10 -0
- package/dist/src/generators/javascript/superagent.js +301 -0
- package/dist/src/generators/javascript/superagent.js.map +1 -0
- package/dist/src/generators/javascript/xhr.d.ts +8 -0
- package/dist/src/generators/javascript/xhr.js +147 -0
- package/dist/src/generators/javascript/xhr.js.map +1 -0
- package/dist/src/generators/json.d.ts +45 -0
- package/dist/src/generators/json.js +197 -0
- package/dist/src/generators/json.js.map +1 -0
- package/dist/src/generators/julia.d.ts +8 -0
- package/dist/src/generators/julia.js +365 -0
- package/dist/src/generators/julia.js.map +1 -0
- package/dist/src/generators/kotlin.d.ts +8 -0
- package/dist/src/generators/kotlin.js +325 -0
- package/dist/src/generators/kotlin.js.map +1 -0
- package/dist/src/generators/lua.d.ts +5 -0
- package/dist/src/generators/lua.js +192 -0
- package/dist/src/generators/lua.js.map +1 -0
- package/dist/src/generators/matlab/common.d.ts +16 -0
- package/dist/src/generators/matlab/common.js +238 -0
- package/dist/src/generators/matlab/common.js.map +1 -0
- package/dist/src/generators/matlab/httpinterface.d.ts +2 -0
- package/dist/src/generators/matlab/httpinterface.js +211 -0
- package/dist/src/generators/matlab/httpinterface.js.map +1 -0
- package/dist/src/generators/matlab/matlab.d.ts +5 -0
- package/dist/src/generators/matlab/matlab.js +29 -0
- package/dist/src/generators/matlab/matlab.js.map +1 -0
- package/dist/src/generators/matlab/webservices.d.ts +2 -0
- package/dist/src/generators/matlab/webservices.js +191 -0
- package/dist/src/generators/matlab/webservices.js.map +1 -0
- package/dist/src/generators/objectivec.d.ts +8 -0
- package/dist/src/generators/objectivec.js +269 -0
- package/dist/src/generators/objectivec.js.map +1 -0
- package/dist/src/generators/ocaml.d.ts +8 -0
- package/dist/src/generators/ocaml.js +150 -0
- package/dist/src/generators/ocaml.js.map +1 -0
- package/dist/src/generators/perl.d.ts +9 -0
- package/dist/src/generators/perl.js +209 -0
- package/dist/src/generators/perl.js.map +1 -0
- package/dist/src/generators/php/guzzle.d.ts +5 -0
- package/dist/src/generators/php/guzzle.js +328 -0
- package/dist/src/generators/php/guzzle.js.map +1 -0
- package/dist/src/generators/php/php.d.ts +8 -0
- package/dist/src/generators/php/php.js +217 -0
- package/dist/src/generators/php/php.js.map +1 -0
- package/dist/src/generators/php/requests.d.ts +5 -0
- package/dist/src/generators/php/requests.js +89 -0
- package/dist/src/generators/php/requests.js.map +1 -0
- package/dist/src/generators/powershell.d.ts +11 -0
- package/dist/src/generators/powershell.js +377 -0
- package/dist/src/generators/powershell.js.map +1 -0
- package/dist/src/generators/python/http.d.ts +5 -0
- package/dist/src/generators/python/http.js +128 -0
- package/dist/src/generators/python/http.js.map +1 -0
- package/dist/src/generators/python/python.d.ts +22 -0
- package/dist/src/generators/python/python.js +1693 -0
- package/dist/src/generators/python/python.js.map +1 -0
- package/dist/src/generators/r/httr.d.ts +10 -0
- package/dist/src/generators/r/httr.js +298 -0
- package/dist/src/generators/r/httr.js.map +1 -0
- package/dist/src/generators/r/httr2.d.ts +5 -0
- package/dist/src/generators/r/httr2.js +214 -0
- package/dist/src/generators/r/httr2.js.map +1 -0
- package/dist/src/generators/ruby/httparty.d.ts +6 -0
- package/dist/src/generators/ruby/httparty.js +308 -0
- package/dist/src/generators/ruby/httparty.js.map +1 -0
- package/dist/src/generators/ruby/ruby.d.ts +14 -0
- package/dist/src/generators/ruby/ruby.js +515 -0
- package/dist/src/generators/ruby/ruby.js.map +1 -0
- package/dist/src/generators/rust.d.ts +8 -0
- package/dist/src/generators/rust.js +177 -0
- package/dist/src/generators/rust.js.map +1 -0
- package/dist/src/generators/swift.d.ts +8 -0
- package/dist/src/generators/swift.js +219 -0
- package/dist/src/generators/swift.js.map +1 -0
- package/dist/src/generators/wget.d.ts +8 -0
- package/dist/src/generators/wget.js +472 -0
- package/dist/src/generators/wget.js.map +1 -0
- package/dist/src/index.d.ts +53 -0
- package/dist/src/index.js +54 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/parse.d.ts +13 -0
- package/dist/src/parse.js +43 -0
- package/dist/src/parse.js.map +1 -0
- package/dist/src/shell/Parser.d.ts +4 -0
- package/dist/src/shell/Parser.js +6 -0
- package/dist/src/shell/Parser.js.map +1 -0
- package/dist/src/shell/Word.d.ts +48 -0
- package/dist/src/shell/Word.js +486 -0
- package/dist/src/shell/Word.js.map +1 -0
- package/dist/src/shell/tokenizer.d.ts +3 -0
- package/dist/src/shell/tokenizer.js +610 -0
- package/dist/src/shell/tokenizer.js.map +1 -0
- package/dist/src/shell/webParser.d.ts +4 -0
- package/dist/src/shell/webParser.js +15 -0
- package/dist/src/shell/webParser.js.map +1 -0
- package/dist/src/utils.d.ts +6 -0
- package/dist/src/utils.js +21 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/tools/compare-requests.d.ts +2 -0
- package/dist/tools/compare-requests.js +448 -0
- package/dist/tools/compare-requests.js.map +1 -0
- package/dist/tools/gen-test.d.ts +2 -0
- package/dist/tools/gen-test.js +114 -0
- package/dist/tools/gen-test.js.map +1 -0
- package/dist/tree-sitter-bash.wasm +0 -0
- package/index.d.ts +3 -0
- package/package.json +97 -0
- package/src/Headers.ts +334 -0
- package/src/Query.ts +147 -0
- package/src/Request.ts +1649 -0
- package/src/Warnings.ts +154 -0
- package/src/cli.ts +561 -0
- package/src/curl/auth.ts +45 -0
- package/src/curl/form.ts +297 -0
- package/src/curl/opts.ts +1417 -0
- package/src/curl/url.ts +241 -0
- package/src/generators/ansible.ts +364 -0
- package/src/generators/c.ts +1371 -0
- package/src/generators/cfml.ts +155 -0
- package/src/generators/clojure.ts +521 -0
- package/src/generators/csharp.ts +383 -0
- package/src/generators/dart.ts +293 -0
- package/src/generators/elixir.ts +349 -0
- package/src/generators/go.ts +269 -0
- package/src/generators/har.ts +147 -0
- package/src/generators/http.ts +194 -0
- package/src/generators/httpie.ts +506 -0
- package/src/generators/java/httpurlconnection.ts +151 -0
- package/src/generators/java/java.ts +280 -0
- package/src/generators/java/jsoup.ts +172 -0
- package/src/generators/java/okhttp.ts +257 -0
- package/src/generators/javascript/axios.ts +395 -0
- package/src/generators/javascript/got.ts +362 -0
- package/src/generators/javascript/http.ts +232 -0
- package/src/generators/javascript/javascript.ts +825 -0
- package/src/generators/javascript/jquery.ts +360 -0
- package/src/generators/javascript/ky.ts +315 -0
- package/src/generators/javascript/request.ts +152 -0
- package/src/generators/javascript/superagent.ts +373 -0
- package/src/generators/javascript/xhr.ts +192 -0
- package/src/generators/json.ts +293 -0
- package/src/generators/julia.ts +398 -0
- package/src/generators/kotlin.ts +355 -0
- package/src/generators/lua.ts +209 -0
- package/src/generators/matlab/common.ts +281 -0
- package/src/generators/matlab/httpinterface.ts +284 -0
- package/src/generators/matlab/matlab.ts +39 -0
- package/src/generators/matlab/webservices.ts +263 -0
- package/src/generators/objectivec.ts +297 -0
- package/src/generators/ocaml.ts +168 -0
- package/src/generators/perl.ts +237 -0
- package/src/generators/php/guzzle.ts +368 -0
- package/src/generators/php/php.ts +239 -0
- package/src/generators/php/requests.ts +103 -0
- package/src/generators/powershell.ts +430 -0
- package/src/generators/python/http.ts +167 -0
- package/src/generators/python/python.ts +1934 -0
- package/src/generators/r/httr.ts +328 -0
- package/src/generators/r/httr2.ts +268 -0
- package/src/generators/ruby/httparty.ts +351 -0
- package/src/generators/ruby/ruby.ts +564 -0
- package/src/generators/rust.ts +243 -0
- package/src/generators/swift.ts +235 -0
- package/src/generators/wget.ts +533 -0
- package/src/index.ts +89 -0
- package/src/parse.ts +72 -0
- package/src/shell/Parser.ts +8 -0
- package/src/shell/Word.ts +531 -0
- package/src/shell/tokenizer.ts +736 -0
- package/src/shell/webParser.ts +18 -0
- package/src/utils.ts +25 -0
- package/tools/compare-requests.ts +571 -0
- package/tools/extract_curl_args.py +511 -0
- package/tools/gen-test.ts +129 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2014-2016 Nick Carneiro
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# [curlconverter](https://curlconverter.com)
|
|
2
|
+
|
|
3
|
+
Transpile [`curl`](https://en.wikipedia.org/wiki/CURL) commands into C, C#, ColdFusion, Clojure, Dart, Elixir, Go, HTTPie, Java, JavaScript, Julia, Kotlin, Lua, MATLAB, Objective-C, OCaml, Perl, PHP, PowerShell, Python, R, Ruby, Rust, Swift, Wget, Ansible, HAR, HTTP or JSON.
|
|
4
|
+
|
|
5
|
+
Try it on [curlconverter.com](https://curlconverter.com) or as a drop-in `curl` replacement:
|
|
6
|
+
|
|
7
|
+
```shell
|
|
8
|
+
$ curlconverter --data "hello=world" example.com
|
|
9
|
+
import requests
|
|
10
|
+
|
|
11
|
+
data = {
|
|
12
|
+
'hello': 'world',
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
response = requests.post('http://example.com', data=data)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Features:
|
|
19
|
+
|
|
20
|
+
- Implements a lot of curl's argument parsing logic
|
|
21
|
+
- Knows about all 255 curl arguments but most are ignored
|
|
22
|
+
- Supports shortening `-O -v -X POST` to `-OvXPOST`
|
|
23
|
+
- `--data @filename` generates code that reads that file and `@-` reads stdin
|
|
24
|
+
- Understands Bash syntax
|
|
25
|
+
- [ANSI-C quoted](https://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) strings
|
|
26
|
+
- stdin redirects and [heredocs](https://www.gnu.org/software/bash/manual/bash.html#Here-Documents)
|
|
27
|
+
- Generated code reads environment variables and runs subcommands
|
|
28
|
+
- Ignores comments
|
|
29
|
+
- Reports syntax errors
|
|
30
|
+
- Converts JSON data to native objects
|
|
31
|
+
- Warns about issues with the conversion
|
|
32
|
+
|
|
33
|
+
Limitations:
|
|
34
|
+
|
|
35
|
+
- Only HTTP is supported
|
|
36
|
+
- Code generators for other languages are less thorough than the Python generator
|
|
37
|
+
- curl doesn't follow redirects or decompress gzip-compressed responses by default, but the generated code will do whatever the default is for that runtime, to keep it shorter. For example Python's Requests library [follows redirects by default](https://requests.readthedocs.io/en/latest/user/quickstart/#redirection-and-history), so unless you explicitly set the redirect policy with `-L`/`--location`/`--no-location`, the generated code will not handle redirects the same way as the curl command
|
|
38
|
+
- Shell variables can arbitrarily change how the command would be parsed at runtime. The command `curl $VAR` can do anything, depending on what's in `$VAR`. curlconverter assumes that environment variables don't contain characters that would affect parsing
|
|
39
|
+
- Only simple subcommands such as `curl $(echo example.com)` work, more complicated subcommands (such as nested commands or subcommands that redirect the output) won't generate valid code
|
|
40
|
+
- The Bash parser doesn't support all Bash syntax
|
|
41
|
+
- and much more
|
|
42
|
+
|
|
43
|
+
## Install
|
|
44
|
+
|
|
45
|
+
Install the command line tool with
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
npm install --global curlconverter
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Install the JavaScript library for use in your own projects with
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
npm install curlconverter
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
curlconverter requires Node 12+.
|
|
58
|
+
|
|
59
|
+
## Usage
|
|
60
|
+
|
|
61
|
+
### Usage from the command line
|
|
62
|
+
|
|
63
|
+
`curlconverter` acts as a drop-in replacement for curl. Take any curl command, change "`curl`" to "`curlconverter`" and it will print code instead of making the request
|
|
64
|
+
|
|
65
|
+
```shell
|
|
66
|
+
$ curlconverter example.com
|
|
67
|
+
import requests
|
|
68
|
+
|
|
69
|
+
response = requests.get('http://example.com')
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
To read the curl command from stdin, pass `-`
|
|
73
|
+
|
|
74
|
+
```shell
|
|
75
|
+
$ echo 'curl example.com' | curlconverter -
|
|
76
|
+
import requests
|
|
77
|
+
|
|
78
|
+
response = requests.get('http://example.com')
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Choose the output language by passing `--language <language>`. The options are
|
|
82
|
+
|
|
83
|
+
- `ansible`
|
|
84
|
+
- `c`
|
|
85
|
+
- `cfml`
|
|
86
|
+
- `clojure`
|
|
87
|
+
- `csharp`
|
|
88
|
+
- `dart`
|
|
89
|
+
- `elixir`
|
|
90
|
+
- `go`
|
|
91
|
+
- `har`
|
|
92
|
+
- `http`
|
|
93
|
+
- `httpie`
|
|
94
|
+
- `java`, `java-httpurlconnection`, `java-jsoup`, `java-okhttp`
|
|
95
|
+
- `javascript`, `javascript-jquery`, `javascript-xhr`
|
|
96
|
+
- `json`
|
|
97
|
+
- `julia`
|
|
98
|
+
- `kotlin`
|
|
99
|
+
- `lua`
|
|
100
|
+
- `matlab`
|
|
101
|
+
- `node`, `node-http`, `node-axios`, `node-got`, `node-ky`, `node-request`, `node-superagent`
|
|
102
|
+
- `objc`
|
|
103
|
+
- `ocaml`
|
|
104
|
+
- `perl`
|
|
105
|
+
- `php`, `php-guzzle`, `php-requests`
|
|
106
|
+
- `powershell`, `powershell-webrequest`
|
|
107
|
+
- `python` (the default), `python-http`
|
|
108
|
+
- `r`, `r-httr2`
|
|
109
|
+
- `ruby`, `ruby-httparty`
|
|
110
|
+
- `rust`
|
|
111
|
+
- `swift`
|
|
112
|
+
- `wget`
|
|
113
|
+
|
|
114
|
+
`--verbose` enables printing of conversion warnings and error tracebacks.
|
|
115
|
+
|
|
116
|
+
### Usage as a library
|
|
117
|
+
|
|
118
|
+
The JavaScript API is a bunch of functions that can take either a string of Bash code or an array of already-parsed arguments (like [`process.argv`](https://nodejs.org/docs/latest/api/process.html#processargv)) and return a string with the resulting program:
|
|
119
|
+
|
|
120
|
+
```js
|
|
121
|
+
import * as curlconverter from 'curlconverter';
|
|
122
|
+
|
|
123
|
+
curlconverter.toPython('curl example.com');
|
|
124
|
+
curlconverter.toPython(['curl', 'example.com']);
|
|
125
|
+
// "import requests\n\nresponse = requests.get('http://example.com')\n"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Note**: add `"type": "module",` to your package.json for the `import` statement above to work. curlconverter must be imported as an ES module with `import` this way and not with `require()` because it uses [top-level `await`](https://v8.dev/features/top-level-await).
|
|
129
|
+
|
|
130
|
+
There's a corresponding set of functions that also return an array of warnings if there are any issues with the conversion:
|
|
131
|
+
|
|
132
|
+
```js
|
|
133
|
+
curlconverter.toPythonWarn('curl ftp://example.com');
|
|
134
|
+
curlconverter.toPythonWarn(['curl', 'ftp://example.com']);
|
|
135
|
+
// [
|
|
136
|
+
// "import requests\n\nresponse = requests.get('ftp://example.com')\n",
|
|
137
|
+
// [ [ 'bad-scheme', 'Protocol "ftp" not supported' ] ]
|
|
138
|
+
// ]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
If you want to host curlconverter yourself and use it in the browser, it needs two [WASM](https://developer.mozilla.org/en-US/docs/WebAssembly) files to work, `tree-sitter.wasm` and `tree-sitter-bash.wasm`, which it will request from the root directory of your web server. If you are hosting a static website and using Webpack, you need to copy these files from the node_modules/ directory to your server's root directory in order to serve them. You can look at the [webpack.config.js](https://github.com/curlconverter/curlconverter.github.io/blob/2e1722891be22b1bb5c47976fb7873f6eb86b94d/webpack.config.js#L130-L131) for [curlconverter.com](https://curlconverter.com/) to see how this is done. You will also need to set `{module: {experiments: {topLevelAwait: true}}}` in your webpack.config.js.
|
|
142
|
+
|
|
143
|
+
### Usage in VS Code
|
|
144
|
+
|
|
145
|
+
There's a VS Code extension that adds a "Paste cURL as \<language\>" option to the right-click menu: [https://marketplace.visualstudio.com/items?itemName=curlconverter.curlconverter](https://marketplace.visualstudio.com/items?itemName=curlconverter.curlconverter). It doesn't support the same languages, curl arguments or Bash syntax as the current version because it has to [use an old version of curlconverter](https://github.com/curlconverter/curlconverter-vscode/issues/1).
|
|
146
|
+
|
|
147
|
+
## Contributing
|
|
148
|
+
|
|
149
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md)
|
|
150
|
+
|
|
151
|
+
## License
|
|
152
|
+
|
|
153
|
+
MIT © [Nick Carneiro](http://trillworks.com)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Word } from "./shell/Word.js";
|
|
2
|
+
import type { Warnings } from "./Warnings.js";
|
|
3
|
+
export declare class Headers implements Iterable<[Word, Word | null]> {
|
|
4
|
+
readonly headers: [Word, Word | null][];
|
|
5
|
+
readonly lowercase: boolean;
|
|
6
|
+
constructor(headerArgs?: Word[], warnings?: Warnings, argName?: string);
|
|
7
|
+
get length(): number;
|
|
8
|
+
[Symbol.iterator](): Iterator<[Word, Word | null]>;
|
|
9
|
+
get(header: string): Word | null | undefined;
|
|
10
|
+
getContentType(): string | null | undefined;
|
|
11
|
+
has(header: Word | string): boolean;
|
|
12
|
+
setIfMissing(header: string, value: Word | string): boolean;
|
|
13
|
+
prependIfMissing(header: string, value: Word | string): boolean;
|
|
14
|
+
set(header: string, value: Word | string): void;
|
|
15
|
+
delete(header: string): void;
|
|
16
|
+
clearNulls(): void;
|
|
17
|
+
count(header: string): number;
|
|
18
|
+
toBool(): boolean;
|
|
19
|
+
}
|
|
20
|
+
export type Cookie = [Word, Word];
|
|
21
|
+
export type Cookies = Array<Cookie>;
|
|
22
|
+
export declare function parseCookiesStrict(cookieString: Word): Cookies | null;
|
|
23
|
+
export declare function parseCookies(cookieString: Word): Cookies | null;
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { Word, eq, joinWords } from "./shell/Word.js";
|
|
2
|
+
// https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Standard_request_fields
|
|
3
|
+
// and then searched for "#" in the RFCs that define each header
|
|
4
|
+
const COMMA_SEPARATED = new Set([
|
|
5
|
+
"A-IM",
|
|
6
|
+
"Accept",
|
|
7
|
+
"Accept-Charset",
|
|
8
|
+
// "Accept-Datetime",
|
|
9
|
+
"Accept-Encoding",
|
|
10
|
+
"Accept-Language",
|
|
11
|
+
// "Access-Control-Request-Method",
|
|
12
|
+
"Access-Control-Request-Headers",
|
|
13
|
+
// TODO: auth-scheme [ 1*SP ( token68 / #auth-param ) ]
|
|
14
|
+
// "Authorization",
|
|
15
|
+
"Cache-Control",
|
|
16
|
+
"Connection",
|
|
17
|
+
"Content-Encoding",
|
|
18
|
+
// "Content-Length",
|
|
19
|
+
// "Content-MD5",
|
|
20
|
+
// "Content-Type", // semicolon
|
|
21
|
+
// "Cookie", // semicolon
|
|
22
|
+
// "Date",
|
|
23
|
+
"Expect",
|
|
24
|
+
"Forwarded",
|
|
25
|
+
// "From",
|
|
26
|
+
// "Host",
|
|
27
|
+
// "HTTP2-Settings",
|
|
28
|
+
"If-Match",
|
|
29
|
+
// "If-Modified-Since",
|
|
30
|
+
"If-None-Match",
|
|
31
|
+
// "If-Range",
|
|
32
|
+
// "If-Unmodified-Since",
|
|
33
|
+
// "Max-Forwards",
|
|
34
|
+
// "Origin",
|
|
35
|
+
// "Pragma",
|
|
36
|
+
// "Prefer", // semicolon
|
|
37
|
+
// "Proxy-Authorization",
|
|
38
|
+
"Range",
|
|
39
|
+
// "Referer",
|
|
40
|
+
"TE",
|
|
41
|
+
"Trailer",
|
|
42
|
+
"Transfer-Encoding",
|
|
43
|
+
// "User-Agent",
|
|
44
|
+
"Upgrade",
|
|
45
|
+
"Via",
|
|
46
|
+
"Warning",
|
|
47
|
+
].map((h) => h.toLowerCase()));
|
|
48
|
+
const SEMICOLON_SEPARATED = new Set(["Content-Type", "Cookie", "Prefer"].map((h) => h.toLowerCase()));
|
|
49
|
+
export class Headers {
|
|
50
|
+
constructor(headerArgs, warnings = [],
|
|
51
|
+
// Used for warnings
|
|
52
|
+
argName = "--header/H") {
|
|
53
|
+
let headers = [];
|
|
54
|
+
if (headerArgs) {
|
|
55
|
+
for (const header of headerArgs) {
|
|
56
|
+
if (header.startsWith("@")) {
|
|
57
|
+
warnings.push([
|
|
58
|
+
"header-file",
|
|
59
|
+
"passing a file for " +
|
|
60
|
+
argName +
|
|
61
|
+
" is not supported: " +
|
|
62
|
+
JSON.stringify(header.toString()),
|
|
63
|
+
]);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (header.includes(":")) {
|
|
67
|
+
const [name, value] = header.split(":", 2);
|
|
68
|
+
// Passing -H 'Header-Name:' disables sending of that header.
|
|
69
|
+
// If the colon is followed by just spaces they're ignored
|
|
70
|
+
// unless it's -H 'Host: '
|
|
71
|
+
// https://github.com/curl/curl/issues/12782
|
|
72
|
+
const hasValue = value && (eq(name, "Host") ? value : value.trim()).toBool();
|
|
73
|
+
const headerValue = hasValue ? value.removeFirstChar(" ") : null;
|
|
74
|
+
headers.push([name, headerValue]);
|
|
75
|
+
}
|
|
76
|
+
else if (header.includes(";")) {
|
|
77
|
+
const [name] = header.split(";", 2);
|
|
78
|
+
headers.push([name, new Word()]);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// TODO: warn that this header arg is ignored?
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
this.lowercase =
|
|
86
|
+
headers.length > 0 && headers.every((h) => eq(h[0], h[0].toLowerCase()));
|
|
87
|
+
// Handle repeated headers
|
|
88
|
+
// For Cookie and Accept, merge the values using ';' and ',' respectively
|
|
89
|
+
// For other headers, warn about the repeated header
|
|
90
|
+
const uniqueHeaders = {};
|
|
91
|
+
for (const [name, value] of headers) {
|
|
92
|
+
// TODO: something better, at least warn that variable is ignored
|
|
93
|
+
const lowerName = name.toLowerCase().toString();
|
|
94
|
+
if (!uniqueHeaders[lowerName]) {
|
|
95
|
+
uniqueHeaders[lowerName] = [];
|
|
96
|
+
}
|
|
97
|
+
uniqueHeaders[lowerName].push([name, value]);
|
|
98
|
+
}
|
|
99
|
+
headers = [];
|
|
100
|
+
for (const [lowerName, repeatedHeaders] of Object.entries(uniqueHeaders)) {
|
|
101
|
+
if (repeatedHeaders.length === 1) {
|
|
102
|
+
headers.push(repeatedHeaders[0]);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// If they're all null, just use the first one
|
|
106
|
+
if (repeatedHeaders.every((h) => h[1] === null)) {
|
|
107
|
+
const lastRepeat = repeatedHeaders[repeatedHeaders.length - 1];
|
|
108
|
+
// Warn users if some are capitalized differently
|
|
109
|
+
if (new Set(repeatedHeaders.map((h) => h[0])).size > 1) {
|
|
110
|
+
warnings.push([
|
|
111
|
+
"repeated-header",
|
|
112
|
+
`"${lastRepeat[0]}" header unset ${repeatedHeaders.length} times`,
|
|
113
|
+
]);
|
|
114
|
+
}
|
|
115
|
+
headers.push(lastRepeat);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
// Otherwise there's at least one non-null value, so we can ignore the nulls
|
|
119
|
+
// TODO: if the values of the repeated headers are the same, just use the first one
|
|
120
|
+
// 'content-type': 'application/json; application/json',
|
|
121
|
+
// doesn't really make sense
|
|
122
|
+
const nonEmptyHeaders = repeatedHeaders.filter((h) => h[1] !== null);
|
|
123
|
+
if (nonEmptyHeaders.length === 1) {
|
|
124
|
+
headers.push(nonEmptyHeaders[0]);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
let mergeChar = "";
|
|
128
|
+
if (COMMA_SEPARATED.has(lowerName)) {
|
|
129
|
+
mergeChar = ", ";
|
|
130
|
+
}
|
|
131
|
+
else if (SEMICOLON_SEPARATED.has(lowerName)) {
|
|
132
|
+
mergeChar = "; ";
|
|
133
|
+
}
|
|
134
|
+
if (mergeChar) {
|
|
135
|
+
const merged = joinWords(nonEmptyHeaders.map((h) => h[1]), mergeChar);
|
|
136
|
+
warnings.push([
|
|
137
|
+
"repeated-header",
|
|
138
|
+
`merged ${nonEmptyHeaders.length} "${nonEmptyHeaders[nonEmptyHeaders.length - 1][0]}" headers together with "${mergeChar.trim()}"`,
|
|
139
|
+
]);
|
|
140
|
+
headers.push([nonEmptyHeaders[0][0], merged]);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
warnings.push([
|
|
144
|
+
"repeated-header",
|
|
145
|
+
`found ${nonEmptyHeaders.length} "${nonEmptyHeaders[nonEmptyHeaders.length - 1][0]}" headers, only the last one will be sent`,
|
|
146
|
+
]);
|
|
147
|
+
headers = headers.concat(nonEmptyHeaders);
|
|
148
|
+
}
|
|
149
|
+
this.headers = headers;
|
|
150
|
+
}
|
|
151
|
+
get length() {
|
|
152
|
+
return this.headers.length;
|
|
153
|
+
}
|
|
154
|
+
*[Symbol.iterator]() {
|
|
155
|
+
for (const h of this.headers) {
|
|
156
|
+
yield h;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Gets the first header, matching case-insensitively
|
|
160
|
+
get(header) {
|
|
161
|
+
const lookup = header.toLowerCase();
|
|
162
|
+
for (const [h, v] of this.headers) {
|
|
163
|
+
if (h.toLowerCase().toString() === lookup) {
|
|
164
|
+
return v;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
getContentType() {
|
|
170
|
+
const contentTypeHeader = this.get("content-type");
|
|
171
|
+
if (!contentTypeHeader) {
|
|
172
|
+
return contentTypeHeader;
|
|
173
|
+
}
|
|
174
|
+
return contentTypeHeader.split(";")[0].trim().toString();
|
|
175
|
+
}
|
|
176
|
+
has(header) {
|
|
177
|
+
const lookup = header.toLowerCase();
|
|
178
|
+
for (const h of this.headers) {
|
|
179
|
+
if (eq(h[0].toLowerCase(), lookup)) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
// Doesn't overwrite existing headers
|
|
186
|
+
setIfMissing(header, value) {
|
|
187
|
+
if (this.has(header)) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
if (this.lowercase) {
|
|
191
|
+
header = header.toLowerCase();
|
|
192
|
+
}
|
|
193
|
+
const k = typeof header === "string" ? new Word(header) : header;
|
|
194
|
+
const v = typeof value === "string" ? new Word(value) : value;
|
|
195
|
+
this.headers.push([k, v]);
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
prependIfMissing(header, value) {
|
|
199
|
+
if (this.has(header)) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
if (this.lowercase) {
|
|
203
|
+
header = header.toLowerCase();
|
|
204
|
+
}
|
|
205
|
+
const k = typeof header === "string" ? new Word(header) : header;
|
|
206
|
+
const v = typeof value === "string" ? new Word(value) : value;
|
|
207
|
+
this.headers.unshift([k, v]);
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
set(header, value) {
|
|
211
|
+
if (this.lowercase) {
|
|
212
|
+
header = header.toLowerCase();
|
|
213
|
+
}
|
|
214
|
+
const k = typeof header === "string" ? new Word(header) : header;
|
|
215
|
+
const v = typeof value === "string" ? new Word(value) : value;
|
|
216
|
+
// keep it in the same place if we overwrite
|
|
217
|
+
const searchHeader = k.toLowerCase().toString();
|
|
218
|
+
for (let i = 0; i < this.headers.length; i++) {
|
|
219
|
+
if (eq(this.headers[i][0].toLowerCase(), searchHeader)) {
|
|
220
|
+
this.headers[i][1] = v;
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
this.headers.push([k, v]);
|
|
225
|
+
}
|
|
226
|
+
delete(header) {
|
|
227
|
+
const lookup = header.toLowerCase();
|
|
228
|
+
for (let i = this.headers.length - 1; i >= 0; i--) {
|
|
229
|
+
if (this.headers[i][0].toLowerCase().toString() === lookup) {
|
|
230
|
+
this.headers.splice(i, 1);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// TODO: doesn't this skip the next element after deleting?
|
|
235
|
+
clearNulls() {
|
|
236
|
+
for (let i = this.headers.length - 1; i >= 0; i--) {
|
|
237
|
+
if (this.headers[i][1] === null) {
|
|
238
|
+
this.headers.splice(i, 1);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// TODO: shouldn't be used
|
|
243
|
+
count(header) {
|
|
244
|
+
let count = 0;
|
|
245
|
+
const lookup = header.toLowerCase();
|
|
246
|
+
for (const h of this.headers || []) {
|
|
247
|
+
if (h[0].toLowerCase().toString() === lookup) {
|
|
248
|
+
count += 1;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return count;
|
|
252
|
+
}
|
|
253
|
+
toBool() {
|
|
254
|
+
return this.headers.length > 0 && this.headers.some((h) => h[1] !== null);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
export function parseCookiesStrict(cookieString) {
|
|
258
|
+
const cookies = [];
|
|
259
|
+
for (let cookie of cookieString.split(";")) {
|
|
260
|
+
cookie = cookie.replace(/^ /, "");
|
|
261
|
+
const [name, value] = cookie.split("=", 2);
|
|
262
|
+
if (value === undefined) {
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
cookies.push([name, value]);
|
|
266
|
+
}
|
|
267
|
+
if (new Set(cookies.map((c) => c[0])).size !== cookies.length) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
return cookies;
|
|
271
|
+
}
|
|
272
|
+
export function parseCookies(cookieString) {
|
|
273
|
+
const cookies = [];
|
|
274
|
+
for (let cookie of cookieString.split(";")) {
|
|
275
|
+
cookie = cookie.trim();
|
|
276
|
+
if (!cookie) {
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
const [name, value] = cookie.split("=", 2);
|
|
280
|
+
cookies.push([name.trim(), (value || "").trim()]);
|
|
281
|
+
}
|
|
282
|
+
if (new Set(cookies.map((c) => c[0])).size !== cookies.length) {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
return cookies;
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=Headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Headers.js","sourceRoot":"","sources":["../../src/Headers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Word } from "./shell/Word.js";
|
|
2
|
+
export type QueryList = Array<[Word, Word]>;
|
|
3
|
+
export type QueryDict = Array<[Word, Word | Array<Word>]>;
|
|
4
|
+
export type Query = [QueryList, QueryDict | null] | [null, null];
|
|
5
|
+
export declare function percentEncode(s: Word): Word;
|
|
6
|
+
export declare function percentEncodePlus(s: Word): Word;
|
|
7
|
+
export declare function wordDecodeURIComponent(s: Word): Word;
|
|
8
|
+
export declare function parseQueryString(s: Word | null): Query;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { Word, eq } from "./shell/Word.js";
|
|
2
|
+
import { UTF8encoder } from "./utils.js";
|
|
3
|
+
// Match Python's urllib.parse.quote() behavior
|
|
4
|
+
// https://github.com/python/cpython/blob/3.11/Lib/urllib/parse.py#L826
|
|
5
|
+
// curl and Python let you send non-ASCII characters by encoding each UTF-8 byte.
|
|
6
|
+
// TODO: ignore hex case?
|
|
7
|
+
function _percentEncode(s) {
|
|
8
|
+
return [...UTF8encoder.encode(s)]
|
|
9
|
+
.map((b) => {
|
|
10
|
+
if (
|
|
11
|
+
// A-Z
|
|
12
|
+
(b >= 0x41 && b <= 0x5a) ||
|
|
13
|
+
// a-z
|
|
14
|
+
(b >= 0x61 && b <= 0x7a) ||
|
|
15
|
+
// 0-9
|
|
16
|
+
(b >= 0x30 && b <= 0x39) ||
|
|
17
|
+
// -._~
|
|
18
|
+
b === 0x2d ||
|
|
19
|
+
b === 0x2e ||
|
|
20
|
+
b === 0x5f ||
|
|
21
|
+
b === 0x7e) {
|
|
22
|
+
return String.fromCharCode(b);
|
|
23
|
+
}
|
|
24
|
+
return "%" + b.toString(16).toUpperCase().padStart(2, "0");
|
|
25
|
+
})
|
|
26
|
+
.join("");
|
|
27
|
+
}
|
|
28
|
+
export function percentEncode(s) {
|
|
29
|
+
const newTokens = [];
|
|
30
|
+
for (const token of s.tokens) {
|
|
31
|
+
if (typeof token === "string") {
|
|
32
|
+
newTokens.push(_percentEncode(token));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
newTokens.push(token);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return new Word(newTokens);
|
|
39
|
+
}
|
|
40
|
+
export function percentEncodePlus(s) {
|
|
41
|
+
const newTokens = [];
|
|
42
|
+
for (const token of s.tokens) {
|
|
43
|
+
if (typeof token === "string") {
|
|
44
|
+
newTokens.push(_percentEncode(token).replace(/%20/g, "+"));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
newTokens.push(token);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return new Word(newTokens);
|
|
51
|
+
}
|
|
52
|
+
// Reimplements decodeURIComponent but ignores variables/commands
|
|
53
|
+
export function wordDecodeURIComponent(s) {
|
|
54
|
+
const newTokens = [];
|
|
55
|
+
for (const token of s.tokens) {
|
|
56
|
+
if (typeof token === "string") {
|
|
57
|
+
newTokens.push(decodeURIComponent(token));
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
newTokens.push(token);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return new Word(newTokens);
|
|
64
|
+
}
|
|
65
|
+
// if url is 'example.com?' the s is ''
|
|
66
|
+
// if url is 'example.com' the s is null
|
|
67
|
+
export function parseQueryString(s) {
|
|
68
|
+
if (!s || s.isEmpty()) {
|
|
69
|
+
return [null, null];
|
|
70
|
+
}
|
|
71
|
+
const asList = [];
|
|
72
|
+
for (const param of s.split("&")) {
|
|
73
|
+
// Most software libraries don't let you distinguish between a=&b= and a&b,
|
|
74
|
+
// so if we get an `a&b`-type query string, don't bother.
|
|
75
|
+
if (!param.includes("=")) {
|
|
76
|
+
return [null, null];
|
|
77
|
+
}
|
|
78
|
+
const [key, val] = param.split("=", 2);
|
|
79
|
+
let decodedKey;
|
|
80
|
+
let decodedVal;
|
|
81
|
+
try {
|
|
82
|
+
// https://url.spec.whatwg.org/#urlencoded-parsing
|
|
83
|
+
// recommends replacing + with space before decoding.
|
|
84
|
+
decodedKey = wordDecodeURIComponent(key.replace(/\+/g, " "));
|
|
85
|
+
decodedVal = wordDecodeURIComponent(val.replace(/\+/g, " "));
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
if (e instanceof URIError) {
|
|
89
|
+
// Query string contains invalid percent encoded characters,
|
|
90
|
+
// we cannot properly convert it.
|
|
91
|
+
return [null, null];
|
|
92
|
+
}
|
|
93
|
+
throw e;
|
|
94
|
+
}
|
|
95
|
+
// If the query string doesn't round-trip, we cannot properly convert it.
|
|
96
|
+
// TODO: this is a bit Python-specific, ideally we would check how each runtime/library
|
|
97
|
+
// percent-encodes query strings. For example, a %27 character in the input query
|
|
98
|
+
// string will be decoded to a ' but won't be re-encoded into a %27 by encodeURIComponent
|
|
99
|
+
const roundTripKey = percentEncode(decodedKey);
|
|
100
|
+
const roundTripVal = percentEncode(decodedVal);
|
|
101
|
+
// If the original data used %20 instead of + (what requests will send), that's close enough
|
|
102
|
+
if ((!eq(roundTripKey, key) && !eq(roundTripKey.replace(/%20/g, "+"), key)) ||
|
|
103
|
+
(!eq(roundTripVal, val) && !eq(roundTripVal.replace(/%20/g, "+"), val))) {
|
|
104
|
+
return [null, null];
|
|
105
|
+
}
|
|
106
|
+
asList.push([decodedKey, decodedVal]);
|
|
107
|
+
}
|
|
108
|
+
// Group keys
|
|
109
|
+
const keyWords = {};
|
|
110
|
+
const uniqueKeys = {};
|
|
111
|
+
let prevKey = null;
|
|
112
|
+
for (const [key, val] of asList) {
|
|
113
|
+
const keyStr = key.toString(); // TODO: do this better
|
|
114
|
+
if (prevKey === keyStr) {
|
|
115
|
+
uniqueKeys[keyStr].push(val);
|
|
116
|
+
}
|
|
117
|
+
else if (!Object.prototype.hasOwnProperty.call(uniqueKeys, keyStr)) {
|
|
118
|
+
uniqueKeys[keyStr] = [val];
|
|
119
|
+
keyWords[keyStr] = key;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// If there's a repeated key with a different key between
|
|
123
|
+
// one of its repetitions, there is no way to represent
|
|
124
|
+
// this query string as a dictionary.
|
|
125
|
+
return [asList, null];
|
|
126
|
+
}
|
|
127
|
+
prevKey = keyStr;
|
|
128
|
+
}
|
|
129
|
+
// Convert lists with 1 element to the element
|
|
130
|
+
const asDict = [];
|
|
131
|
+
for (const [keyStr, val] of Object.entries(uniqueKeys)) {
|
|
132
|
+
asDict.push([keyWords[keyStr], val.length === 1 ? val[0] : val]);
|
|
133
|
+
}
|
|
134
|
+
return [asList, asDict];
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=Query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Query.js","sourceRoot":"","sources":["../../src/Query.ts"],"names":[],"mappings":"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"}
|