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の制限がどこでかけられているのかは、全く知りません。
どなたか教えてください…