2012-04-23 12 views
9

Cuando estaba llamando directamente al controlador de amarre, yo era capaz de pasar de un configurador de este modo:clojure/ring/jetty: Estoy usando> lein ring server. ¿Cómo configuro la instancia de embarcadero que se crea una instancia?

(def header-buffer-size 8388608) 
(defn start [port] 
    (ring/run-jetty 
    (var app) 
    {:port port 
    :join? false 
    :host "127.0.0.1" 
    :configurator 
    (fn [jetty] 
     (doseq [connector (.getConnectors jetty)] 
     (.setHeaderBufferSize connector header-buffer-size)))})) 

que tenía que hacer esto porque seguí recibiendo un error de la cabeza llena enviar el mensaje. Ahora refactored cosas para usar> lein ring server directamente, que se llama desde la línea de comandos.

> lein ring server 

Este utiliza una configuración especificada en mi project.clj:

:ring {:handler caribou.api.core/app 
     :servlet-name "caribou-api" 
     :init caribou.api.core/init 
     :port 33443} 

Esto funciona muy bien, pero ahora estoy consiguiendo el tema completo de la cabeza de nuevo. Así que he intentado añadir un configurador de allí:

:ring {:handler caribou.api.core/app 
     :servlet-name "caribou-api" 
     :init caribou.api.core/init 
     :configurator 
     (fn [jetty] 
     (doseq [connector (.getConnectors jetty)] 
      (.setHeaderBufferSize connector 8388608))) 
     :port 33443}) 

Y esto no funciona con este StackTrace:

Exception in thread "main" java.lang.ClassCastException: 
clojure.lang.PersistentList cannot be cast to clojure.lang.IFn 
    at ring.adapter.jetty$run_jetty.invoke(jetty.clj:66) 
    at ring.server.standalone$serve$fn__833.invoke(standalone.clj:78) 
    at ring.server.standalone$try_port.invoke(standalone.clj:12) 
    at ring.server.standalone$serve.doInvoke(standalone.clj:75) 
    at clojure.lang.RestFn.invoke(RestFn.java:423) 
    at ring.server.leiningen$serve.invoke(leiningen.clj:20) 

pensé que esto tenía que ver con poner la función directamente en el mapa de esa manera, así que definida fuera del proyecto (en caribou.api.core) y trató refiriéndose a ella como a mí el resto de las funciones definidas en otra parte:

;; in caribou/api/core.clj 
(def header-buffer-size 8388608) 
(defn full-head-avoidance 
    [jetty] 
    (doseq [connector (.getConnectors jetty)] 
    (.setHeaderBufferSize connector header-buffer-size))) 

;; in project.clj 
:ring {:handler caribou.api.core/app 
     :servlet-name "caribou-api" 
     :init caribou.api.core/init 
     :configurator caribou.api.core/full-head-avoidance 
     :port 33443}) 

Esta gira hasta la aplicación, pero sigo teniendo el 413: FULL CABEZA error al publicar. ¿Algunas ideas? ¡Gracias!

Respuesta

3

cosas por escrito dentro de un formulario defproject no se evalúa de forma predeterminada, pero se puede utilizar ~ (fin de la cita) en defproject cuando lo necesite a:

(defproject foo "1.2.3" 
    ... 
    :some-fn-key ~(fn [& args] ...)) 

En esta situación particular, que le dijeron ellos la forma fn la definición de su función configurador (que sin unquoting está siendo utilizado como una lista que contiene un montón de símbolos, en lugar de compilado en una función).

Como alternativa, se puede definir el configurador fuera de la forma defproject y se refieren a su nombre en el interior defproject como en el segundo enfoque, pero entonces usted necesita para Unquote el nombre dentro defproject - lo contrario va a ser tratado como un símbolo. NÓTESE BIEN. en el último caso, no se produce ninguna excepción, porque los símbolos son de hecho invocables y aceptan argumentos arbitrarios (pero solo devuelven nil cuando se llaman con algo que no sea un mapa o un conjunto; con mapas o conjuntos, se ven a sí mismos en sus argumentos) .

+0

Eso es probablemente algo que cambió desde que se publicó la respuesta, pero cuando lo hago como propuse aquí (descartar la definición de la función) me sale otro error: "No hay función de lector para el objeto de etiqueta". ¿Tienes una idea de por qué esto podría pasar? – Timur

3

La respuesta no es usar el servidor de anillo y simplemente iniciar el embarcadero directamente con el anillo/anillo-embarcadero-adaptador. De esa manera, podrá transmitir en el configurador, que por cierto ha cambiado a esto:

(defn full-head-avoidance 
    [jetty] 
    (doseq [connector (.getConnectors jetty)] 
    (.setRequestHeaderSize connector header-buffer-size))) 
Cuestiones relacionadas