hatenob

プログラムって分からないことだらけ

Undertowでリバースプロキシ

WildflyのWebコンポーネントであるUndertowを使って簡単なリバースプロキシを書く。
と言っても、実はUndertowには最初からリバプロ用のHttpHandlerがあるのでそれを使うだけ。
ただリバプロだけじゃ面白くないので、リクエストヘッダに任意の文字列を付けて渡すようにしてみた。

実装

リバプロ本体。
リクエストヘッダに任意の文字列を追加した後にプロキシするように、HttpHander chainを作っている。

public class Server {
  public static void main(String... args) throws IOException {
    Undertow server;
    try {
      server = Undertow
          .builder()
          .addHttpListener(8080, "localhost")
          .setHandler(
              new SetRequestHeaderHandler(new ProxyHandler(
                  new SimpleProxyClientProvider(new URI(
                      "http://centos7:8080/")), 500,
                  null, true, true), "Hoge", "hoge")).build();
      server.start();
    } catch (URISyntaxException e) {
      e.printStackTrace();
    }
  }
}

リクエストヘッダに追加するHttpHandlerは極簡単。

public class SetRequestHeaderHandler implements HttpHandler {
  private HttpHandler next;
  private HttpString header;
  private String value;

  public SetRequestHeaderHandler(HttpHandler next, String header, String value) {
    this.next = next;
    this.header = HttpString.tryFromString(header);
    this.value = value;
  }

  @Override
  public void handleRequest(HttpServerExchange exchange) throws Exception {
    exchange.getRequestHeaders().put(header, value);
    next.handleRequest(exchange);
  }
}

まとめ

ちょっとしたWebアプリならこれで事足りる。
本番運用となるとどうか分からないけれど、開発時のちょっとしたモック的な使い方であれば十分。

JBoss AS7(EAP 6)まではTomcatベースのJBossWebだったのがWildfly8からUndertowになった。
それに伴ってWebコンテナの持つ仕組みもちょっと変わった感じで、HttpHandlerはValveに近い感じっぽい。もちろん他のコンテナへのポータビリティなんかは皆無だけれど、Wildflyに特化した組み込み処理みたいなのを作りたいときには便利かも。