その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Servlet コンテナによって HttpServletRequest#getPart(String name) の挙動が違う

Part gotPart = httpServletRequest.getPart("hoge");

みたいなコードがあった時,送られてきた multipart リクエスト (httpServletRequest) に1つも part が含まれていない場合の挙動が Servlet コンテナによって変わってきます.

送るリクエストはこんな感じ.

HttpPost post = new HttpPost("http://localhost:8080/");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
HttpEntity entity = builder.build(); // part は空のまま instantiate
post.setEntity(entity);
HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = client.execute(post);

この場合に Tomcat 8.0.20 でこのコードを実行すると,gotPart には null が入ってきますが,
Jetty 9.2.9.v20150224 で実行すると,getPart("hoge") の実行によって IOException が上げられます.
Jetty の実装を見るとリクエストに form-data の行が無かった場合に IOException を上げるようになっているようです.
https://github.com/eclipse/jetty.project/blob/a3201a3c810da37ad892e62c1f04600dc889d14a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java#L490-L491


Jetty が IOException を上げてくるのが良いかどうかはさておき,ここらへん細かい差異があるので実装にあたって注意が必要ですねという印象です.