/** * Parses the query string of the given {@code uri} and returns the resulting * {@link Parameters}. * @param uri the uri to parse * @return the parameters parsed from the query string */ public Parameters parse(URI uri) { String query = uri.getRawQuery(); if (query != null) { return parse(query); } return new Parameters(); }
/** * Returns a new {@code Parameters} containing only the parameters that do no appear * in the query string of the given {@code uri}. * @param uri the uri * @return the unique parameters */ public Parameters getUniqueParameters(URI uri) { Parameters queryStringParameters = new QueryStringParser().parse(uri); Parameters uniqueParameters = new Parameters(); for (Map.Entry<String, List<String>> parameter : entrySet()) { addIfUnique(parameter, queryStringParameters, uniqueParameters); } return uniqueParameters; }
private void processParameter(String parameter, Parameters parameters) { String[] components = parameter.split("="); if (components.length > 0 && components.length < 3) { if (components.length == 2) { String name = components[0]; String value = components[1]; parameters.add(decode(name), decode(value)); } else { List<String> values = parameters.get(components[0]); if (values == null) { parameters.put(components[0], new LinkedList<String>()); } } } else { throw new IllegalArgumentException( "The parameter '" + parameter + "' is malformed"); } }
private Parameters parse(String query) { Parameters parameters = new Parameters(); try (Scanner scanner = new Scanner(query)) { scanner.useDelimiter("&"); while (scanner.hasNext()) { processParameter(scanner.next(), parameters); } } return parameters; }
@Test public void noParameters() { Parameters parameters = this.queryStringParser .parse(URI.create("http://localhost")); assertThat(parameters.size()).isEqualTo(0); }
@Test public void encoded() { Parameters parameters = this.queryStringParser .parse(URI.create("http://localhost?a=al%26%3Dpha")); assertThat(parameters.size()).isEqualTo(1); assertThat(parameters).containsEntry("a", Arrays.asList("al&=pha")); }
@Test public void singleParameter() { Parameters parameters = this.queryStringParser .parse(URI.create("http://localhost?a=alpha")); assertThat(parameters.size()).isEqualTo(1); assertThat(parameters).containsEntry("a", Arrays.asList("alpha")); }
@Test public void multipleParametersWithSameKey() { Parameters parameters = this.queryStringParser .parse(URI.create("http://localhost?a=apple&a=avocado")); assertThat(parameters.size()).isEqualTo(1); assertThat(parameters).containsEntry("a", Arrays.asList("apple", "avocado")); }
@Test public void multipleParameters() { Parameters parameters = this.queryStringParser .parse(URI.create("http://localhost?a=alpha&b=bravo&c=charlie")); assertThat(parameters.size()).isEqualTo(3); assertThat(parameters).containsEntry("a", Arrays.asList("alpha")); assertThat(parameters).containsEntry("b", Arrays.asList("bravo")); assertThat(parameters).containsEntry("c", Arrays.asList("charlie")); }
@Test public void malformedParameter() { this.thrown.expect(IllegalArgumentException.class); this.thrown .expectMessage(equalTo("The parameter 'a=apple=avocado' is malformed")); this.queryStringParser.parse(URI.create("http://localhost?a=apple=avocado")); }
private Parameters extractParameters(ExchangeResult result) { Parameters parameters = new Parameters(); parameters.addAll(this.queryStringParser.parse(result.getUrl())); if (MediaType.APPLICATION_FORM_URLENCODED .isCompatibleWith(result.getRequestHeaders().getContentType())) { parameters.addAll(this.formDataReader .readMono(FORM_DATA_TYPE, new ExchangeResultReactiveHttpInputMessage(result), null) .block()); } return parameters; }