You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by kr...@apache.org on 2020/04/03 14:11:57 UTC

[knox] branch master updated: KNOX-2262 - Accessing hbase logs through knox exposes hbase endpoint url instead of routing through knox

This is an automated email from the ASF dual-hosted git repository.

krisden pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git


The following commit(s) were added to refs/heads/master by this push:
     new fd8e1bb  KNOX-2262 - Accessing hbase logs through knox exposes hbase endpoint url instead of routing through knox
fd8e1bb is described below

commit fd8e1bb8aebcb40531bdda6cf828f9d3476be6bb
Author: Toth Istvan <st...@apache.org>
AuthorDate: Fri Feb 28 13:15:52 2020 +0100

    KNOX-2262 - Accessing hbase logs through knox exposes hbase endpoint url instead of routing through knox
    
    Closes #278
    
    Signed-off-by: Kevin Risden <kr...@apache.org>
---
 .../resources/services/hbaseui/2.1.0/rewrite.xml   |  9 ++++++
 .../resources/services/hbaseui/2.1.0/service.xml   | 14 ++++----
 gateway-service-hbase/pom.xml                      | 10 ++++--
 .../apache/knox/gateway/hbase/HBaseDispatch.java   | 16 +---------
 .../{HBaseDispatch.java => HBaseRequestUtil.java}  | 31 +++++++++++-------
 .../apache/knox/gateway/hbase/HBaseUIDispatch.java | 36 +++++++++++++++++++++
 .../knox/gateway/hbase/HBaseUIHaDispatch.java      | 37 ++++++++++++++++++++++
 7 files changed, 118 insertions(+), 35 deletions(-)

diff --git a/gateway-service-definitions/src/main/resources/services/hbaseui/2.1.0/rewrite.xml b/gateway-service-definitions/src/main/resources/services/hbaseui/2.1.0/rewrite.xml
index f9d290d..ee8e9ac 100644
--- a/gateway-service-definitions/src/main/resources/services/hbaseui/2.1.0/rewrite.xml
+++ b/gateway-service-definitions/src/main/resources/services/hbaseui/2.1.0/rewrite.xml
@@ -174,6 +174,15 @@
   <rule dir="IN" name="HBASEUI/hbase/inbound/logs/files" pattern="*://*:*/**/hbase/webui/logs/{**}?{host}?{port}">
     <rewrite template="{$serviceScheme[HBASEUI]}://{$hostmap(host)}:{port}/logs/{**}"/>
   </rule>
+  <filter name="HBASEUI/hbase/outbound/logs/headers">
+    <content type="application/x-http-headers">
+      <apply path="Location" rule="HBASEUI/hbase/outbound/logs/headers-redirect"/>
+    </content>
+  </filter>
+  <rule dir="OUT" name="HBASEUI/hbase/outbound/logs/headers-redirect">
+    <match pattern="{$serviceScheme[HBASEUI]}://{host}:{port}/logs/{dir=**}/?{**}"/>
+    <rewrite template="{$frontend[url]}/hbase/webui/logs/{dir=**}/?host={$inboundurl[host]}?port={$inboundurl[port]}"/>
+  </rule>
   <rule dir="OUT" name="HBASEUI/hbase/outbound/logs" pattern="/logs">
     <rewrite template="{$frontend[url]}/hbase/webui/logs?host={$inboundurl[host]}?port={$inboundurl[port]}"/>
   </rule>
diff --git a/gateway-service-definitions/src/main/resources/services/hbaseui/2.1.0/service.xml b/gateway-service-definitions/src/main/resources/services/hbaseui/2.1.0/service.xml
index 1063f33..d23bc6f 100644
--- a/gateway-service-definitions/src/main/resources/services/hbaseui/2.1.0/service.xml
+++ b/gateway-service-definitions/src/main/resources/services/hbaseui/2.1.0/service.xml
@@ -38,12 +38,14 @@
           <rewrite apply="HBASEUI/hbase/inbound/static" to="request.url"/>
         </route>
         <!-- Define explicit routes for endpoints shared across master/regionserver -->
-        <route path="/hbase/webui/logs?{**}">
-            <rewrite apply="HBASEUI/hbase/inbound/logs" to="request.url"/>
-            <rewrite apply="HBASEUI/hbase/outbound/logs" to="response.body"/>
+        <route path="/hbase/webui/logs?">
+           <rewrite apply="HBASEUI/hbase/inbound/logs" to="request.url"/>
+           <rewrite apply="HBASEUI/hbase/outbound/logs" to="response.body"/>
         </route>
-        <route path="/hbase/webui/logs/{**}">
-            <rewrite apply="HBASEUI/hbase/inbound/logs/files" to="request.url"/>
+        <route path="/hbase/webui/logs/**">
+          <rewrite apply="HBASEUI/hbase/outbound/logs" to="response.body"/>
+          <rewrite apply="HBASEUI/hbase/inbound/logs/files" to="request.url"/>
+          <rewrite apply="HBASEUI/hbase/outbound/logs/headers" to="response.headers"/>
         </route>
         <route path="/hbase/webui/logLevel?{**}">
           <rewrite apply="HBASEUI/hbase/inbound/loglevel" to="request.url"/>
@@ -95,5 +97,5 @@
           <rewrite apply="HBASEUI/hbase/outbound/regionserver/children" to="response.body"/>
         </route>
     </routes>
-    <dispatch classname="org.apache.knox.gateway.hbase.HBaseDispatch"/>
+    <dispatch classname="org.apache.knox.gateway.hbase.HBaseUIDispatch" ha-classname="org.apache.knox.gateway.hbase.HBaseUIHaDispatch"/>
 </service>
diff --git a/gateway-service-hbase/pom.xml b/gateway-service-hbase/pom.xml
index 40917b1..ecd456f 100644
--- a/gateway-service-hbase/pom.xml
+++ b/gateway-service-hbase/pom.xml
@@ -38,12 +38,18 @@
             <groupId>org.apache.knox</groupId>
             <artifactId>gateway-provider-rewrite</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>org.apache.knox</groupId>
+            <artifactId>gateway-provider-ha</artifactId>
+        </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.knox</groupId>
             <artifactId>gateway-test-utils</artifactId>
diff --git a/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseDispatch.java b/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseDispatch.java
index 42fa1bb..cc47414 100644
--- a/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseDispatch.java
+++ b/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseDispatch.java
@@ -17,10 +17,7 @@
  */
 package org.apache.knox.gateway.hbase;
 
-import java.io.UnsupportedEncodingException;
 import java.net.URI;
-import java.net.URLDecoder;
-import java.nio.charset.StandardCharsets;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.knox.gateway.dispatch.DefaultDispatch;
@@ -35,18 +32,7 @@ public class HBaseDispatch extends DefaultDispatch {
   // KNOX-709: HBase can't handle URL encoded paths.
   @Override
   public URI getDispatchUrl(HttpServletRequest request) {
-    String base = request.getRequestURI();
-    StringBuilder str = new StringBuilder();
-    try {
-      str.append( URLDecoder.decode( base, StandardCharsets.UTF_8.name() ) );
-    } catch( UnsupportedEncodingException e ) {
-      str.append( base );
-    } String query = request.getQueryString();
-    if ( query != null ) {
-      str.append( '?' );
-      str.append( query );
-    }
-    return URI.create( str.toString() );
+    return HBaseRequestUtil.decodeUrl(request);
   }
 }
 
diff --git a/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseDispatch.java b/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseRequestUtil.java
similarity index 63%
copy from gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseDispatch.java
copy to gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseRequestUtil.java
index 42fa1bb..13552d5 100644
--- a/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseDispatch.java
+++ b/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseRequestUtil.java
@@ -21,20 +21,28 @@ import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.net.URLDecoder;
 import java.nio.charset.StandardCharsets;
+
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.knox.gateway.dispatch.DefaultDispatch;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.methods.RequestBuilder;
 
-/**
- * This used to be a specialized dispatch providing HBase specific features to the
- * default dispatch. Now it is just a marker class for backwards compatibility.
- * @deprecated Use {@link org.apache.knox.gateway.dispatch.DefaultDispatch}
- */
-@Deprecated
-public class HBaseDispatch extends DefaultDispatch {
-  // KNOX-709: HBase can't handle URL encoded paths.
-  @Override
-  public URI getDispatchUrl(HttpServletRequest request) {
+class HBaseRequestUtil {
+  // partial workaround for KNOX-799
+  public static HttpUriRequest fixTrailingSlash(HttpUriRequest outboundRequest,
+                                                HttpServletRequest inboundRequest) {
+    // preserve trailing slash from inbound request in the outbound request
+    if (inboundRequest.getPathInfo().endsWith("/")) {
+      String[] split = outboundRequest.getURI().toString().split("\\?");
+      if (!split[0].endsWith("/")) {
+        outboundRequest = RequestBuilder.copy(outboundRequest)
+            .setUri(split[0] + "/" + (split.length == 2 ? "?" + split[1] : "")).build();
+      }
+    }
+    return outboundRequest;
+  }
+
+  public static URI decodeUrl(HttpServletRequest request) {
     String base = request.getRequestURI();
     StringBuilder str = new StringBuilder();
     try {
@@ -49,4 +57,3 @@ public class HBaseDispatch extends DefaultDispatch {
     return URI.create( str.toString() );
   }
 }
-
diff --git a/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseUIDispatch.java b/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseUIDispatch.java
new file mode 100644
index 0000000..25acebe
--- /dev/null
+++ b/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseUIDispatch.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.hbase;
+
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.knox.gateway.dispatch.DefaultDispatch;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+public class HBaseUIDispatch extends DefaultDispatch {
+  @Override
+  protected void executeRequest(HttpUriRequest outboundRequest, HttpServletRequest inboundRequest,
+      HttpServletResponse outboundResponse) throws IOException {
+    // partial workaround for KNOX-799
+    outboundRequest = HBaseRequestUtil.fixTrailingSlash(outboundRequest, inboundRequest);
+    super.executeRequest(outboundRequest, inboundRequest, outboundResponse);
+  }
+}
+
diff --git a/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseUIHaDispatch.java b/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseUIHaDispatch.java
new file mode 100644
index 0000000..15996c0
--- /dev/null
+++ b/gateway-service-hbase/src/main/java/org/apache/knox/gateway/hbase/HBaseUIHaDispatch.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.hbase;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.knox.gateway.ha.dispatch.DefaultHaDispatch;
+
+public class HBaseUIHaDispatch extends DefaultHaDispatch {
+  @Override
+  protected void executeRequest(HttpUriRequest outboundRequest, HttpServletRequest inboundRequest,
+      HttpServletResponse outboundResponse) throws IOException {
+    // partial workaround for KNOX-799
+    outboundRequest = HBaseRequestUtil.fixTrailingSlash(outboundRequest, inboundRequest);
+    super.executeRequest(outboundRequest, inboundRequest, outboundResponse);
+  }
+}
+