Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
38
Help us understand the problem. What is going on with this article?
@gorilla0513

Vim本体だけでHTTP通信してみた話

More than 1 year has passed since last update.

こんにちわ、ゴリラです。

Vimを使っているみなさんは、channel機能はご存知でしょうか?
channelを使用することで、他のプロセスと通信することができます。通信はTCP/IPプロトコルで行われます。

本記事はchannel機能を使って、HTTP通信をしてみた記事になります。(HTTPについては解説しません)
curlといった外部コマンドに頼らなくても簡易なGETなら、Vim本体だけで行うことができます。

では、早速解説していきます。

デモ

こんな感じです。
http.vim.gif

チャネルについて

channelRAWNLJSONJSといった通信フォーマットがあります。
JSONなら送信したメッセージがJSONに変換されます。例えばhello gorillaを送信した場合、[1, "hello gorilla"]に整形され送信できます。
RAWならテキストがそのまま送信することができます。HTTPの実態はプレーンテキストなので、今回はRAWを使用します。
詳細は:h channelを参照してください。

チャネルを開く

ch_open関数を使用します。
let channel = ch_open("localhost:80", {"mode": "raw"})だけで接続できます。
echo ch_status(channel)でチャネルの状態を確認できます。openは接続中、closeは接続終了を指します。

リクエストを送信

チャネルに対して送信するにはch_sendraw()関数を使用します。これはテキストをそのまま送信する関数になります。
レスポンスはコールバック関数を使用することで受け取ることができます。

HTTPのGETリクエストをチャネルで送信処理は次になります。

func! MyHandler(channel, msg) abort
    new RESPONSE | set buftype=nofile
    call setline(".", a:msg->split("\r\n"))
    nnoremap <buffer> <silent> q :bw!<CR>
endfunc

let s:get_request = "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n"

call ch_sendraw(channel, s:get_request, {'callback': "MyHandler"})

ch_sendrawの第2引数は送信したいテキスト、第3引数はコールバック関数MyHandlerを設定します。
MyHandlerでは新たなバッファを作成して、受け取ったレスポンスをバッファに書き込んでいます。

Dockerのコンテナ一覧を取得

このやり方をちょっとだけ応用して、Dockerのコンテナ一覧を取得することもできます。
ch_openでDockerのサーバーを指定してs:get_requestGET /containers/json?all=1 HTTP/1.1変えるだけです。

http-vim-container.gif

Macの場合はsocat TCP-LISTEN:80,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sockという感じでソケット通信をTCPに変換してからやってみてください。

まとめ

以上、とても簡単ですがVim本体だけでHTTP通信をしてみました。
興味あるかたはぜひ試してみてください。

サンプルコードはこちらに置いてあります。

38
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
gorilla0513
https://twitter.com/gorilla0513

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
38
Help us understand the problem. What is going on with this article?