/** * Copyright (C) Zhang,Yuexiang (xfeep) * */ package nginx.clojure.clj; import static nginx.clojure.MiniConstants.NGX_HTTP_BODY_FILTER_PHASE; import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_HEADERSO_CACHE_CONTROL_OFFSET; import static nginx.clojure.MiniConstants.NGX_HTTP_CLOJURE_HEADERSO_HEADERS_OFFSET; import static nginx.clojure.MiniConstants.NGX_HTTP_HEADER_FILTER_PHASE; import static nginx.clojure.clj.Constants.HEADER_FETCHER; import static nginx.clojure.clj.Constants.KNOWN_RESP_HEADERS; import static nginx.clojure.clj.Constants.REQUEST_METHOD_FETCHER; import nginx.clojure.MiniConstants; import nginx.clojure.NginxHandler; import nginx.clojure.NginxHandlerFactory; import clojure.lang.IFn; import clojure.lang.RT; public class NginxClojureHandlerFactory extends NginxHandlerFactory { public NginxClojureHandlerFactory() { HEADER_FETCHER = new RequestHeadersFetcher(); REQUEST_METHOD_FETCHER = new RequestMethodFetcher(); KNOWN_RESP_HEADERS.putAll(MiniConstants.KNOWN_RESP_HEADERS); KNOWN_RESP_HEADERS.put("Cache-Control", new SeqHeaderHolder("Cache-Control", NGX_HTTP_CLOJURE_HEADERSO_CACHE_CONTROL_OFFSET, NGX_HTTP_CLOJURE_HEADERSO_HEADERS_OFFSET)); } @Override public NginxHandler newInstance(int phase, String name, String code) { if (name != null) { int d = name.lastIndexOf('/'); if (d > 0) { code = "(do (require '"; code += name.substring(0, d); code += ")"; code += name; code += ")"; }else { code = name; } } IFn f = (IFn)RT.var("clojure.core", "eval").invoke(RT.var("clojure.core","read-string").invoke(code)); switch (phase) { case NGX_HTTP_HEADER_FILTER_PHASE: return new NginxClojureHandler(null, f); case NGX_HTTP_BODY_FILTER_PHASE: return new NginxClojureHandler(f); default: return new NginxClojureHandler(f, null); } } }