Skip to content

Instantly share code, notes, and snippets.

@psamsotha
Created January 26, 2016 14:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save psamsotha/1f24b9e89c685d092bfb to your computer and use it in GitHub Desktop.
Save psamsotha/1f24b9e89c685d092bfb to your computer and use it in GitHub Desktop.
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.logging.Logger;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.MessageBodyWriter;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.message.internal.ReaderWriter;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
/**
* Stack Overflow http://stackoverflow.com/q/35013157/2587435
*
* @author Paul Samsotha
*/
public class HeaderInFilterTest extends JerseyTest {
public static class HeaderEntity {
public String header;
public String entity;
public HeaderEntity(String header, String entity) {
this.header = header;
this.entity = entity;
}
}
private static final String HEADER = "X-Custom-Header";
@Produces("application/x-custom")
public static class HeaderEntityWriter implements MessageBodyWriter<HeaderEntity> {
@Override
public boolean isWriteable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return HeaderEntity.class == type;
}
@Override
public long getSize(HeaderEntity t, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return -1;
}
@Override
public void writeTo(HeaderEntity entity, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream)
throws IOException, WebApplicationException {
//httpHeaders.putSingle(HEADER, entity.header);
entityStream.write(entity.entity.getBytes());
}
}
@Consumes("application/x-custom")
public static class HeaderEntityReader implements MessageBodyReader<HeaderEntity> {
@Override
public boolean isReadable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return HeaderEntity.class == type;
}
@Override
public HeaderEntity readFrom(Class<HeaderEntity> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException {
String s = ReaderWriter.readFromAsString(entityStream, MediaType.TEXT_PLAIN_TYPE);
return new HeaderEntity(httpHeaders.getFirst(HEADER), s);
}
}
public static class HeaderFilter implements ClientRequestFilter {
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
Object entity = requestContext.getEntity();
if (entity instanceof HeaderEntity) {
HeaderEntity headerEntity = (HeaderEntity) entity;
requestContext.getHeaders().putSingle(HEADER, headerEntity.header);
}
}
}
@Path("test")
public static class TestResource {
@POST
@Consumes("application/x-custom")
public String post(HeaderEntity entity) {
return entity.header + ":" + entity.entity;
}
}
@Override
public ResourceConfig configure() {
return new ResourceConfig(TestResource.class)
.register(HeaderEntityReader.class)
.register(new LoggingFilter(Logger.getAnonymousLogger(), true));
}
@Override
public void configureClient(ClientConfig config) {
config.register(HeaderEntityWriter.class);
config.register(HeaderFilter.class);
}
@Test
public void shouldReturnHeaderAndEntity() {
Response response = target("test").request()
.post(Entity.entity(new HeaderEntity("header", "entity"), "application/x-custom"));
assertEquals(200, response.getStatus());
assertEquals("header:entity", response.readEntity(String.class));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment