mistweaverco / kulala.nvim

A minimal 🤏 HTTP-client 🐼 interface 🖥️ for Neovim ❤️.
https://kulala.mwco.app
MIT License
639 stars 29 forks source link

Unable to send multipart form data #274

Closed joninvski closed 2 weeks ago

joninvski commented 2 weeks ago

When trying this small example:

# @file-to-variable LOGO_FILE_VAR ./sample_image.png
POST https://httpbin.org/post
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary{{$timestamp}}

------WebKitFormBoundary{{$timestamp}}
Content-Disposition: form-data; name="logo"; filename="logo.png"
Content-Type: image/jpeg

{{LOGO_FILE_VAR}}
------WebKitFormBoundary{{$timestamp}}--

I get this error:

Error  17:10:33 msg_show.lua_error Error executing vim.schedule lua callback: Vim:E976: Using a Blob as a String
stack traceback:
    [C]: in function 'strlen'
    ...de/.local/share/nvim/lazy/nui.nvim/lua/nui/text/init.lua:31: in function 'set'
    ...de/.local/share/nvim/lazy/nui.nvim/lua/nui/text/init.lua:18: in function 'init'
    .../.local/share/nvim/lazy/nui.nvim/lua/nui/object/init.lua:132: in function 'NuiText'
    ...de/.local/share/nvim/lazy/nui.nvim/lua/nui/line/init.lua:20: in function '_append'
    ...ocal/share/nvim/lazy/noice.nvim/lua/noice/text/block.lua:186: in function 'append'
    ...ocal/share/nvim/lazy/noice.nvim/lua/noice/text/block.lua:21: in function 'init'
    ...al/share/nvim/lazy/noice.nvim/lua/noice/message/init.lua:46: in function 'init'
    .../.local/share/nvim/lazy/nui.nvim/lua/nui/object/init.lua:132: in function 'Message'
    ...l/share/nvim/lazy/noice.nvim/lua/noice/source/notify.lua:53: in function 'notify'
    ...l/share/nvim/lazy/kulala.nvim/lua/kulala/logger/init.lua:14: in function 'info'
    ...l/share/nvim/lazy/kulala.nvim/lua/kulala/parser/init.lua:37: in function <...l/share/nvim/lazy/kulala.nvim/lua/kulala/parser/init.lua:20>
    [C]: in function 'gsub'
    ...l/share/nvim/lazy/kulala.nvim/lua/kulala/parser/init.lua:46: in function 'parse_string_variables'
    ...l/share/nvim/lazy/kulala.nvim/lua/kulala/parser/init.lua:29: in function <...l/share/nvim/lazy/kulala.nvim/lua/kulala/parser/init.lua:20>
    [C]: in function 'gsub'
    ...l/share/nvim/lazy/kulala.nvim/lua/kulala/parser/init.lua:46: in function 'parse_body'
    ...l/share/nvim/lazy/kulala.nvim/lua/kulala/parser/init.lua:539: in function 'replace_variables_in_url_headers_body'
    ...l/share/nvim/lazy/kulala.nvim/lua/kulala/parser/init.lua:573: in function 'parse'
    ...ocal/share/nvim/lazy/kulala.nvim/lua/kulala/cmd/init.lua:87: in function 'run_parser'
    ...local/share/nvim/lazy/kulala.nvim/lua/kulala/ui/init.lua:204: in function <...local/share/nvim/lazy/kulala.nvim/lua/kulala/ui/init.lua:193>

I am running on neovim 0.10.2 and installing kulala via lazyvim rest extra.

Thanks

gorillamoe commented 2 weeks ago

Can confirm this. The example is right, but that's a regression in the code. If you lower-case the content-type header it will work. But as said, it's a regression, will fix it later, when I'm back at home.

joninvski commented 2 weeks ago

I have just discovered that this problem does not occur if file size is small. It happened when image was 500kb but once i reduced it to 20k problem stopped.

gorillamoe commented 2 weeks ago

Currently in main. It works this way with binary files (like images):

# @file-to-variable LOGO_FILE_VAR ./sample_image.png binary
POST https://httpbin.org/post
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary{{$timestamp}}

------WebKitFormBoundary{{$timestamp}}
Content-Disposition: form-data; name="logo"; filename="logo.png"
Content-Type: image/jpeg

{{LOGO_FILE_VAR}}

------WebKitFormBoundary{{$timestamp}}--

Note the binary keyword at the end of the metatag directive.

This tells kulala to read it as binary, instead of just a raw string.

For text files like json or txt or what not, you can completely ignore that and just read them as before:

# @file-to-variable SOME_JSON_VAR ./some.json

[!WARNING] neovim might get really laggy when you read big files. I tested it with files around 1-2 Megabytes which worked fine; when testing it with files around 5-10 Megabytes it freezes for some seconds :see_no_evil: