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