[
https://issues.apache.org/jira/browse/KNOX-447?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14173824#comment-14173824
]
Kevin Minder commented on KNOX-447:
-----------------------------------
I played with your test this morning and it is a bug plain and (well not so
simple). The way we tear apart and rebuilt URLs has some dark corners. If the
output had been
https://webhcatTestHost.com:50111/templeton/v1/?version/hive=
I might have even said it was technically correct but
https://webhcatTestHost.com:50111/templeton/v1/?version/hive=null
Is just wrong.
The bottom line is that the URL parser isn't recording the fact that there is a
query parameter without an equal sign or value well enough. As a result, when
it is used in the expansion template via the {**}, the implied equal sign and
value of the original query parameter are used. Two problems here: 1) The
implied/default value should be the empty string not null and 2) the equal sign
should not be output if it wasn't in the original URL.
BTW, you can prove this by changing your test's inputUri to
https://knoxHost:8443/gateway/knoxTopo/templeton/v1/?version/hive=foo
and then your test's assertion to
https://webhcatTestHost.com:50111/templeton/v1/?version/hive=foo
> Incorrect parsing and expansion of valueless query params
> ----------------------------------------------------------
>
> Key: KNOX-447
> URL: https://issues.apache.org/jira/browse/KNOX-447
> Project: Apache Knox
> Issue Type: Bug
> Components: Server
> Affects Versions: 0.4.0
> Reporter: Kevin Minder
> Fix For: 0.5.0
>
>
> Parser.parse produces a result with Query object that contains an array of
> one null value which is incorrect.
> The test below failed with this assertion failure
> {code}
> Assertion failure:
> Expected:
> equalToIgnoringCase("https://webhcatTestHost.com:50111/templeton/v1/?version/hive")
> but: was
> https://webhcatTestHost.com:50111/templeton/v1/?version/hive=null
> {code}
> {code:java}
> @Test
> public void testValuelessQueryParamParsingAndExpansion() throws Exception {
> URI inputUri, outputUri;
> Matcher<Void> matcher;
> Matcher<Void>.Match match;
> Template input, pattern, template;
> Evaluator evaluator;
> inputUri = new URI(
> "https://knoxHost:8443/gateway/knoxTopo/templeton/v1/?version/hive" );
> input = Parser.parse( inputUri.toString() );
> pattern = Parser.parse( "*://*:*/**/templeton/v1/?{**}" );
> template = Parser.parse( "{$serviceUrl[WEBHCAT]}/v1/?{**}" );
> matcher = new Matcher<Void>();
> matcher.add( pattern, null );
> match = matcher.match( input );
> evaluator = new Evaluator() {
> @Override
> public List<String> evaluate( String function, List<String> parameters
> ) {
> return Arrays.asList( "https://webhcatTestHost.com:50111/templeton" );
> }
> };
> outputUri = Expander.expand( template, match.getParams(), evaluator );
> assertThat(
> outputUri.toString(),
> equalToIgnoringCase(
> "https://webhcatTestHost.com:50111/templeton/v1/?version/hive" ) );
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)