blob: 1a9951bb14c7f9711d48fd950d6c8732544ef499 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.rpc.protocol.rest;
import io.netty.handler.codec.http.DefaultFullHttpRequest;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpVersion;
import org.apache.dubbo.rpc.protocol.rest.request.NettyRequestFacade;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
public class NettyRequestFacadeTest {
@Test
void testMethod() {
String uri = "/a/b?c=c&d=d";
DefaultFullHttpRequest defaultFullHttpRequest =
new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri);
defaultFullHttpRequest.headers().add("h1", "a");
defaultFullHttpRequest.headers().add("h1", "b");
defaultFullHttpRequest.headers().add("h2", "c");
NettyRequestFacade nettyRequestFacade = new NettyRequestFacade(defaultFullHttpRequest, null);
Assertions.assertArrayEquals(new String[] {"c"}, nettyRequestFacade.getParameterValues("c"));
Enumeration<String> parameterNames = nettyRequestFacade.getParameterNames();
List<String> names = new ArrayList<>();
while (parameterNames.hasMoreElements()) {
names.add(parameterNames.nextElement());
}
Assertions.assertArrayEquals(Arrays.asList("c", "d").toArray(), names.toArray());
Enumeration<String> headerNames = nettyRequestFacade.getHeaderNames();
List<String> heads = new ArrayList<>();
while (headerNames.hasMoreElements()) {
heads.add(headerNames.nextElement());
}
Assertions.assertArrayEquals(Arrays.asList("h1", "h2").toArray(), heads.toArray());
Assertions.assertEquals(uri, nettyRequestFacade.getRequestURI());
Assertions.assertEquals("c", nettyRequestFacade.getHeader("h2"));
Assertions.assertEquals("d", nettyRequestFacade.getParameter("d"));
Assertions.assertEquals("/a/b", nettyRequestFacade.getPath());
Assertions.assertEquals(null, nettyRequestFacade.getParameterValues("e"));
Assertions.assertArrayEquals(new String[] {"d"}, nettyRequestFacade.getParameterValues("d"));
Enumeration<String> h1s = nettyRequestFacade.getHeaders("h1");
heads = new ArrayList<>();
while (h1s.hasMoreElements()) {
heads.add(h1s.nextElement());
}
Assertions.assertArrayEquals(new String[] {"a", "b"}, heads.toArray());
Map<String, String[]> parameterMap = nettyRequestFacade.getParameterMap();
Assertions.assertArrayEquals(new String[] {"c"}, parameterMap.get("c"));
Assertions.assertArrayEquals(new String[] {"d"}, parameterMap.get("d"));
Assertions.assertEquals("GET", nettyRequestFacade.getMethod());
}
@Test
void testChineseDecoding() {
String uri = "/hello/world?name=%E6%9D%8E%E5%BC%BA&age=18";
DefaultFullHttpRequest defaultFullHttpRequest =
new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri);
defaultFullHttpRequest.headers().add("Accept-Charset", "utf-8, iso-8859-1;q=0.5, *;q=0.1");
defaultFullHttpRequest.headers().add("Accept-Charset", "utf-16;q=0.3");
NettyRequestFacade nettyRequestFacade = new NettyRequestFacade(defaultFullHttpRequest, null);
assertThat(nettyRequestFacade.getPath(), is("/hello/world"));
assertThat(nettyRequestFacade.getParameter("name"), is("李强"));
assertThat(nettyRequestFacade.getParameter("age"), is("18"));
// Applying the decode method to the URI is acceptable, even if the URI is not encoded.
uri = "/hello/world?name=lily&age=18";
defaultFullHttpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri);
nettyRequestFacade = new NettyRequestFacade(defaultFullHttpRequest, null);
assertThat(nettyRequestFacade.getPath(), is("/hello/world"));
assertThat(nettyRequestFacade.getParameter("name"), is("lily"));
assertThat(nettyRequestFacade.getParameter("age"), is("18"));
// When using URLConnectionRestClient, the URI won't be encoded, but it's still acceptable.
uri = "/hello/world?name=李强&age=18";
defaultFullHttpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri);
nettyRequestFacade = new NettyRequestFacade(defaultFullHttpRequest, null);
assertThat(nettyRequestFacade.getPath(), is("/hello/world"));
assertThat(nettyRequestFacade.getParameter("name"), is("李强"));
assertThat(nettyRequestFacade.getParameter("age"), is("18"));
}
}