import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
pck.writeString("# service=" + svc + "\n");
pck.end();
pck.writeString("ERR " + textForGit);
- send(res, infoRefsResultType(svc), buf.toByteArray());
+ send(req, res, infoRefsResultType(svc), buf.toByteArray());
} else if (isUploadPack(req)) {
pck.writeString("ERR " + textForGit);
- send(res, UPLOAD_PACK_RESULT_TYPE, buf.toByteArray());
+ send(req, res, UPLOAD_PACK_RESULT_TYPE, buf.toByteArray());
} else if (isReceivePack(req)) {
pck.writeString("ERR " + textForGit);
- send(res, RECEIVE_PACK_RESULT_TYPE, buf.toByteArray());
+ send(req, res, RECEIVE_PACK_RESULT_TYPE, buf.toByteArray());
} else {
+ if (httpStatus < 400)
+ ServletUtils.consumeRequestBody(req);
res.sendError(httpStatus);
}
}
- private static void send(HttpServletResponse res, String type, byte[] buf)
- throws IOException {
+ private static void send(HttpServletRequest req, HttpServletResponse res,
+ String type, byte[] buf) throws IOException {
+ ServletUtils.consumeRequestBody(req);
res.setStatus(HttpServletResponse.SC_OK);
res.setContentType(type);
res.setContentLength(buf.length);
- ServletOutputStream os = res.getOutputStream();
+ OutputStream os = res.getOutputStream();
try {
os.write(buf);
} finally {
import static org.eclipse.jgit.http.server.GitSmartHttpTools.RECEIVE_PACK_RESULT_TYPE;
import static org.eclipse.jgit.http.server.GitSmartHttpTools.sendError;
import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_HANDLER;
+import static org.eclipse.jgit.http.server.ServletUtils.consumeRequestBody;
import static org.eclipse.jgit.http.server.ServletUtils.getInputStream;
import static org.eclipse.jgit.http.server.ServletUtils.getRepository;
getServletContext().log(
HttpServerText.get().internalErrorDuringReceivePack,
e.getCause());
+ consumeRequestBody(req);
out.close();
} catch (Throwable e) {
return in;
}
+ /**
+ * Consume the entire request body, if one was supplied.
+ *
+ * @param req
+ * the request whose body must be consumed.
+ */
+ public static void consumeRequestBody(HttpServletRequest req) {
+ if (0 < req.getContentLength() || isChunked(req)) {
+ try {
+ consumeRequestBody(req.getInputStream());
+ } catch (IOException e) {
+ // Ignore any errors obtaining the input stream.
+ }
+ }
+ }
+
+ private static boolean isChunked(HttpServletRequest req) {
+ return "chunked".equals(req.getHeader("Transfer-Encoding"));
+ }
+
+ /**
+ * Consume the rest of the input stream and discard it.
+ *
+ * @param in
+ * the stream to discard, closed if not null.
+ */
+ public static void consumeRequestBody(InputStream in) {
+ if (in == null)
+ return;
+ try {
+ while (0 < in.skip(2048) || 0 <= in.read()) {
+ // Discard until EOF.
+ }
+ } catch (IOException err) {
+ // Discard IOException during read or skip.
+ } finally {
+ try {
+ in.close();
+ } catch (IOException err) {
+ // Discard IOException during close of input stream.
+ }
+ }
+ }
+
/**
* Send a plain text response to a {@code GET} or {@code HEAD} HTTP request.
* <p>
import static org.eclipse.jgit.http.server.GitSmartHttpTools.UPLOAD_PACK_RESULT_TYPE;
import static org.eclipse.jgit.http.server.GitSmartHttpTools.sendError;
import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_HANDLER;
+import static org.eclipse.jgit.http.server.ServletUtils.consumeRequestBody;
import static org.eclipse.jgit.http.server.ServletUtils.getInputStream;
import static org.eclipse.jgit.http.server.ServletUtils.getRepository;
} catch (UploadPackMayNotContinueException e) {
if (e.isOutput()) {
+ consumeRequestBody(req);
out.close();
} else if (!rsp.isCommitted()) {
rsp.reset();
getServletContext().log(
HttpServerText.get().internalErrorDuringUploadPack,
e.getCause());
+ consumeRequestBody(req);
out.close();
} catch (Throwable e) {