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.HeaderElements;
36 import org.apache.hc.core5.http.HttpException;
37 import org.apache.hc.core5.http.HttpHeaders;
38 import org.apache.hc.core5.http.HttpRequest;
39 import org.apache.hc.core5.http.HttpRequestInterceptor;
40 import org.apache.hc.core5.http.HttpVersion;
41 import org.apache.hc.core5.http.Method;
42 import org.apache.hc.core5.http.ProtocolException;
43 import org.apache.hc.core5.http.ProtocolVersion;
44 import org.apache.hc.core5.http.message.MessageSupport;
45 import org.apache.hc.core5.util.Args;
46
47
48
49
50
51
52
53
54
55
56
57 @Contract(threading = ThreadingBehavior.IMMUTABLE)
58 public class RequestContent implements HttpRequestInterceptor {
59
60
61
62
63
64 public static final HttpRequestInterceptor INSTANCE = new RequestContent();
65
66 private final boolean overwrite;
67
68
69
70
71
72
73 public RequestContent() {
74 this(false);
75 }
76
77
78
79
80
81
82
83
84
85
86
87
88 public RequestContent(final boolean overwrite) {
89 super();
90 this.overwrite = overwrite;
91 }
92
93 @Override
94 public void process(final HttpRequest request, final EntityDetails entity, final HttpContext context)
95 throws HttpException, IOException {
96 Args.notNull(request, "HTTP request");
97 final String method = request.getMethod();
98 if (Method.TRACE.isSame(method) && entity != null) {
99 throw new ProtocolException("TRACE request may not enclose an entity");
100 }
101 if (this.overwrite) {
102 request.removeHeaders(HttpHeaders.TRANSFER_ENCODING);
103 request.removeHeaders(HttpHeaders.CONTENT_LENGTH);
104 } else {
105 if (request.containsHeader(HttpHeaders.TRANSFER_ENCODING)) {
106 throw new ProtocolException("Transfer-encoding header already present");
107 }
108 if (request.containsHeader(HttpHeaders.CONTENT_LENGTH)) {
109 throw new ProtocolException("Content-Length header already present");
110 }
111 }
112 if (entity != null) {
113 final ProtocolVersion ver = context.getProtocolVersion();
114
115 if (entity.isChunked() || entity.getContentLength() < 0) {
116 if (ver.lessEquals(HttpVersion.HTTP_1_0)) {
117 throw new ProtocolException(
118 "Chunked transfer encoding not allowed for " + ver);
119 }
120 request.addHeader(HttpHeaders.TRANSFER_ENCODING, HeaderElements.CHUNKED_ENCODING);
121 MessageSupport.addTrailerHeader(request, entity);
122 } else {
123 request.addHeader(HttpHeaders.CONTENT_LENGTH, Long.toString(entity.getContentLength()));
124 }
125 MessageSupport.addContentTypeHeader(request, entity);
126 MessageSupport.addContentEncodingHeader(request, entity);
127 }
128 }
129
130 }