I have made the necessary modifications to use my custom dispatcher.
However I am getting NPE from HttpServletRequest.getRequestURL() when the
queryString contains special characters like "amp%3B". In this case the
request object is null.

Any suggestions?

Regards,

On Thu, Sep 6, 2018 at 2:36 PM Sandeep Moré <moresand...@gmail.com> wrote:

> You can extend RMUIHaDispatch class and override getDispatchUrl() method
> from URLDecodingDispatch
>
> Best,
> Sandeep
>
> On Thu, Sep 6, 2018 at 2:28 PM Theyaa Matti <theyaama...@gmail.com> wrote:
>
>> Yes I am using HA for resource manager and in that case what should I do
>> to the fix this issue?
>>
>> Best,
>>
>> Theyaa.
>>
>>
>> On Thu, Sep 6, 2018 at 2:24 PM Sandeep Moré <moresand...@gmail.com>
>> wrote:
>>
>>> Are you using HA setup ? in which case org.apache.
>>> hadoop.gateway.rm.dispatch.RMUIHaDispatch dispatch will be used.
>>>
>>> On Thu, Sep 6, 2018 at 2:19 PM Theyaa Matti <theyaama...@gmail.com>
>>> wrote:
>>>
>>>> I created the class as follows:
>>>>
>>>> package org.apache.knox.gateway.dispatch;
>>>>
>>>> import javax.servlet.http.HttpServletRequest;
>>>> import java.net.URI;
>>>> import java.net.URLDecoder;
>>>> import org.apache.hadoop.gateway.dispatch.DefaultDispatch;
>>>>
>>>> /**
>>>>  * Dispatch which decodes the outgoing URLs (to services).
>>>>  * This is useful in cases where the url is picked up
>>>>  * from the query parameter and is already encoded.
>>>>  *
>>>>  * @since 1.1.0
>>>>  */
>>>> public class URLDecodingDispatch extends DefaultDispatch {
>>>>
>>>>     public URLDecodingDispatch() {
>>>>         super();
>>>>     }
>>>>
>>>>     @Override
>>>>     public URI getDispatchUrl(final HttpServletRequest request) {
>>>>         String decoded;
>>>>
>>>>         try {
>>>>             decoded = 
>>>> URLDecoder.decode(request.getRequestURL().toString(), "UTF-8" );
>>>>         } catch (final Exception e) {
>>>>       /* fall back in case of exception */
>>>>             decoded = request.getRequestURL().toString();
>>>>         }
>>>>
>>>>         final StringBuffer str = new StringBuffer(decoded);
>>>>         final String query = request.getQueryString();
>>>>         if ( query != null ) {
>>>>             str.append('?');
>>>>             str.append(query);
>>>>         }
>>>>         final URI url = URI.create(str.toString());
>>>>         return url;
>>>>     }
>>>> }
>>>>
>>>>
>>>> packaged it into a jar and uploaded it to the knox lib dir. I can see
>>>> Knox loading the jar file at start:
>>>> resource.FileResource (FileResource.java:checkFileAlias(152)) - ALIAS
>>>> abs=/knox/bin/../lib/knox-1.0-SNAPSHOT.jar
>>>> can=/knox/lib/knox-1.0-SNAPSHOT.jar
>>>>
>>>> I modified the service.xml for yarnui as follows.
>>>>
>>>> <dispatch classname="org.apache.knox.gateway.dispatch.URLDecodingDispatch"
>>>> ha-classname="org.apache.hadoop.gateway.rm.dispatch.RMUIHaDispatch"/>
>>>>
>>>>
>>>>
>>>> Deleted everything under deployments and restarted knox.
>>>>
>>>>
>>>> I do not see any changes in the behavior and do not see that class
>>>> being called. Do you please know what I am missing?
>>>>
>>>>
>>>> Regards,
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Thu, Sep 6, 2018 at 9:38 AM Sandeep Moré <moresand...@gmail.com>
>>>> wrote:
>>>>
>>>>> URLDecodingDispatch extends DefaultDispatch so you should be there.
>>>>>
>>>>> Best,
>>>>> Sandeep
>>>>>
>>>>> On Thu, Sep 6, 2018 at 9:32 AM Theyaa Matti <theyaama...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> That should be a good idea, but I still have an issue with adding the
>>>>>> custom dispatch to the yarnui service.xml. I already have an existing 
>>>>>> class
>>>>>> there <dispatch 
>>>>>> classname="org.apache.hadoop.gateway.dispatch.DefaultDispatch"
>>>>>> ha-classname="org.apache.hadoop.gateway.rm.dispatch.RMUIHaDispatch"/>
>>>>>>
>>>>>> Should I replace the DefaultDispatch or I can have more than one
>>>>>> there?
>>>>>>
>>>>>> Regards,
>>>>>>
>>>>>>
>>>>>> On Tue, Sep 4, 2018 at 10:14 PM Dhruv Goyal <777.dh...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> In that case you might have to build the jar yourself or preferably
>>>>>>> use your custom dispatch similar to URLDecodingDispatch.
>>>>>>>
>>>>>>> Regards
>>>>>>> Dhruv
>>>>>>>
>>>>>>> On Wednesday, September 5, 2018, Theyaa Matti <theyaama...@gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Sorry 0.12.0
>>>>>>>>
>>>>>>>> On Tue, Sep 4, 2018 at 2:30 PM Theyaa Matti <theyaama...@gmail.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> I am using Knox 1.12.0
>>>>>>>>>
>>>>>>>>> On Tue, Sep 4, 2018 at 2:28 PM Sandeep Moré <moresand...@gmail.com>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> You can try
>>>>>>>>>> using "org.apache.knox.gateway.dispatch.URLDecodingDispatch" 
>>>>>>>>>> dispatch in
>>>>>>>>>> service.xml ( Knox 1.1.0)
>>>>>>>>>>
>>>>>>>>>> Best,
>>>>>>>>>> Sandeep
>>>>>>>>>>
>>>>>>>>>> On Tue, Sep 4, 2018 at 2:09 PM Theyaa Matti <
>>>>>>>>>> theyaama...@gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> I am having issues with Knox encoding the following URL when
>>>>>>>>>>> parsing html content.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> /proxy/application_222233323323_0001/stages/stage?id=0&amp;attempt=0
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> This URL is generated by Yarn to track a running spark job. When
>>>>>>>>>>> applying regular rules to the above URL, Knox encodes the URL to:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> /proxy/application_222233323323
>>>>>>>>>>> _0001/stages/stage?amp%3Battempt=0&id=0
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Which makes the URL unusable and leads to a 404. To make the URL
>>>>>>>>>>> work I have to remove "amp%3B" and then it works.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Below are the filter and the rule I am using for this URL and I
>>>>>>>>>>> appreciate your help/comments for a remediation.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> <filter name="YARNUI/yarn/outbound/apps1">
>>>>>>>>>>>     <content type="*/html">
>>>>>>>>>>>         <apply path="/proxy/[^']+/stages/stage[^']*" 
>>>>>>>>>>> rule="YARNUI/yarn/outbound/apps/history3"/>
>>>>>>>>>>>     </content>
>>>>>>>>>>> </filter>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> <rule dir="OUT" name="YARNUI/yarn/outbound/apps/history3">
>>>>>>>>>>>     <match pattern="/proxy/{*}/stages/stage?{**}"/>
>>>>>>>>>>>     <rewrite 
>>>>>>>>>>> template="{$frontend[url]}/yarn/proxy/{*}/stages/stage?{**}"/>
>>>>>>>>>>> </rule>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thank you for your help.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>

Reply via email to