Hi ,

I tried to integrate grafana UI with knox gateway. I used URLDecodingDispatch 
class but there were some calls which were failing like:

http://platacc002-mgt-01.gvs.ggn:3000/api/datasources/proxy/1/ws/v1/timeline/metrics?metricNames=dfs.NNTopUserOpCounts.windowMs=1500000.op=__%.user=%&hostname=%25&appId=namenode&startTime=1534390641&endTime=1534401441


The above call on grafana UI failed with below error:

Caused by: java.lang.IllegalArgumentException: Malformed escape pair at index 
141: 
http://platacc002-mgt-01.gvs.ggn:3000/api/datasources/proxy/1/ws/v1/timeline/metrics?metricNames=dfs.NNTopUserOpCounts.windowMs=1500000.op=__%.user=%&hostname=%25&appId=namenode&startTime=1534390641&endTime=1534401441
at java.net.URI.create(URI.java:852)
at knoxdisp.URLDecodingDispatch.getDispatchUrl(URLDecodingDispatch.java:49)
at 
org.apache.hadoop.gateway.dispatch.GatewayDispatchFilter$GetAdapter.doMethod(GatewayDispatchFilter.java:132)
at 
org.apache.hadoop.gateway.dispatch.GatewayDispatchFilter.doFilter(GatewayDispatchFilter.java:115)
at 
org.apache.hadoop.gateway.filter.AbstractGatewayFilter.doFilter(AbstractGatewayFilter.java:61)
... 76 more


Now instead of making rewrite rules for each of such URL, I decided to change 
the dispatcher class itself to handle requests with special characters. In 
dispatcher class I added URL encoding to encode all the special characters.
Below is the code that I tried:


@Override

  public URI getDispatchUrl(final HttpServletRequest request) {

    String decoded;

    String encodedURL = null;


    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 ) {

      try {

encodedURL = URLEncoder.encode(query,"UTF-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}


      str.append('?');

      str.append(encodedURL);



    }

    final URI url = URI.create(str.toString());

    return url;

  }

}



Now after making these changes, malformed error is resolved and all URLs gets 
encoded like :


 Dispatch request: GET 
http://platacc002-mgt-01.gvs.ggn:3000/api/datasources/proxy/1/ws/v1/timeline/metrics?metricNames%3Ddfs.NNTopUserOpCounts.windowMs%3D1500000.op%3D__%25.user%3D%25%26hostname%3D%2525%26appId%3Dnamenode%26startTime%3D1534400120%26endTime%3D1534410920



But the calls still doesn’t work. It throws HTTP Error code: 400 (Bad Request). 
 Can anyone help me to resolve these calls.



Thanks

Divya

Reply via email to