Ah, I see.
Your filter is for content type JSON, you need one for javascript,
something like

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

Few things to note:
1. Since I haven't seen the JS file I going by the assumption that
there is a JS file with "production/datapoints" that needs to be
rewritten
2. You will have to double check the exact content type you are
getting i.e. application/x-javascript, text/javascript etc.

Best,
Sandeep


On Fri, May 3, 2019 at 7:50 AM Odon Copon <[email protected]> wrote:
>
> 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