1
18
19 package io.undertow.server.handlers.encoding;
20
21 import io.undertow.Handlers;
22 import io.undertow.server.HandlerWrapper;
23 import io.undertow.server.HttpHandler;
24 import io.undertow.server.HttpServerExchange;
25 import io.undertow.server.handlers.ResponseCodeHandler;
26 import io.undertow.server.handlers.builder.HandlerBuilder;
27
28 import java.util.Collections;
29 import java.util.Map;
30 import java.util.Set;
31
32
46 public class EncodingHandler implements HttpHandler {
47
48 private volatile HttpHandler next = ResponseCodeHandler.HANDLE_404;
49 private volatile HttpHandler noEncodingHandler = ResponseCodeHandler.HANDLE_406;
50
51 private final ContentEncodingRepository contentEncodingRepository;
52
53 public EncodingHandler(final HttpHandler next, ContentEncodingRepository contentEncodingRepository) {
54 this.next = next;
55 this.contentEncodingRepository = contentEncodingRepository;
56 }
57
58 public EncodingHandler(ContentEncodingRepository contentEncodingRepository) {
59 this.contentEncodingRepository = contentEncodingRepository;
60 }
61
62 @Override
63 public void handleRequest(final HttpServerExchange exchange) throws Exception {
64 AllowedContentEncodings encodings = contentEncodingRepository.getContentEncodings(exchange);
65 if (encodings == null || !exchange.isResponseChannelAvailable()) {
66 next.handleRequest(exchange);
67 } else if (encodings.isNoEncodingsAllowed()) {
68 noEncodingHandler.handleRequest(exchange);
69 } else {
70 exchange.addResponseWrapper(encodings);
71 exchange.putAttachment(AllowedContentEncodings.ATTACHMENT_KEY, encodings);
72 next.handleRequest(exchange);
73 }
74 }
75
76
77 public HttpHandler getNext() {
78 return next;
79 }
80
81 public EncodingHandler setNext(final HttpHandler next) {
82 Handlers.handlerNotNull(next);
83 this.next = next;
84 return this;
85 }
86
87
88 public HttpHandler getNoEncodingHandler() {
89 return noEncodingHandler;
90 }
91
92 public EncodingHandler setNoEncodingHandler(HttpHandler noEncodingHandler) {
93 Handlers.handlerNotNull(noEncodingHandler);
94 this.noEncodingHandler = noEncodingHandler;
95 return this;
96 }
97
98 public static class Builder implements HandlerBuilder {
99
100 @Override
101 public String name() {
102 return "compress";
103 }
104
105 @Override
106 public Map<String, Class<?>> parameters() {
107 return Collections.emptyMap();
108 }
109
110 @Override
111 public Set<String> requiredParameters() {
112 return Collections.emptySet();
113 }
114
115 @Override
116 public String defaultParameter() {
117 return null;
118 }
119
120 @Override
121 public HandlerWrapper build(Map<String, Object> config) {
122 return new HandlerWrapper() {
123 @Override
124 public HttpHandler wrap(HttpHandler handler) {
125 return new EncodingHandler(handler, new ContentEncodingRepository()
126 .addEncodingHandler("gzip", new GzipEncodingProvider(), 100)
127 .addEncodingHandler("deflate", new DeflateEncodingProvider(), 10));
128 }
129 };
130 }
131 }
132
133 }
134