diff options
author | V1K1NGbg <victor@ilchev.com> | 2024-08-01 09:28:23 +0300 |
---|---|---|
committer | V1K1NGbg <victor@ilchev.com> | 2024-08-05 20:51:31 +0300 |
commit | c7d3e493ef15f0171617b489bb0304ba3545c2aa (patch) | |
tree | 6d0d19e0f74c4b72e75f836519c35a5a8cb1fa2a | |
parent | 09eea7b88d1566991b74f618537b97b68ddba51e (diff) | |
download | luarocks-c7d3e493ef15f0171617b489bb0304ba3545c2aa.tar.gz luarocks-c7d3e493ef15f0171617b489bb0304ba3545c2aa.tar.bz2 luarocks-c7d3e493ef15f0171617b489bb0304ba3545c2aa.zip |
added mimetypes.d.tl and multipart
-rw-r--r-- | src/luarocks/upload/mimetypes.d.tl | 5 | ||||
-rw-r--r-- | src/luarocks/upload/multipart.tl | 35 |
2 files changed, 26 insertions, 14 deletions
diff --git a/src/luarocks/upload/mimetypes.d.tl b/src/luarocks/upload/mimetypes.d.tl new file mode 100644 index 00000000..3b6ad692 --- /dev/null +++ b/src/luarocks/upload/mimetypes.d.tl | |||
@@ -0,0 +1,5 @@ | |||
1 | local record mimetypes | ||
2 | guess: function(string): string --! TEMP | ||
3 | end | ||
4 | |||
5 | return mimetypes \ No newline at end of file | ||
diff --git a/src/luarocks/upload/multipart.tl b/src/luarocks/upload/multipart.tl index b2cfe8de..0ba8ab8a 100644 --- a/src/luarocks/upload/multipart.tl +++ b/src/luarocks/upload/multipart.tl | |||
@@ -1,10 +1,17 @@ | |||
1 | 1 | ||
2 | local record multipart | 2 | local record multipart |
3 | record TableMap<K, V> | ||
4 | map: {K: V} | ||
5 | array: {V} | ||
6 | end | ||
3 | end | 7 | end |
4 | 8 | ||
9 | local type TableMap = multipart.TableMap | ||
10 | |||
5 | local record File | 11 | local record File |
6 | mimetype: string --! TEMP | 12 | mimetype: string --! TEMP |
7 | fname: string | 13 | fname: string |
14 | mime: function(File): string --! TEMP | ||
8 | end | 15 | end |
9 | 16 | ||
10 | -- socket.url.escape(s) from LuaSocket 3.0rc1 --? | 17 | -- socket.url.escape(s) from LuaSocket 3.0rc1 --? |
@@ -14,13 +21,13 @@ function multipart.url_escape(s: string): string | |||
14 | end)) | 21 | end)) |
15 | end | 22 | end |
16 | 23 | ||
17 | function File:mime() | 24 | function File.mime(self: File): string --! TEMP |
18 | if not self.mimetype then | 25 | if not self.mimetype then |
19 | local mimetypes_ok, mimetypes = pcall(require, "mimetypes") | 26 | local mimetypes_ok, mimetypes = pcall(require, "luarocks.upload.mimetypes") --! TEMP |
20 | if mimetypes_ok then | 27 | if mimetypes_ok then |
21 | self.mimetype = mimetypes.guess(self.fname) | 28 | self.mimetype = mimetypes.guess(self.fname) --! TEMP |
22 | end | 29 | end |
23 | self.mimetype = self.mimetype or "application/octet-stream" | 30 | self.mimetype = self.mimetype or "application/octet-stream" --! TEMP |
24 | end | 31 | end |
25 | return self.mimetype | 32 | return self.mimetype |
26 | end | 33 | end |
@@ -35,7 +42,7 @@ function File:content(): string, string | |||
35 | return data | 42 | return data |
36 | end | 43 | end |
37 | 44 | ||
38 | local function rand_string(len): string | 45 | local function rand_string(len: integer): string |
39 | local shuffled: {integer} = {} | 46 | local shuffled: {integer} = {} |
40 | for i = 1, len do | 47 | for i = 1, len do |
41 | local r = math.random(97, 122) | 48 | local r = math.random(97, 122) |
@@ -55,22 +62,22 @@ end | |||
55 | -- {key2, value2}, | 62 | -- {key2, value2}, |
56 | -- key3: value3 | 63 | -- key3: value3 |
57 | -- } | 64 | -- } |
58 | function multipart.encode(params: ) --? arain a table that is indexed by string and number | 65 | function multipart.encode(params: TableMap<string, string>): string, string --! Table map type |
59 | local tuples = { } | 66 | local tuples = {} --! type |
60 | for i = 1, #params do | 67 | for i = 1, #params.array do |
61 | tuples[i] = params[i] | 68 | tuples[i] = params.array[i] |
62 | end | 69 | end |
63 | for k,v in pairs(params) do | 70 | for k,v in pairs(params.map) do |
64 | if k is string then | 71 | if k is string then |
65 | table.insert(tuples, {k, v}) | 72 | table.insert(tuples, {k, v}) |
66 | end | 73 | end |
67 | end | 74 | end |
68 | local chunks = {} | 75 | local chunks: {string} = {} |
69 | for _, tuple in ipairs(tuples) do | 76 | for _, tuple in ipairs(tuples) do |
70 | local k,v = table.unpack(tuple) | 77 | local k,v = table.unpack(tuple) |
71 | k = multipart.url_escape(k) | 78 | k = multipart.url_escape(k) |
72 | local buffer = { 'Content-Disposition: form-data; name="' .. k .. '"' } | 79 | local buffer: {string} = { 'Content-Disposition: form-data; name="' .. k .. '"' } |
73 | local content | 80 | local content: string |
74 | if type(v) == "table" and v.__class == File then | 81 | if type(v) == "table" and v.__class == File then |
75 | buffer[1] = buffer[1] .. ('; filename="' .. v.fname:gsub(".*[/\\]", "") .. '"') | 82 | buffer[1] = buffer[1] .. ('; filename="' .. v.fname:gsub(".*[/\\]", "") .. '"') |
76 | table.insert(buffer, "Content-type: " .. v:mime()) | 83 | table.insert(buffer, "Content-type: " .. v:mime()) |
@@ -82,7 +89,7 @@ function multipart.encode(params: ) --? arain a table that is indexed by string | |||
82 | table.insert(buffer, content) | 89 | table.insert(buffer, content) |
83 | table.insert(chunks, table.concat(buffer, "\r\n")) | 90 | table.insert(chunks, table.concat(buffer, "\r\n")) |
84 | end | 91 | end |
85 | local boundary | 92 | local boundary: string |
86 | while not boundary do | 93 | while not boundary do |
87 | boundary = "Boundary" .. rand_string(16) | 94 | boundary = "Boundary" .. rand_string(16) |
88 | for _, chunk in ipairs(chunks) do | 95 | for _, chunk in ipairs(chunks) do |