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
28 package org.apache.hc.core5.http.protocol;
29
30 import java.io.IOException;
31
32 import org.apache.hc.core5.annotation.Contract;
33 import org.apache.hc.core5.annotation.ThreadingBehavior;
34 import org.apache.hc.core5.http.EntityDetails;
35 import org.apache.hc.core5.http.HttpException;
36 import org.apache.hc.core5.http.HttpRequest;
37 import org.apache.hc.core5.http.HttpRequestInterceptor;
38 import org.apache.hc.core5.http.MisdirectedRequestException;
39 import org.apache.hc.core5.http.ProtocolException;
40 import org.apache.hc.core5.http.URIScheme;
41 import org.apache.hc.core5.net.URIAuthority;
42 import org.apache.hc.core5.util.Args;
43 import org.apache.hc.core5.util.TextUtils;
44
45
46
47
48
49
50
51
52
53
54
55 @Contract(threading = ThreadingBehavior.IMMUTABLE)
56 public class RequestConformance implements HttpRequestInterceptor {
57
58 public static final RequestConformance INSTANCE = new RequestConformance();
59
60 public RequestConformance() {
61 super();
62 }
63
64 @Override
65 public void process(final HttpRequest request, final EntityDetails entity, final HttpContext context)
66 throws HttpException, IOException {
67 Args.notNull(request, "HTTP request");
68
69 if (TextUtils.isBlank(request.getScheme())) {
70 throw new ProtocolException("Request scheme is not set");
71 }
72 if (TextUtils.isBlank(request.getPath())) {
73 throw new ProtocolException("Request path is not set");
74 }
75 final URIAuthority authority = request.getAuthority();
76 if (authority != null && (URIScheme.HTTP.same(request.getScheme()) || URIScheme.HTTPS.same(request.getScheme()))) {
77 final String hostName = authority.getHostName();
78 if (TextUtils.isBlank(hostName)) {
79 throw new ProtocolException("Request host is empty");
80 }
81 }
82 if (URIScheme.HTTPS.same(request.getScheme()) && context.getAttribute(HttpCoreContext.SSL_SESSION) == null) {
83 throw new MisdirectedRequestException("HTTPS request over non-secure connection");
84 }
85 }
86
87 }