diff --git a/README.md b/README.md index 46d1536..7492c02 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,9 @@ multipart_data:set_simple("some-param-name", "some-value") -- Deleting a parameter multipart_data:delete("param-name") +-- Setting a file +multipart_data:set_simple("name", "some-value", "filename", "content_type") + -- Get a multipart/form-data representation of the object local body = multipart_data:tostring() diff --git a/spec/example.txt b/spec/example.txt new file mode 100644 index 0000000..3b18e51 --- /dev/null +++ b/spec/example.txt @@ -0,0 +1 @@ +hello world diff --git a/spec/multipart_spec.lua b/spec/multipart_spec.lua index bcc2c37..90e442a 100644 --- a/spec/multipart_spec.lua +++ b/spec/multipart_spec.lua @@ -630,3 +630,18 @@ hello local data = res:tostring() assert.are.same(new_body, data) end) +it("set a file example", function() + local content_type = "multipart/related; boundary=0f755aa8" + local body = "" + local res = Multipart(body, content_type) + local f = io.open("./spec/example.txt", "rb") + local value = f:read("*all") + f:close() + res:set_simple("example", value, "example.txt", "text/txt") + local body = res:tostring() + local example_body = table.concat({ + "--0f755aa8", + 'Content-Disposition: form-data; name="example"; filename="example.txt"',"content-type: text/txt", "\r\nhello world\n", "--0f755aa8--\r\n" + }, "\r\n") + assert.are.same(example_body, body) + end) diff --git a/src/multipart.lua b/src/multipart.lua index 3300b27..67480c2 100644 --- a/src/multipart.lua +++ b/src/multipart.lua @@ -271,23 +271,34 @@ function MultipartData:get_all() end -function MultipartData:set_simple(name, value) - if self._data.indexes[name] then - self._data.data[self._data.indexes[name]] = { - name = name, - value = value, - headers = { 'Content-Disposition: form-data; name="' .. name .. '"' } - } +function MultipartData:set_simple(name, value, filename, content_type) + local headers = {'Content-Disposition: form-data; name="' , name , '"'} + if filename then + headers[4] = '; filename="' + headers[5] = filename + headers[6] = '"' + end + if content_type then + headers[7] = "\r\ncontent-type: " + headers[8] = content_type + end + headers = concat(headers) + if self._data.indexes[name] then + self._data.data[self._data.indexes[name]] = { + name = name, + value = value, + headers = {headers} + } - else - local part_index = table_size(self._data.indexes) + 1 - self._data.indexes[name] = part_index - self._data.data[part_index] = { - name = name, - value = value, - headers = { 'Content-Disposition: form-data; name="' .. name .. '"' } - } - end + else + local part_index = table_size(self._data.indexes) + 1 + self._data.indexes[name] = part_index + self._data.data[part_index] = { + name = name, + value = value, + headers = {headers} + } + end end