]> source.dussan.org Git - jgit.git/commitdiff
Fix error handling in FileLfsServlet 02/129502/2
authorMatthias Sohn <matthias.sohn@sap.com>
Sun, 16 Sep 2018 22:35:33 +0000 (00:35 +0200)
committerMatthias Sohn <matthias.sohn@sap.com>
Mon, 17 Sep 2018 15:48:55 +0000 (17:48 +0200)
Check in #sendError method if the response was committed already.

If yes we cannot set response status or send an error message, last
resort is to close the outputstream.

If the response wasn't yet committed first reset the response before
using writer to send the error message to the client since mixing STREAM
and WRITE mode (mixing asynchronous and blocking I/O) is illegal in
servlet 3.1.

see the following bugs in the gerrit and jetty issue trackers
https://bugs.chromium.org/p/gerrit/issues/detail?id=9667
https://bugs.chromium.org/p/gerrit/issues/detail?id=9721
https://github.com/eclipse/jetty.project/issues/2911

Change-Id: Ie35563c2e0ac1c5e918185a746622589a880dc7f
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsServlet.java

index a8e3c11e27ff66827d6a05ff73ae72463cc94216..15c4448da85b64bef931e0218e37b76f2d9c49da 100644 (file)
@@ -202,6 +202,11 @@ public class FileLfsServlet extends HttpServlet {
         */
        protected static void sendError(HttpServletResponse rsp, int status, String message)
                        throws IOException {
+               if (rsp.isCommitted()) {
+                       rsp.getOutputStream().close();
+                       return;
+               }
+               rsp.reset();
                rsp.setStatus(status);
                PrintWriter writer = rsp.getWriter();
                gson.toJson(new Error(message), writer);