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);
+ }
+}
+