読者です 読者をやめる 読者になる 読者になる

Saneyan Notes

軌跡を残す

Erlang Cowboy のサーバシグネチャーを変更する

Erlang で書かれた HTTP サーバ「Cowboy」のサーバシグネチャーを変更する方法について。

現在僕が携わっているプロジェクトでは HTTP サーバに Cowboy を利用していて、Elixir でバックエンドを書いてる。Cowboy をベースとした独自のサーバを実装しているため、サーバシグネチャーを変えておくことにした。

99s の Cowboy ドキュメントでは見当たらないので Stackoverflow で探してたらこういうのを見つけた。

stackoverflow.com

あとは Elixir でアレンジしてやれば良い。ざっとこんな感じかな。

defmodule HttpServer do
  @behaviour Application
  
  def start(_type, _args) do
    {:ok, _} = :cowboy.start_http(:http, 100,
      [ port: 3000 ],
      [ env: [ dispatch: dispatch ], onresponse: &modify/4 ])
  end

defp dispatch do
:cowboy_router.compile([ {:_, [ {"/", Handler, []} ]} ])
end defp modify(code, headers, body, req) do after_headers = List.keyreplace(headers, "server", 0, {"server", "your_server_sig"}) :cowboy_req.reply(code, after_headers, body, req) end end

このモジュールでは onresponse hook に HttpServer.modify/4 を参照するようにして、レスポンスを送信する前にサーバシグネチャーを任意の文字列に置換している。

この HTTP サーバを立ち上げて、http://<host>:3000 にアクセスしてレスポンスヘッダを見ると "server: your_server_sig" となっている。

 

cowboy 2.0.0-pre1 + Elixir 1.0.4 環境下で使うことを想定しています。

 

参考:

rest - Erlang Cowboy change server signature in HTTP headers - Stack Overflow

Nine Nines Support: Cowboy User Guide