1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.hc.core5.http.nio.support;
28
29 import org.apache.hc.core5.function.Decorator;
30 import org.apache.hc.core5.function.Supplier;
31 import org.apache.hc.core5.http.HttpException;
32 import org.apache.hc.core5.http.HttpRequest;
33 import org.apache.hc.core5.http.HttpRequestMapper;
34 import org.apache.hc.core5.http.HttpStatus;
35 import org.apache.hc.core5.http.MisdirectedRequestException;
36 import org.apache.hc.core5.http.nio.AsyncServerExchangeHandler;
37 import org.apache.hc.core5.http.nio.HandlerFactory;
38 import org.apache.hc.core5.http.protocol.HttpContext;
39 import org.apache.hc.core5.util.Args;
40
41
42
43
44
45
46
47
48 public final class DefaultAsyncResponseExchangeHandlerFactory implements HandlerFactory<AsyncServerExchangeHandler> {
49
50 private final HttpRequestMapper<Supplier<AsyncServerExchangeHandler>> mapper;
51 private final Decorator<AsyncServerExchangeHandler> decorator;
52
53 public DefaultAsyncResponseExchangeHandlerFactory(
54 final HttpRequestMapper<Supplier<AsyncServerExchangeHandler>> mapper,
55 final Decorator<AsyncServerExchangeHandler> decorator) {
56 this.mapper = Args.notNull(mapper, "Request handler mapper");
57 this.decorator = decorator;
58 }
59
60 public DefaultAsyncResponseExchangeHandlerFactory(final HttpRequestMapper<Supplier<AsyncServerExchangeHandler>> mapper) {
61 this(mapper, null);
62 }
63
64 private AsyncServerExchangeHandler createHandler(final HttpRequest request,
65 final HttpContext context) throws HttpException {
66 try {
67 final Supplier<AsyncServerExchangeHandler> supplier = mapper.resolve(request, context);
68 return supplier != null
69 ? supplier.get()
70 : new ImmediateResponseExchangeHandler(HttpStatus.SC_NOT_FOUND, "Resource not found");
71 } catch (final MisdirectedRequestException ex) {
72 return new ImmediateResponseExchangeHandler(HttpStatus.SC_MISDIRECTED_REQUEST,
73 "Not authoritative");
74 }
75 }
76
77 @Override
78 public AsyncServerExchangeHandler create(final HttpRequest request, final HttpContext context) throws HttpException {
79 final AsyncServerExchangeHandler handler = createHandler(request, context);
80 if (handler != null) {
81 return decorator != null ? decorator.decorate(handler) : handler;
82 }
83 return null;
84 }
85
86 }