0

次のような ScalatraServlet があります。

class MyServlet extends ScalatraServlet with FutureSupport with GZipSupport with JacksonJsonSupport {
..
}

実行すると、次のようになります。

java.lang.IllegalStateException: STREAM

また、ScalatraBootstrap に次のように突堤フィルターを追加しようとしました。

val gzip = context.addFilter("gzip-responses", classOf[NicsGzipFilter])
gzip.setInitParameter("mimeTypes", "text/html,text/plain,text/xml,application/json,application/xml,application/xhtml+xml,text/css,application/javascript,image/svg+xml")
gzip.setInitParameter("minGzipSize", "1") // TODO for testing only. Remove before committing
gzip.addMappingForUrlPatterns(java.util.EnumSet.allOf(classOf[DispatcherType]), true, "/*")
gzip.setAsyncSupported(true) // not sure if this is required?

この場合、応答は得られますが、gzip されません (ただし、vary エンコーディング ヘッダーが追加されるため、jetty フィルターは確実に実行されます)。

ここで報告されているのと同じエラーが発生しているようです: ScalatraServlet with AkkaSupport with GZipSupport。そのため、バグが修正されたようには見えません。

機能しない理由についての別の提案がここで行われました: https://github.com/scalatra/scalatra/issues/247#issuecomment-12219667。Scalatra が同じ応答内でライターと出力ストリームを使用して出力を呼び出していることが示唆されていますが、これは許可されていません。

任意のヒント?

ありがとう。

4

1 に答える 1

0

IRC で rossabaker とチャットし、問題を再現するサンプル アプリケーションを送信した後、彼は問題を特定し、修正を思いつきました: https://github.com/scalatra/scalatra/pull/316

FutureSupport トレイトが、GZipFilter によって生成された応答ラッパーを尊重していなかったことが判明しました。

于 2013-10-01T13:27:11.320 に答える