Repository: jena Updated Branches: refs/heads/master 930d4d333 -> 2a5381f9f
Detect Fuseki by request id. Remove dev logging. Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/2a5381f9 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/2a5381f9 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/2a5381f9 Branch: refs/heads/master Commit: 2a5381f9ff7e7581b1c6dde5e484ddcd486a7286 Parents: 930d4d3 Author: Andy Seaborne <[email protected]> Authored: Thu Mar 29 16:36:30 2018 +0100 Committer: Andy Seaborne <[email protected]> Committed: Thu Mar 29 16:36:30 2018 +0100 ---------------------------------------------------------------------- .../java/org/apache/jena/fuseki/FusekiLib.java | 56 ++++++++++++-------- .../TestRDFConnectionFusekiBinary.java | 15 ++---- 2 files changed, 39 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/2a5381f9/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLib.java ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLib.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLib.java index c0346e5..2da827b 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLib.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/FusekiLib.java @@ -24,6 +24,7 @@ import java.util.Iterator ; import javax.servlet.http.HttpServletRequest ; +import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpOptions; @@ -275,9 +276,12 @@ public class FusekiLib { } } - /** Test whether a URL identifies a Fuseki server */ + /** + * Test whether a URL identifies a Fuseki server. This operation can not guaranttee to + * detech a Fuseki server - for example, it may be behind a reverse proxy that masks + * the signature. + */ public static boolean isFuseki(String datasetURL) { - System.err.println("isFuseki: "+datasetURL); HttpOptions request = new HttpOptions(datasetURL); HttpClient httpClient = HttpOp.getDefaultHttpClient(); if ( httpClient == null ) @@ -285,7 +289,11 @@ public class FusekiLib { return isFuseki(request, httpClient, null); } - /** Test whether a {@link RDFConnectionRemote} connects to a Fuseki server */ + /** + * Test whether a {@link RDFConnectionRemote} connects to a Fuseki server. This + * operation can not guaranttee to detech a Fuseki server - for example, it may be + * behind a reverse proxy that masks the signature. + */ public static boolean isFuseki(RDFConnectionRemote connection) { HttpOptions request = new HttpOptions(connection.getDestination()); HttpClient httpClient = connection.getHttpClient(); @@ -296,28 +304,34 @@ public class FusekiLib { } private static boolean isFuseki(HttpOptions request, HttpClient httpClient, HttpContext httpContext) { - System.err.println("isFuseki(worker)"); - if ( httpClient == null ) { - System.err.println("httpClient is null"); - } try { HttpResponse response = httpClient.execute(request); - // Fuseki-Request-ID: - //String reqId = response.getFirstHeader("Fuseki-Request-ID").getValue(); - // Server: - System.err.println("isFuseki(worker)-1"); - String serverIdent = response.getFirstHeader("Server").getValue(); - System.err.println("isFuseki(worker)-2"); - Log.debug(ARQ.getHttpRequestLogger(), "Server: "+serverIdent); - System.err.println("isFuseki(worker)-3"); - boolean isFuseki = serverIdent.startsWith("Apache Jena Fuseki"); - System.err.println("isFuseki(worker)-4"); - if ( !isFuseki ) - isFuseki = serverIdent.toLowerCase().contains("fuseki"); - System.err.println("isFuseki(worker)-return"); - return isFuseki; // Maybe + // Fuseki does not send "Server" in release mode. + // (best practice). + // All we can do is try for the "Fuseki-Request-ID" + String reqId = safeGetHeader(response, "Fuseki-Request-ID"); + if ( reqId != null ) + return true; + + // If returning "Server" + String serverIdent = safeGetHeader(response, "Server"); + if ( serverIdent != null ) { + Log.debug(ARQ.getHttpRequestLogger(), "Server: "+serverIdent); + boolean isFuseki = serverIdent.startsWith("Apache Jena Fuseki"); + if ( !isFuseki ) + isFuseki = serverIdent.toLowerCase().contains("fuseki"); + return isFuseki; + } + return false; } catch (IOException ex) { throw new HttpException("Failed to check for a Fuseki server", ex); } } + + private static String safeGetHeader(HttpResponse response, String header) { + Header h = response.getFirstHeader(header); + if ( h == null ) + return null; + return h.getValue(); + } } http://git-wip-us.apache.org/repos/asf/jena/blob/2a5381f9/jena-integration-tests/src/test/java/org/apache/jena/test/rdfconnection/TestRDFConnectionFusekiBinary.java ---------------------------------------------------------------------- diff --git a/jena-integration-tests/src/test/java/org/apache/jena/test/rdfconnection/TestRDFConnectionFusekiBinary.java b/jena-integration-tests/src/test/java/org/apache/jena/test/rdfconnection/TestRDFConnectionFusekiBinary.java index 1a0d502..9619798 100644 --- a/jena-integration-tests/src/test/java/org/apache/jena/test/rdfconnection/TestRDFConnectionFusekiBinary.java +++ b/jena-integration-tests/src/test/java/org/apache/jena/test/rdfconnection/TestRDFConnectionFusekiBinary.java @@ -51,22 +51,15 @@ public class TestRDFConnectionFusekiBinary { model.getGraph().add(triple); int PORT = FusekiLib.choosePort(); - FusekiServer server = createFusekiServer(PORT).build().start(); + FusekiServer server = createFusekiServer(PORT).build().start(); try { String dsURL = "http://localhost:"+PORT+"/ds" ; - { - System.err.println("dsURL="+dsURL); - boolean b1 = FusekiLib.isFuseki(dsURL); - assertTrue("isFuseki(1)", b1) ; - } - System.err.println("builder"); + assertTrue(FusekiLib.isFuseki(dsURL)); + RDFConnectionRemoteBuilder builder = RDFConnectionFuseki.create().destination(dsURL); try (RDFConnectionFuseki conn = (RDFConnectionFuseki)builder.build()) { - { - boolean b2 = FusekiLib.isFuseki(conn); - assertTrue("isFuseki(2)", b2); - } + assertTrue(FusekiLib.isFuseki(conn)); // GSP conn.put(model); checkModel(conn, "b3456");
