vital.vim の Web.Http.request を使ってみた

元のソースは, curl を使ってサーバにアクセスするために system 関数を呼び出していた.

		let tmp = tempname()
		let enc_page = iconv(a:page, &enc, enc)
		let enc_page = s:PW_urlencode(enc_page)
		let cmd = url . "?cmd=" . a:pwcmd . "&page=" . enc_page
		let cmd = "curl -s -o " . tmp .' "'. (cmd) . '"'
		let ret = s:PW_system(cmd)
		let result = s:PW_fileread(tmp)
		call delete(tmp)
https://github.com/syngan/vim-pukiwiki/blob/0f61047e93774246904a4dae1e7dd53eab3693af/autoload/pukiwiki.vim

これを Vital.Web.Http.request() を使うように修正する.

		let settings = {}
		let settings['url'] = url 
		let param = {}
		let param['cmd'] = a:pwcmd
		let enc_page = iconv(a:page, &enc, enc)
		let param['page'] = enc_page
		let settings['param'] = param

		" try/catch がいるのかどうなのか...
		try
			let retdic = s:HTTP.request(settings)
		catch
			call s:VITAL.print_error('get_page() failed: ' . v:exception)
			return 0
		endtry
		" エラーは suceess でみればいいはず.
		if !retdic['success']
			call s:VITAL.print_error('get_page() failed: ' . retdic['status'] . ' ' . retdic['statusText'])
			return 0
		endif
		let result = retdic['content']
  • いくつか request() の呼び出し方法はあるけれど, settings directory にすべて詰め込む方式をとった.
    • エラー情報など解析済なので処理は簡単
  • 復帰値は dictionary.

気になったこと

  • urlencode_char()

iconv しているけど意味あるのかな.
任意のバイナリデータとか送れるのだろうか.

    let ret = substitute(a:items, '[^a-zA-Z0-9_.~-]', '\=s:__urlencode_char(submatch(0))', 'g')
https://github.com/vim-jp/vital.vim/blob/eb788118464abe592da6c7469a194461a3fe8b9c/autoload/vital/__latest__/system/file.vim
    • 少し怪しい動きしているのに, vim-pukiwiki がちゃんと動く理由がよくわからない..
    • もう少し調査しないと.

できないみたい.
pukiwiki でバイナリファイルや巨大なファイルのアップロードとかでも一回ファイルを読み込まないとだめ.

  • curl -L 指定なし

これもできないみたい. ソース修正が必要
このへんオプションで変更できないのはなんでだろ.

  • |Vital.Web.Http.request| が漏れてる気がする.
RESPONSE				*Vital.Web.Http-response*

Vital.Web.Http.get and Vital.Web.Http.post return data structure as
  • プラグイン開発中でない場合に of 引数に何を渡すべきかがわからない.
    • どこかで 'vital' と指定するとかみた記憶があるが.
    • この例の call の第 3 引数は何だろう?
Assuming your Vim plugin name is "ujihisa", you can define your utility
function set 'ujihisa#util' just by
>
    let V = vital#of('ujihisa')
    function! ujihisa#util#system(...)
      return call(V.system, a:000, V)
    endfunction
<
https://github.com/vim-jp/vital.vim/blob/91f54a7b91469dd8ea7a77b084c209f38171d288/doc/vital.txt
  elseif has("unix")
    let option = ''
    let option .= flags =~# 'f' ? ' -f' : ''
    let option .= flags =~# 'r' ? ' -r' : ''
    let ret = system("/bin/rm" . option . ' ' . shellescape(a:path) . ' 2>&1')
https://github.com/vim-jp/vital.vim/blob/2abe22adcf4f5757d72a73c6c8e6dd75e659c2cf/autoload/vital/__latest__/system/file.vim
https://github.com/vim-jp/vital.vim/blob/bd19b7e07f445b71197101f25f9b3ac979b3576f/doc/vital-web-http.txt