10

桟橋ハンドラーを直接呼び出していたとき、次のようなコンフィギュレーターを渡すことができました。

(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)))}))

投稿時にFULLHEADエラーが発生し続けたため、これを行う必要がありました。ここで、コマンドラインから呼び出される> leinringserverを直接使用するようにリファクタリングしました。

> lein ring server

これは、私のproject.cljで指定されたいくつかの構成を使用します。

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

これはうまく機能しますが、今度はFULLHEADの問題が再び発生します。そこで私はそこにコンフィギュレーターを追加しようとしました:

: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})

そして、これはこのスタックトレースで失敗します:

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)

これは、関数をそのようにマップに直接配置することと関係があると考えたので、プロジェクトの外部(caribou.api.core)で定義し、他の場所で定義されている残りの関数と同じように参照してみました。

;; 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})

これでアプリが起動しますが、投稿時に413:FULLHEADエラーが発生します。何か案は?ありがとう!

4

2 に答える 2

4

フォーム内に記述されたものdefprojectはデフォルトでは評価されませんが、必要なときに~(引用符で囲まずに)使用できます。defproject

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

この特定の状況ではfn、configurator関数を定義するフォームの引用符を外します(引用符を外さずに、関数にコンパイルされるのではなく、一連のシンボルを含むリストとして使用されます)。

または、2番目のアプローチのように、フォームの外側でコンフィギュレーターを定義し、defprojectその名前を内側で参照することもできますが、そのdefproject場合は、内側の名前の引用符を外す必要がありdefprojectます。そうしないと、シンボルとして扱われます。NB。後者の場合、シンボルは実際には呼び出し可能であり、任意の引数を受け入れるため、例外は発生しません(ただしnil、マップまたはセット以外で呼び出された場合にのみ返されます。マップまたはセットでは、引数で自分自身を検索します)。

于 2012-04-25T00:34:43.733 に答える
3

答えは、リングサーバーを使用せず、ring/ring-jetty-adapterを使用してjettyを直接起動することです。そうすれば、BTWがこれに変更したコンフィギュレーターを渡すことができます:

(defn full-head-avoidance
  [jetty]
  (doseq [connector (.getConnectors jetty)]
    (.setRequestHeaderSize connector header-buffer-size)))
于 2012-04-24T03:50:12.970 に答える