blob: 46c87a68411b48b33a8780e3644b313a0746958e [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.juneau.rest.client;
import static org.apache.juneau.assertions.Assertions.*;
import static org.apache.juneau.http.HttpHeaders.*;
import static org.apache.juneau.httppart.HttpPartSchema.*;
import static org.apache.juneau.internal.CollectionUtils.*;
import static org.junit.runners.MethodSorters.*;
import static java.time.format.DateTimeFormatter.*;
import static java.time.temporal.ChronoUnit.*;
import java.time.*;
import java.util.*;
import org.apache.juneau.http.header.*;
import org.apache.juneau.httppart.*;
import org.apache.juneau.marshaller.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.rest.config.*;
import org.apache.juneau.rest.logger.*;
import org.apache.juneau.rest.mock.*;
import org.apache.juneau.rest.servlet.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.testutils.*;
import org.apache.juneau.uon.*;
import org.junit.*;
@FixMethodOrder(NAME_ASCENDING)
public class RestClient_Headers_Test {
public static final CaptureLogger LOGGER = new CaptureLogger();
public static class CaptureLogger extends BasicTestCaptureCallLogger {
public static CaptureLogger getInstance(RestLogger.Builder x) {
return LOGGER;
}
}
public static class ABean {
public int f;
static ABean get() {
ABean x = new ABean();
x.f = 1;
return x;
}
@Override
public String toString() {
return SimpleJson.of(this);
}
}
private static ABean bean = ABean.get();
@Rest(callLogger=CaptureLogger.class)
public static class A extends BasicRestObject implements BasicUniversalConfig {
@RestGet
public String[] headers(org.apache.juneau.rest.RestRequest req) {
return req.getHeaders().getAll(req.getHeader("Check").orElse(null)).stream().map(x -> x.getValue()).toArray(String[]::new);
}
}
private static final ZonedDateTime ZONEDDATETIME = ZonedDateTime.from(RFC_1123_DATE_TIME.parse("Mon, 3 Dec 2007 10:15:30 GMT")).truncatedTo(SECONDS);
private static final String PARSEDZONEDDATETIME = "Mon, 3 Dec 2007 10:15:30 GMT";
//------------------------------------------------------------------------------------------------------------------
// Method tests
//------------------------------------------------------------------------------------------------------------------
@Test
public void a01_header_String_Object() throws Exception {
checkFooClient().header("Foo","bar").build().get("/headers").run().assertContent().is("['bar']");
checkFooClient().build().get("/headers").header("Foo","baz").run().assertContent().is("['baz']");
checkFooClient().header("Foo","bar").build().get("/headers").header("Foo","baz").run().assertContent().is("['bar','baz']");
checkFooClient().headers(header("Foo",bean,null)).build().get("/headers").header("Foo",bean).run().assertContent().is("['f=1','f=1']");
checkFooClient().headers(header("Foo",null,null)).build().get("/headers").header("Foo",null).run().assertContent().is("[]");
}
@Test
public void a02_header_String_Object_Schema() throws Exception {
List<String> l1 = list("bar","baz"), l2 = list("qux","quux");
checkFooClient().headers(header("Foo",l1,T_ARRAY_PIPES)).build().get("/headers").header(header("Foo",l2,T_ARRAY_PIPES)).run().assertContent().is("['bar|baz','qux|quux']");
}
@Test
public void a03_header_Header() throws Exception {
checkFooClient().headers(header("Foo","bar")).build().get("/headers").header(header("Foo","baz")).run().assertContent().is("['bar','baz']");
checkFooClient().headers(stringHeader("Foo","bar")).build().get("/headers").header(stringHeader("Foo","baz")).run().assertContent().is("['bar','baz']");
}
@Test
public void a08_header_String_Supplier() throws Exception {
TestSupplier s = TestSupplier.of("foo");
RestClient x = checkFooClient().headers(header("Foo",s,null)).build();
x.get("/headers").header("Foo",s).run().assertContent().is("['foo','foo']");
s.set("bar");
x.get("/headers").header("Foo",s).run().assertContent().is("['bar','bar']");
}
@Test
public void a09_headers_String_Object_Schema_Serializer() throws Exception {
checkFooClient().headers(header("Foo",bean,null).serializer(MockWriterSerializer.X)).build().get("/headers").run().assertContent().is("['x{f:1}x']");
}
@Test
public void a10_headers_String_Supplier_Schema() throws Exception {
TestSupplier s = TestSupplier.of(new String[]{"foo","bar"});
RestClient x = checkFooClient().headers(header("Foo",s,T_ARRAY_PIPES)).build();
x.get("/headers").header(header("Foo",s,T_ARRAY_PIPES)).run().assertContent().is("['foo|bar','foo|bar']");
s.set(new String[]{"bar","baz"});
x.get("/headers").header(header("Foo",s,T_ARRAY_PIPES)).run().assertContent().is("['bar|baz','bar|baz']");
}
@Test
public void a11_headers_String_Supplier_Schema_Serializer() throws Exception {
TestSupplier s = TestSupplier.of(new String[]{"foo","bar"});
checkFooClient().headers(header("Foo",s,T_ARRAY_PIPES).serializer(UonSerializer.DEFAULT)).build().get("/headers").run().assertContent().is("['@(foo,bar)']");
}
public static class A12 implements HttpPartSerializer {
@Override
public HttpPartSerializerSession getPartSession() {
return new HttpPartSerializerSession() {
@Override
public String serialize(HttpPartType type, HttpPartSchema schema, Object value) throws SerializeException, SchemaValidationException {
throw new SerializeException("bad");
}
};
}
}
@Test
public void a12_badSerialization() throws Exception {
assertThrown(()->checkFooClient().headers(header("Foo","bar",null).serializer(new A12())).build().get().run()).asMessages().isContains("bad");
}
//------------------------------------------------------------------------------------------------------------------
// Other tests
//------------------------------------------------------------------------------------------------------------------
@Test
public void b01_standardHeaders() throws Exception {
checkClient("Accept").accept("text/plain").build().get("/headers").run().assertContent().is("['text/plain']");
checkClient("Accept-Charset").acceptCharset("UTF-8").build().get("/headers").run().assertContent().is("['UTF-8']");
checkClient("Client-Version").clientVersion("1").build().get("/headers").run().assertContent().is("['1']");
checkClient("Content-Type").contentType("foo").build().get("/headers").run().assertContent().is("['foo']");
checkClient("No-Trace").noTrace().build().get("/headers").run().assertContent().is("['true','true']");
checkClient("Accept").build().get("/headers").accept("text/plain").run().assertContent().is("['text/plain']");
checkClient("Accept-Charset").build().get("/headers").acceptCharset("UTF-8").run().assertContent().is("['UTF-8']");
checkClient("Content-Type").build().get("/headers").contentType("foo").run().assertContent().is("['foo']");
checkClient("No-Trace").build().get("/headers").noTrace().run().assertContent().is("['true','true']");
}
@Test
public void b02_headerBeans() throws Exception {
checkClient("Accept").headers(new Accept("text/plain")).build().get("/headers").run().assertContent().is("['text/plain']");
checkClient("Accept-Charset").headers(new AcceptCharset("UTF-8")).build().get("/headers").run().assertContent().is("['UTF-8']");
checkClient("Accept-Encoding").headers(new AcceptEncoding("identity")).build().get("/headers").run().assertContent().is("['identity']");
checkClient("Accept-Language").headers(new AcceptLanguage("en")).build().get("/headers").run().assertContent().is("['en']");
checkClient("Authorization").headers(new Authorization("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Cache-Control").headers(new CacheControl("none")).header("X-Expect","none").build().get("/headers").run().assertContent().is("['none']");
checkClient("Client-Version").headers(new ClientVersion("1")).build().get("/headers").run().assertContent().is("['1']");
checkClient("Connection").headers(new Connection("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Content-Length").headers(new ContentLength(123l)).build().get("/headers").run().assertContent().is("['123']");
checkClient("Content-Type").headers(new ContentType("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Date").headers(new org.apache.juneau.http.header.Date(PARSEDZONEDDATETIME)).build().get("/headers").run().assertContent().is("['"+PARSEDZONEDDATETIME+"']");
checkClient("Date").headers(new org.apache.juneau.http.header.Date(ZONEDDATETIME)).build().get("/headers").run().assertContent().is("['"+PARSEDZONEDDATETIME+"']");
checkClient("Expect").headers(new Expect("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Forwarded").headers(new Forwarded("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("From").headers(new From("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Host").headers(new Host("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("If-Match").headers(new IfMatch("\"foo\"")).build().get("/headers").run().assertContent().is("['\"foo\"']");
checkClient("If-Modified-Since").headers(new IfModifiedSince(ZONEDDATETIME)).build().get("/headers").run().assertContent().is("['"+PARSEDZONEDDATETIME+"']");
checkClient("If-Modified-Since").headers(new IfModifiedSince(PARSEDZONEDDATETIME)).build().get("/headers").run().assertContent().is("['"+PARSEDZONEDDATETIME+"']");
checkClient("If-None-Match").headers(new IfNoneMatch("\"foo\"")).build().get("/headers").run().assertContent().is("['\"foo\"']");
checkClient("If-Range").headers(new IfRange("\"foo\"")).build().get("/headers").run().assertContent().is("['\"foo\"']");
checkClient("If-Unmodified-Since").headers(new IfUnmodifiedSince(ZONEDDATETIME)).build().get("/headers").run().assertContent().is("['"+PARSEDZONEDDATETIME+"']");
checkClient("If-Unmodified-Since").headers(new IfUnmodifiedSince(PARSEDZONEDDATETIME)).build().get("/headers").run().assertContent().is("['"+PARSEDZONEDDATETIME+"']");
checkClient("Max-Forwards").headers(new MaxForwards(10)).build().get("/headers").run().assertContent().is("['10']");
checkClient("No-Trace").headers(new NoTrace("true")).build().get("/headers").run().assertContent().is("['true','true']");
checkClient("Origin").headers(new Origin("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Pragma").headers(new Pragma("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Proxy-Authorization").headers(new ProxyAuthorization("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Range").headers(new Range("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Referer").headers(new Referer("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("TE").headers(new TE("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("User-Agent").headers(new UserAgent("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Upgrade").headers(new Upgrade("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Via").headers(new Via("foo")).build().get("/headers").run().assertContent().is("['foo']");
checkClient("Warning").headers(new Warning("foo")).build().get("/headers").run().assertContent().is("['foo']");
}
@Test
public void b03_debugHeader() throws Exception {
checkClient("Debug").build().get("/headers").debug().suppressLogging().run().assertContent().is("['true']");
}
@Test
public void b04_dontOverrideAccept() throws Exception {
checkClient("Accept").header("Accept","text/plain").build().get("/headers").run().assertContent().is("['text/plain']");
checkClient("Accept").header("Accept","text/foo").build().get("/headers").header("Accept","text/plain").run().assertContent().is("['text/foo','text/plain']");
RestClient rc = checkClient("Accept").header("Accept","text/foo").build();
RestRequest req = rc.get("/headers");
req.setHeader("Accept","text/plain");
req.run().assertContent().is("['text/plain']");
}
@Test
public void b05_dontOverrideContentType() throws Exception {
checkClient("Content-Type").header("Content-Type","text/plain").build().get("/headers").run().assertContent().is("['text/plain']");
checkClient("Content-Type").header("Content-Type","text/foo").build().get("/headers").header("Content-Type","text/plain").run().assertContent().is("['text/foo','text/plain']");
}
//------------------------------------------------------------------------------------------------------------------
// Helper methods.
//------------------------------------------------------------------------------------------------------------------
private static org.apache.http.Header header(String name, String val) {
return basicHeader(name, val);
}
private static SerializedHeader header(String name, Object val, HttpPartSchema schema) {
return serializedHeader(name, val).schema(schema);
}
private static RestClient.Builder checkFooClient() {
return MockRestClient.create(A.class).simpleJson().header("Check","Foo");
}
private static RestClient.Builder checkClient(String headerToCheck) {
return MockRestClient.create(A.class).simpleJson().header("Check",headerToCheck).noTrace();
}
}