Merge changes I1f968649,Ied678797
* changes: UploadPackServlet: Use uploadWithExceptionPropagation GitSmartHttpTools: Do not use sideband when sending an error
This commit is contained in:
commit
3ca340d5da
|
@ -48,8 +48,6 @@
|
||||||
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
|
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
|
||||||
import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_HANDLER;
|
import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_HANDLER;
|
||||||
import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_SIDE_BAND_64K;
|
import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_SIDE_BAND_64K;
|
||||||
import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_SIDE_BAND;
|
|
||||||
import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_SIDE_BAND_64K;
|
|
||||||
import static org.eclipse.jgit.transport.SideBandOutputStream.CH_ERROR;
|
import static org.eclipse.jgit.transport.SideBandOutputStream.CH_ERROR;
|
||||||
import static org.eclipse.jgit.transport.SideBandOutputStream.SMALL_BUF;
|
import static org.eclipse.jgit.transport.SideBandOutputStream.SMALL_BUF;
|
||||||
|
|
||||||
|
@ -64,14 +62,12 @@
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.eclipse.jgit.internal.transport.parser.FirstCommand;
|
import org.eclipse.jgit.internal.transport.parser.FirstCommand;
|
||||||
import org.eclipse.jgit.internal.transport.parser.FirstWant;
|
|
||||||
import org.eclipse.jgit.lib.Constants;
|
import org.eclipse.jgit.lib.Constants;
|
||||||
import org.eclipse.jgit.transport.PacketLineIn;
|
import org.eclipse.jgit.transport.PacketLineIn;
|
||||||
import org.eclipse.jgit.transport.PacketLineOut;
|
import org.eclipse.jgit.transport.PacketLineOut;
|
||||||
import org.eclipse.jgit.transport.ReceivePack;
|
import org.eclipse.jgit.transport.ReceivePack;
|
||||||
import org.eclipse.jgit.transport.RequestNotYetReadException;
|
import org.eclipse.jgit.transport.RequestNotYetReadException;
|
||||||
import org.eclipse.jgit.transport.SideBandOutputStream;
|
import org.eclipse.jgit.transport.SideBandOutputStream;
|
||||||
import org.eclipse.jgit.transport.UploadPack;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility functions for handling the Git-over-HTTP protocol.
|
* Utility functions for handling the Git-over-HTTP protocol.
|
||||||
|
@ -220,44 +216,15 @@ private static void sendInfoRefsError(HttpServletRequest req,
|
||||||
|
|
||||||
private static void sendUploadPackError(HttpServletRequest req,
|
private static void sendUploadPackError(HttpServletRequest req,
|
||||||
HttpServletResponse res, String textForGit) throws IOException {
|
HttpServletResponse res, String textForGit) throws IOException {
|
||||||
|
// Do not use sideband. Sideband is acceptable only while packfile is
|
||||||
|
// being sent. Other places, like acknowledgement section, do not
|
||||||
|
// support sideband. Use an error packet.
|
||||||
ByteArrayOutputStream buf = new ByteArrayOutputStream(128);
|
ByteArrayOutputStream buf = new ByteArrayOutputStream(128);
|
||||||
PacketLineOut pckOut = new PacketLineOut(buf);
|
PacketLineOut pckOut = new PacketLineOut(buf);
|
||||||
|
writePacket(pckOut, textForGit);
|
||||||
boolean sideband;
|
|
||||||
UploadPack up = (UploadPack) req.getAttribute(ATTRIBUTE_HANDLER);
|
|
||||||
if (up != null) {
|
|
||||||
try {
|
|
||||||
sideband = up.isSideBand();
|
|
||||||
} catch (RequestNotYetReadException e) {
|
|
||||||
sideband = isUploadPackSideBand(req);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
sideband = isUploadPackSideBand(req);
|
|
||||||
|
|
||||||
if (sideband)
|
|
||||||
writeSideBand(buf, textForGit);
|
|
||||||
else
|
|
||||||
writePacket(pckOut, textForGit);
|
|
||||||
send(req, res, UPLOAD_PACK_RESULT_TYPE, buf.toByteArray());
|
send(req, res, UPLOAD_PACK_RESULT_TYPE, buf.toByteArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isUploadPackSideBand(HttpServletRequest req) {
|
|
||||||
try {
|
|
||||||
// The client may be in a state where they have sent the sideband
|
|
||||||
// capability and are expecting a response in the sideband, but we might
|
|
||||||
// not have an UploadPack, or it might not have read any of the request.
|
|
||||||
// So, cheat and read the first line.
|
|
||||||
String line = new PacketLineIn(req.getInputStream()).readString();
|
|
||||||
FirstWant parsed = FirstWant.fromLine(line);
|
|
||||||
return (parsed.getCapabilities().contains(OPTION_SIDE_BAND)
|
|
||||||
|| parsed.getCapabilities().contains(OPTION_SIDE_BAND_64K));
|
|
||||||
} catch (IOException e) {
|
|
||||||
// Probably the connection is closed and a subsequent write will fail, but
|
|
||||||
// try it just in case.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void sendReceivePackError(HttpServletRequest req,
|
private static void sendReceivePackError(HttpServletRequest req,
|
||||||
HttpServletResponse res, String textForGit) throws IOException {
|
HttpServletResponse res, String textForGit) throws IOException {
|
||||||
ByteArrayOutputStream buf = new ByteArrayOutputStream(128);
|
ByteArrayOutputStream buf = new ByteArrayOutputStream(128);
|
||||||
|
@ -308,7 +275,7 @@ private static void writeSideBand(OutputStream out, String textForGit)
|
||||||
|
|
||||||
private static void writePacket(PacketLineOut pckOut, String textForGit)
|
private static void writePacket(PacketLineOut pckOut, String textForGit)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
pckOut.writeString("error: " + textForGit);
|
pckOut.writeString("ERR " + textForGit);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void send(HttpServletRequest req, HttpServletResponse res,
|
private static void send(HttpServletRequest req, HttpServletResponse res,
|
||||||
|
|
|
@ -70,7 +70,9 @@
|
||||||
import javax.servlet.http.HttpServlet;
|
import javax.servlet.http.HttpServlet;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.eclipse.jgit.annotations.Nullable;
|
import org.eclipse.jgit.annotations.Nullable;
|
||||||
|
import org.eclipse.jgit.errors.PackProtocolException;
|
||||||
import org.eclipse.jgit.http.server.UploadPackErrorHandler.UploadPackRunnable;
|
import org.eclipse.jgit.http.server.UploadPackErrorHandler.UploadPackRunnable;
|
||||||
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.lib.Repository;
|
||||||
import org.eclipse.jgit.transport.InternalHttpServerGlue;
|
import org.eclipse.jgit.transport.InternalHttpServerGlue;
|
||||||
|
@ -212,7 +214,8 @@ public void flush() throws IOException {
|
||||||
rsp.setContentType(UPLOAD_PACK_RESULT_TYPE);
|
rsp.setContentType(UPLOAD_PACK_RESULT_TYPE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
up.upload(getInputStream(req), out, null);
|
up.uploadWithExceptionPropagation(getInputStream(req), out,
|
||||||
|
null);
|
||||||
out.close();
|
out.close();
|
||||||
} catch (ServiceMayNotContinueException e) {
|
} catch (ServiceMayNotContinueException e) {
|
||||||
if (e.isOutput()) {
|
if (e.isOutput()) {
|
||||||
|
@ -245,7 +248,9 @@ private void defaultUploadPackHandler(HttpServletRequest req,
|
||||||
log(up.getRepository(), e);
|
log(up.getRepository(), e);
|
||||||
if (!rsp.isCommitted()) {
|
if (!rsp.isCommitted()) {
|
||||||
rsp.reset();
|
rsp.reset();
|
||||||
sendError(req, rsp, SC_INTERNAL_SERVER_ERROR);
|
String msg = e instanceof PackProtocolException ? e.getMessage()
|
||||||
|
: null;
|
||||||
|
sendError(req, rsp, SC_INTERNAL_SERVER_ERROR, msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1214,7 +1214,7 @@ public void testFetch_RefsUnreadableOnUpload() throws Exception {
|
||||||
Collections.<ObjectId> emptySet());
|
Collections.<ObjectId> emptySet());
|
||||||
fail("Successfully served ref with value " + c.getRef(master));
|
fail("Successfully served ref with value " + c.getRef(master));
|
||||||
} catch (TransportException err) {
|
} catch (TransportException err) {
|
||||||
assertEquals("internal server error", err.getMessage());
|
assertEquals("Internal server error", err.getMessage());
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
noRefServer.tearDown();
|
noRefServer.tearDown();
|
||||||
|
|
Loading…
Reference in New Issue