From bb9988c2368f1986fc0d59cc44fa754f22ca2708 Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Mon, 25 Jul 2016 14:43:33 +0900 Subject: [PATCH] LfsProtocolServlet: Pass request and path to getLargeFileRepository Passing the request and path to the method will allow implementations to have more control over determination of the backend, for example: - return different backends for different requests - accept or refuse requests based on request characteristics - etc Change-Id: I1ec6ec54c91a5f0601b620ed18846eb4a3f46783 Signed-off-by: David Pursehouse --- .../jgit/lfs/server/LfsProtocolServlet.java | 41 +++++++++++++------ .../org/eclipse/jgit/pgm/debug/LfsStore.java | 4 +- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsProtocolServlet.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsProtocolServlet.java index 7d2efd26c..7b1a67007 100644 --- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsProtocolServlet.java +++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/LfsProtocolServlet.java @@ -82,40 +82,57 @@ public abstract class LfsProtocolServlet extends HttpServlet { /** * Get the large file repository * - * @return the large file repository storing large files + * @param request + * the request + * @param path + * the path + * + * @return the large file repository storing large files or null if the + * request is not supported. */ - protected abstract LargeFileRepository getLargeFileRepository(); + protected abstract LargeFileRepository getLargeFileRepository( + LfsRequest request, String path); + + /** LFS request. */ + protected static class LfsRequest { + private String operation; + + private List objects; + + /** + * Get the LFS operation. + * + * @return the operation + */ + public String getOperation() { + return operation; + } + } @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { - res.setStatus(SC_OK); - res.setContentType(CONTENTTYPE_VND_GIT_LFS_JSON); - Writer w = new BufferedWriter( new OutputStreamWriter(res.getOutputStream(), UTF_8)); Reader r = new BufferedReader(new InputStreamReader(req.getInputStream(), UTF_8)); LfsRequest request = gson.fromJson(r, LfsRequest.class); + String path = req.getPathInfo(); - LargeFileRepository repo = getLargeFileRepository(); + LargeFileRepository repo = getLargeFileRepository(request, path); if (repo == null) { res.setStatus(SC_SERVICE_UNAVAILABLE); return; } + res.setStatus(SC_OK); + res.setContentType(CONTENTTYPE_VND_GIT_LFS_JSON); TransferHandler handler = TransferHandler .forOperation(request.operation, repo, request.objects); gson.toJson(handler.process(), w); w.flush(); } - private static class LfsRequest { - String operation; - - List objects; - } - private static Gson createGson() { GsonBuilder gb = new GsonBuilder() .setFieldNamingPolicy( diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java index 00bea86c4..c4d95481f 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/debug/LfsStore.java @@ -253,10 +253,10 @@ protected void run() throws Exception { private static final long serialVersionUID = 1L; @Override - protected LargeFileRepository getLargeFileRepository() { + protected LargeFileRepository getLargeFileRepository( + LfsRequest request, String path) { return repository; } - }; app.addServlet(new ServletHolder(protocol), PROTOCOL_PATH);