Extract Exception -> HTTP status code mapping for reuse

Extract private static method UploadPackServlet#statusCodeForThrowable
to a public static method in the UploadPackErrorHandler interface so
that implementers of this interface can reuse the default mapping.

Change-Id: Ie4a0a006b0148d5b828d610c55d19ce407aab055
This commit is contained in:
Sven Selberg 2022-11-09 18:28:45 +01:00 committed by Matthias Sohn
parent ac127a7932
commit 5bf7472e0c
3 changed files with 36 additions and 13 deletions

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<component id="org.eclipse.jgit.http.server" version="2">
<resource path="src/org/eclipse/jgit/http/server/UploadPackErrorHandler.java" type="org.eclipse.jgit.http.server.UploadPackErrorHandler">
<filter id="1210056707">
<message_arguments>
<message_argument value="6.1.1"/>
<message_argument value="statusCodeForThrowable(Throwable)"/>
</message_arguments>
</filter>
</resource>
</component>

View File

@ -9,13 +9,19 @@
*/
package org.eclipse.jgit.http.server;
import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jgit.errors.PackProtocolException;
import org.eclipse.jgit.transport.ServiceMayNotContinueException;
import org.eclipse.jgit.transport.UploadPack;
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
/**
* Handle git-upload-pack errors.
@ -34,6 +40,24 @@
* @since 5.6
*/
public interface UploadPackErrorHandler {
/**
* Maps a thrown git related Exception to an appropriate HTTP status code.
*
* @param error
* The thrown Exception.
* @return the HTTP status code as an int
* @since 6.1.1
*/
public static int statusCodeForThrowable(Throwable error) {
if (error instanceof ServiceNotEnabledException) {
return SC_FORBIDDEN;
}
if (error instanceof PackProtocolException) {
// Internal git errors are not errors from an HTTP standpoint.
return SC_OK;
}
return SC_INTERNAL_SERVER_ERROR;
}
/**
* @param req
* The HTTP request

View File

@ -11,8 +11,6 @@
package org.eclipse.jgit.http.server;
import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
import static javax.servlet.http.HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE;
import static org.eclipse.jgit.http.server.GitSmartHttpTools.UPLOAD_PACK;
@ -23,6 +21,7 @@
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;
import static org.eclipse.jgit.http.server.UploadPackErrorHandler.statusCodeForThrowable;
import static org.eclipse.jgit.util.HttpSupport.HDR_USER_AGENT;
import java.io.IOException;
@ -152,17 +151,6 @@ public void destroy() {
}
}
private static int statusCodeForThrowable(Throwable error) {
if (error instanceof ServiceNotEnabledException) {
return SC_FORBIDDEN;
}
if (error instanceof PackProtocolException) {
// Internal git errors is not an error from an HTTP standpoint.
return SC_OK;
}
return SC_INTERNAL_SERVER_ERROR;
}
private final UploadPackErrorHandler handler;
UploadPackServlet(@Nullable UploadPackErrorHandler handler) {