細かく挙動を変更させられるプロキシサーバが欲しかったので、Clojureでできないか調べた。
http://grepcode.com/file/repo1.maven.org/maven2/org.eclipse.jetty/example-jetty-embedded/8.1.1.v20120215/org/eclipse/jetty/embedded/ProxyServer.java
基本的にはこれをClojureに書き直しただけ。
ProxyServletまではJettyサーバにインスタンスが保存されてしまうのでREPLで変更しても反映されない。
REPLで動作を変更させるためにはProxyServletから他の関数を呼ぶようにしてそこを変更するようにすれば良い。
下のコードではprocess-customize-exchangeとprocess-customize-continuationへの変更は動的に反映される。
core.clj
project.clj
これくらいだとRubyでWEBrick使う方が簡単だし手軽に見えるけど、 clojureで書くことが目的の半分なので。
参考:http://jp.rubyist.net/magazine/?0002-WEBrickProxy
http://grepcode.com/file/repo1.maven.org/maven2/org.eclipse.jetty/example-jetty-embedded/8.1.1.v20120215/org/eclipse/jetty/embedded/ProxyServer.java
基本的にはこれをClojureに書き直しただけ。
ProxyServletまではJettyサーバにインスタンスが保存されてしまうのでREPLで変更しても反映されない。
REPLで動作を変更させるためにはProxyServletから他の関数を呼ぶようにしてそこを変更するようにすれば良い。
下のコードではprocess-customize-exchangeとprocess-customize-continuationへの変更は動的に反映される。
core.clj
(ns jetty-proxy.core) (import '(org.eclipse.jetty.server Server) '(org.eclipse.jetty.server.nio SelectChannelConnector) '(org.eclipse.jetty.servlet ServletContextHandler ServletHolder ServletHandler) '(org.eclipse.jetty.servlets ProxyServlet) '(javax.servlet.http HttpServletRequest)) (defn process-customize-exchange [exchange ^HttpServletRequest request] (println "customize-exchange") (println (str "requestURL: " (. request getRequestURL))) ) (defn process-customize-continuation [continuation] (println "customize-continuation") ) (defn create-proxy-servlet [] (proxy [ProxyServlet] [] (customizeExchange [exchange request] (process-customize-exchange exchange request) (proxy-super customizeExchange exchange request)) (customizeContinuation [continuation] (process-customize-continuation continuation) (proxy-super customizeContinuation continuation)) )) (defn create-server [] (let [server (Server.) handler (ServletHandler.) connector (SelectChannelConnector.)] (. connector setPort 8888) ;;(. handler addServletWithMapping ProxyServlet "/*") (. handler addServletWithMapping (ServletHolder. (create-proxy-servlet)) "/*") (. server addConnector connector) (. server setHandler handler) server)) (def *server* (create-server)) (. *server* start) ;; (. *server* stop)
project.clj
(defproject jetty-proxy "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.5.1"] [org.eclipse.jetty/jetty-server "8.1.9.v20130131"] [org.eclipse.jetty/jetty-servlet "8.1.9.v20130131"] [org.eclipse.jetty/jetty-servlets "8.1.9.v20130131"] [org.clojure/clojure-contrib "1.2.0"] ])
これくらいだとRubyでWEBrick使う方が簡単だし手軽に見えるけど、 clojureで書くことが目的の半分なので。
参考:http://jp.rubyist.net/magazine/?0002-WEBrickProxy
0 件のコメント:
コメントを投稿