[ 
https://issues.apache.org/jira/browse/KNOX-2531?focusedWorklogId=543464&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-543464
 ]

ASF GitHub Bot logged work on KNOX-2531:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 28/Jan/21 09:11
            Start Date: 28/Jan/21 09:11
    Worklog Time Spent: 10m 
      Work Description: iain-buclaw-sociomantic commented on a change in pull 
request #399:
URL: https://github.com/apache/knox/pull/399#discussion_r565929389



##########
File path: 
gateway-service-definitions/src/main/resources/services/yarnui/2.7.0/rewrite.xml
##########
@@ -207,7 +207,7 @@
 </filter>
 <filter name="YARNUI/yarn/outbound/filter/cluster">
     <content type="*/html">
-        <apply 
path="(https?://[^/':,]+:[\d]+)?/ws/v1/cluster/apps/application" 
rule="YARNUI/yarn/outbound/apps/cluster1"/>
+        <apply path="https?://[^/':,]+:[\d]+/ws/v1/cluster/apps/application" 
rule="YARNUI/yarn/outbound/apps/cluster1"/>

Review comment:
       So, the following two regexes:
   ```
   (https?://[^/':,]+:[\d]+)?/ws/v1/cluster/apps/application
   /ws/v1/.*
   ```
   Both match the following link of the kill button in YARN.
   ```
   /ws/v1/cluster/apps/application_1611223368889_0003/state
   ```
   You can confirm this here https://regex101.com/r/QkGNeb/1
   
   Because of this, both the `outbound/apps/cluster1` and `outbound/ws1` rules 
got applied on the link, resulting in a broken URL.
   
   What this change does is make `https?://[^/':,]+:[\d]+` an _explicit_ match, 
rather than an optional one, so the `outbound/apps/cluster1` rule will now only 
ever be applied to links in the form of:
   ```
   http://some-internal-domain:1234/ws/v1/cluster/apps/application
   ```




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Issue Time Tracking
-------------------

    Worklog Id:     (was: 543464)
    Time Spent: 1h 50m  (was: 1h 40m)

> Kill Application button in YARN does not work through KNOX
> ----------------------------------------------------------
>
>                 Key: KNOX-2531
>                 URL: https://issues.apache.org/jira/browse/KNOX-2531
>             Project: Apache Knox
>          Issue Type: Bug
>    Affects Versions: 1.4.0
>            Reporter: Iain Buclaw
>            Priority: Major
>         Attachments: image-2021-01-21-12-25-56-040.png
>
>          Time Spent: 1h 50m
>  Remaining Estimate: 0h
>
> I think the fix is similar to KNOX-2456.
> The Kill Application button
> !image-2021-01-21-12-25-56-040.png!
> Ends up being rewritten as: 
> [https://host:443/gateway/proxy/yarnhttps:/host:443/gateway/proxy/yarn/ws/v1/cluster/apps/application_1611223368889_0003/state|https://host/gateway/proxy/yarnhttps:/host:443/gateway/proxy/yarn/ws/v1/cluster/apps/application_1611223368889_0003/state]
> Debug logs show:
> {code:java}
> 2021-01-21 10:20:05,069 DEBUG knox.gateway 
> (UrlRewriteProcessor.java:rewrite(164)) - Rewrote URL: 
> /ws/v1/cluster/apps/application, direction: OUT via explicit rule: 
> YARNUI/yarn/outbound/apps/cluster1 to URL: 
> https://host:443/gateway/proxy/yarn/ws/v1/cluster/apps/application
> 2021-01-21 10:20:05,070 DEBUG knox.gateway 
> (UrlRewriteProcessor.java:rewrite(164)) - Rewrote URL: 
> /ws/v1/cluster/apps/application_1611223368889_0003/state', contentType: 
> 'application/json', data: '{"state":"KILLED"}', dataType: 'json' 
> }).done(function(data){ setTimeout(function(){ location.href = 
> '/cluster/app/application_1611223368889_0003'; }, 1000); 
> }).fail(function(data){ console.log(data); }); }}, direction: OUT via 
> explicit rule: YARNUI/yarn/outbound/ws1 to URL: 
> https://host:443/gateway/proxy/yarn/ws/v1/cluster/apps/application_1611223368889_0003/state',
>  contentType: 'application/json', data: '{"state":"KILLED"}', dataType: 
> 'json' }).done(function(data){ setTimeout(function(){ location.href = 
> '/cluster/app/application_1611223368889_0003'; }, 1000); 
> }).fail(function(data){ console.log(data); }); }}
> 2021-01-21 11:27:02,958 DEBUG knox.gateway 
> (UrlRewriteProcessor.java:rewrite(164)) - Rewrote URL: 
> /cluster/app/application, direction: OUT via explicit rule: 
> YARNUI/yarn/outbound/cluster/app/application to URL: 
> https://host:443/gateway/proxy/yarn/cluster/app/application
> 2021-01-21 10:20:05,071 TRACE knox.gateway 
> (UrlRewriteProcessor.java:rewrite(167)) - Failed to rewrite URL: 
> https://host:443/gateway/proxy/yarnhttps:/host:443/gateway/proxy/yarn/ws/v1/cluster/apps/application_1611223368889_0003/state,
>  direction: OUT via rule: YARNUI/yarn/outbound/node2, status: FAILURE
> {code}
> This suggests that the original URL path is rewritten twice.
> I suspect it is these two filter rules that's doing the double rewrite.
> {code:java}
> <filter name="YARNUI/yarn/outbound/filter/cluster">
>     <content type="*/html">
>         <apply 
> path="(https?://[^/':,]+:[\d]+)?/ws/v1/cluster/apps/application" 
> rule="YARNUI/yarn/outbound/apps/cluster1"/>
>         <apply path="/ws/v1/.*" rule="YARNUI/yarn/outbound/ws1"/>
>         <!-- snip -->
>     </content>
> </filter>
> {code}
> Originally, it is: /ws/v1/cluster/apps/application_1611223368889_0003/state
> The first apply path rule matches and rewrites it to: 
> [https://host:443/gateway/proxy/yarn/ws/v1/cluster/apps/application_1611223368889_0003/state|https://host/gateway/proxy/yarn/ws/v1/cluster/apps/application_1611223368889_0003/state]
> The second apply rule also matches and rewrites it to: 
> [https://host:443/gateway/proxy/yarnhttps:/host:443/gateway/proxy/yarn/ws/v1/cluster/apps/application_1611223368889_0003/state|https://host/gateway/proxy/yarnhttps:/host:443/gateway/proxy/yarn/ws/v1/cluster/apps/application_1611223368889_0003/state]
> The broken link is then passed through the rewrite rule processor again, 
> doesn't match anything, so a FAILURE logline is written.
>  
> The final output of the filtered html is:
> {code:java}
> <button onclick="confirmAction()"><b>Kill Application</b></button>
> <script type="text/javascript">
>             function confirmAction() { b = confirm("Are you sure?"); if (b == 
> true) { $.ajax({ type: 'PUT', url: 
> 'https://host:443/gateway/proxy/yarnhttps://host:443/gateway/proxy/yarn/ws/v1/cluster/apps/application_1611223368889_0004/state',
>  contentType: 'application/json', data: '{"state":"KILLED"}', dataType: 
> 'json' }).done(function(data){ setTimeout(function(){ location.href = 
> 'https://host:443/gateway/proxy/yarn/cluster/app/application_1611223368889_0004';
>  }, 1000); }).fail(function(data){ console.log(data); }); }}
>           </script>
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to