Paradigm Shift Design

ISHITOYA Kentaro's blog.

HTTPServletRequestの16KBの壁

C#側からJSONのリクエストを送って、Javaで処理するためにJSonicの1.0を使っています。
S2Flex2と同じクラスを利用してサービスを作れるので重宝しているのですが、問題が…


C#側から大きなリクエストを送ると「ParseError」で処理されないのです。


具体的に突き止めるまで、まずC#側から送っているリクエストが正しいかどうか確かめてみました。
JSON Lint

処理すると問題なかったのですが、JSON.NETの2.0.0が出ていたので、念のため入れ替えました。


で、出力されているJSONに間違いがないようなので、Java側の問題だとおもって、とりあえずリクエストをファイルに落として、

public class JsonicTest {
  public static void main(String[] args){
    try{
      BufferedReader reader = new BufferedReader(new FileReader("jsonic2.json"));
      //BufferedReader reader = new BufferedReader(new FileReader("jsonic2.json"));
      JSON json = new JSON();
      RpcRequest req = null;
      req = json.parse(reader, RpcRequest.class);
      System.out.println(req.method);
      System.out.println(req.id);
    }catch(Exception e){
      e.printStackTrace();
    }
  }
  class RpcRequest {
    public String method;
    public List params;
    public Object id;
  }
}

という簡単なコードで試してみたところ、動きました。
というわけで、JSONパーザーのせいではないと、分かったので…


Jsonicの0.9.6?を使っていたので1.0にあげてみても動かず、レポジトリからチェックアウトした最新版は、Servletとして認識されないのかそのまま動かず。
とりあえず1.0でデバッグすることに腹を決めました。


WebServiceServletのdoRPCを疑ってみました。
とりあえず、対象となるリクエストをC#側から送ってみてrequest.getReader().ReadLine()を表示してみると…
途中から表示されました。なんだそれは、と思ってrequest.contentLength()を表示してみると、17838。ん、と思って、途中から表示された文字列の長さを数えると…1454。
あれあれ?というわけで、(17838-1454) / 1024 = 16。割り切れたら、それは何かどこかで処理が入っているはずだ!


…とここまで気がつくのに、10時間かかってる…生産性ひくッ。
結局、HTTPServletRequest.getReader()で取得したBufferedReaderを使わずに、

BufferedReader reader = 
    new BufferedReader(new InputStreamReader(request.getInputStream()));

とInputStreamからReaderを作り直したら問題が解決し正常に動きました。


なんじゃそりゃー!
16KBの制限がどこでかけられているのかは、全く知りません。
どなたか教えてください…