🛠️

ワンライナーのHTTPサーバを忘れるのでテスト用のスクリプトを作ってみた

4 min read

はじめに

開発をしてると画像や生成されたHTMLなどをローカルのHTTPサーバにホスティングしたり、フロントエンド書いてて取り合えずモックのAPIサーバを立ち上げたいときは良くあります。

そのたびにいつも「ワンライナー HTTPサーバ」でGoogle先生に聞いたり、自分のコマンド履歴から探してるんですがめんどくなってスクリプト書いたのでメモに残しておきます。そのうち作ったこと自体忘れると思うので。。。

httpd4test

  • Rubyベースの簡易Webサーバ。WEBrickのラッパー
  • カレントディレクトリのWebホスティングをサポート
  • API用にEcho Serverをサポート (CROS対応済み)
  • DockerがあればRubyは無くても動作

https://github.com/koduki/httpd4test

インストール

内部でDockerを利用しているので、事前にDockerが動作する事は確認。

$ sudo sh -c 'curl https://raw.githubusercontent.com/koduki/httpd4test/main/cli/httpd4test > /usr/bin/httpd4test && chmod a+x /usr/bin/httpd4test'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   186  100   186    0     0    704      0 --:--:-- --:--:-- --:--:--   704
$ httpd4test -h
Usage: httpd4test [OPTION]...
This is http server for testing
Options:
        -p, --port               port number of http server
        -m, --message            echo message
        -h, --help               this message
        --json                   change content-type to 'application/json'

使い方

静的コンテンツのホスティング

カレントディレクトリをデフォルトポート8080でホスティング

$ touch a b c
$ ls -l
total 0
-rw-r--r-- 1 koduki koduki 0 Dec 26 12:17 a
-rw-r--r-- 1 koduki koduki 0 Dec 26 12:17 b
-rw-r--r-- 1 koduki koduki 0 Dec 26 12:17 c
$ httpd4test
[2020-12-26 20:17:47] INFO  WEBrick 1.7.0
[2020-12-26 20:17:47] INFO  ruby 3.0.0 (2020-12-20) [x86_64-linux]
Server is listening on :8080
Return local contents
[2020-12-26 20:17:47] INFO  WEBrick::HTTPServer#start: pid=1 port=8080

動作確認。

$ lynx http://localhost:8080/
                                                                 Index of /
                                Index of /

         Name        Last modified   Size
   Parent Directory 2020/12/26 20:49 -
   a                2020/12/26 20:17 0
   b                2020/12/26 20:17 0
   c                2020/12/26 20:17 0
     _____________________________________________________________

    WEBrick/1.7.0 (Ruby/3.0.0/2020-12-20) at localhost:8080

ダミーAPIの作成

引数で渡したJSONを返す。

$ httpd4test -p 5000 -m '{"message":"Hello World"}' --json
[2020-12-27 00:25:25] INFO  WEBrick 1.7.0
[2020-12-27 00:25:25] INFO  ruby 3.0.0 (2020-12-20) [x86_64-linux]
Server is listening on :5000
Return value is {"message":"Hello World"}
[2020-12-27 00:25:25] INFO  WEBrick::HTTPServer#start: pid=1 port=5000

curlコマンドで確認。

$ curl -v http://localhost:5000/
*   Trying 127.0.0.1:5000...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 5000 (#0)
> GET / HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Headers: X-Requested-With, Origin, X-Csrftoken, Content-Type, Accept
< Content-Type: application/json
< Server: WEBrick/1.7.0 (Ruby/3.0.0/2020-12-20)
< Date: Sun, 27 Dec 2020 00:26:55 GMT
< Content-Length: 25
< Connection: Keep-Alive
<
* Connection #0 to host localhost left intact
{"message":"Hello World"}%

まとめ

おそらく似たこと、あるいはこれ以上をしてくれるツールは星の数ほどあるけど、探すのも使い方を覚えるのも面倒なので作ってみました。
今回はDockerを使ってるけどfootprintが悪いのでmrubyかRubyPackerでシングルバイナリにしようかな。。。

ちなみにコンテナは無意味にRuby 3で作ったので手持ちのスクリプトでは始めてRuby3向けに書いたコードになります。ほぼどのRubyでも動く程度のコード量ですがw

それではHappy Hacking!