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.
- content の文字コードはどういう扱いだろう.
気になったこと
- 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
できないみたい.
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
- unix ルート...
https://github.com/vim-jp/vital.vim/blob/bd19b7e07f445b71197101f25f9b3ac979b3576f/doc/vital-web-http.txtelseif 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