Hi,
Thanks Sandeep for your help.
When I meant by JSON I was referring to the response from the API, but I
don't need to fix that. Is the call to retrieve the JSON what's wrong here.
The UI is a React application, and one of the React components, when it's
rendered, is triggering the API call. But, in the end, is a javascript file.


This the following:

<filter name="FERRERORUI/ferrerorui/outbound/requests/filter">
        <content type="application/json">
            <apply path="production/datapoints"
rule="FERRERORUI/ferrerorui/outbound/requests"/>
        </content>
</filter>


  <rule dir="OUT" name="FERRERORUI/ferrerorui/outbound/requests" >
    <rewrite template="{$serviceUrl[FERRERORUI]}/production/datapoints"/>
  </rule>

And was expecting that any javascript containing "production/datapoints"
would match the filter and rewrite the url for
"{$serviceUrl[FERRERORUI]}/production/datapoints", but that doesn't seem to
work.
Thanks.

On Thu, 2 May 2019 at 14:18, Sandeep Moré <[email protected]> wrote:

> Hello Odon,
> So, do you get a JSON response that has '/production/datapoints' path
> or is this an HTML ?
> We need to zero on what the file is that has those links (I don't have
> much experience with React so don't know how the UI is rendered).
>
> One thing you can do is try to use CURL commands and see which urls
> are not getting rewritten properly.
>
> About the "path"  attribute in the filter/apply element, that is used
> for pattern matching and depending on the content-type you will need
> to choose the regex
> For parsing JSON documents Knox uses JSONPATH [1]
> see [2] for more details on rewriting
>
> [1] http://goessner.net/articles/JsonPath/
> [2]
> https://cwiki.apache.org/confluence/display/KNOX/2017/08/14/Understanding+Rewrite+Rules+for+Apache+Knox#UnderstandingRewriteRulesforApacheKnox-JSONParsing
>
> On Thu, May 2, 2019 at 6:56 AM Odon Copon <[email protected]> wrote:
> >
> > Any input on this?
> > Thanks
> >
> > On Tue, 30 Apr 2019, 11:39 Odon Copon, <[email protected]> wrote:
> >>
> >> Hi Sandeep,
> >> The response from the UI for everything looks good, except for the
> information rendered from those graphs.
> >> The requests to generate those graphs, from what I see on the errors,
> are GET petitions to that API I mentioned before that get back a JSON.
> Those petitions have the following information:
> >>
> >> GET /production/datapoints HTTP/1.1
> >> Host: knox:12002
> >> Connection: keep-alive
> >> Accept: */*
> >> X-Requested-With: XMLHttpRequest
> >> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0)
> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
> >> Referer: http://knox:12002/gateway/test/ferrerorui/site/
> >> Accept-Encoding: gzip, deflate
> >> Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
> >>
> >> And, obviously, I'm getting a 404 back from Knox, because
> knox:12002/production/datapoints is not there, it should be
> knox:12002/gateway/test/ferrerorapi/production/datapoints.
> >> But I don't really know how to make that with filters. Would it require
> something like the following?
> >>
> >> <filter name="FERRERORUI/ferrerorui/outbound/requests/filter">
> >>         <content type="application/json">
> >>             <apply path="???"
> rule="FERRERORUI/ferrerorui/outbound/requests"/>
> >>         </content>
> >> </filter>
> >>
> >> What does the path mean on a filter? Isn't this "apply" already
> pointing to a rule that contains a "path" and a "rewrite"?
> >>
> >> Thanks.
> >>
> >> On Tue, 30 Apr 2019 at 03:36, Sandeep Moré <[email protected]>
> wrote:
> >>>
> >>> Hello Odon,
> >>>
> >>> What does the response from the the ferrero UI look like? for the last
> rewrite rule, looks like you are having issues rewriting outbound requests,
> what response are you dealing with, JSON, HTML, plain text ? depending on
> that you probably need to add a filter for that specific content type. I
> think you are very close !
> >>>
> >>> Best,
> >>> Sandeep
> >>>
> >>>
> >>> On Mon, Apr 29, 2019 at 1:47 PM Odon Copon <[email protected]>
> wrote:
> >>>>
> >>>> Hi,
> >>>> I have been following the steps from
> https://cwiki.apache.org/confluence/display/KNOX/Proxying+a+UI+using+Knox
> but I'm having some issue making something work, so would double check with
> you to understand if I'm making wrong assumptions.
> >>>> I have a UI made with React which URL is ferrerorui:8080/site/ that
> contains some graphs generated by some requests to
> ferrerorapi/production/datapoints. When I put Knox in place, I can access
> the UI by accessing knox:12002/gateway/test/ferrerorui/site/ and also I can
> send requests to the API by doing
> knox:12002/gateway/test/ferrerorapi/production/datapoints.
> >>>>
> >>>>
> >>>> This is the service defined (ferrerorapi, the API the UI consumes):
> >>>>
> >>>> service.xml
> >>>>
> >>>> <service role="FERRERORAPI" name="ferrerorapi" version="0.0.1">
> >>>>   <routes>
> >>>>     <route path="/ferrerorapi/**"/>
> >>>>   </routes>
> >>>> </service>
> >>>>
> >>>> rewrite.xml
> >>>>
> >>>> <rules>
> >>>>   <rule dir="IN" name="FERREORAPI/ferrerorapi/inbound"
> pattern="*://*:*/**/ferrerorapi/{path=**}?{**}">
> >>>>     <rewrite template="{$serviceUrl[FERRERORAPI]}/{path=**}?{**}"/>
> >>>>   </rule>
> >>>> </rules>
> >>>>
> >>>>
> >>>> Obviously, the API requests that generate the graphs are all failing
> with 404 when I access the UI, because they are hitting
> knox:12002/production/datapoints instead of
> knox:12002/gateway/test/ferrerorapi/production/datapoints
> >>>>
> >>>>
> >>>> This is the UI service:
> >>>>
> >>>> service.xml
> >>>>
> >>>> <service role="FERREORUI" name="ferrerorui" version="0.0.1">
> >>>>   <routes>
> >>>>     <route path="/ferrerorui"/>
> >>>>     <route path="/ferrerorui/**"/>
> >>>>           <rewrite apply="FERRERORUI/ferrerorui/outbound/requests"
> to="response.body"/>
> >>>>   </routes>
> >>>> </service>
> >>>>
> >>>> rewrite.xml
> >>>>
> >>>> <rules>
> >>>>     <rule dir="IN" name="FERRERORUI/ferrerorui/inbound/root"
> pattern="*://*:*/**/ferrerorui/">
> >>>>     <rewrite template="{$serviceUrl[FERRERORUI]}/"/>
> >>>>   </rule>
> >>>>   <rule dir="IN" name="FERRERORUI/ferrerorui/inbound/path"
> pattern="*://*:*/**/ferrerorui/{path=**}?{**}">
> >>>>     <rewrite template="{$serviceUrl[FERRERORUI]}/{path=**}?{**}"/>
> >>>>   </rule>
> >>>>   <rule dir="OUT" name="FERRERORUI/ferrerorui/outbound/requests"
> pattern="*://*:*/**/production/{path=**}?{**}">
> >>>>     <rewrite template="{$serviceUrl[FERRERORUI]}/{path=**}?{**}"/>
> >>>>   </rule>
> >>>> </rules>
> >>>>
> >>>>
> >>>> Tried with this last rewrite to convert on the UI, everything that
> had production as part of the path (api call) to be rewritten, but doesn't
> seem to work. The API call from the UI still don't contain the missing
> "gateway/test/ferrerorapi/".
> >>>>
> >>>> Is there anything that you spot that I'm not doing correctly?
> >>>> Thanks.
>

Reply via email to