View Javadoc
1   /*
2    * Copyright (C) 2013, 2017 Christian Halstrick <christian.halstrick@sap.com> and others
3    *
4    * This program and the accompanying materials are made available under the
5    * terms of the Eclipse Distribution License v. 1.0 which is available at
6    * https://www.eclipse.org/org/documents/edl-v10.php.
7    *
8    * SPDX-License-Identifier: BSD-3-Clause
9    */
10  package org.eclipse.jgit.transport.http;
11  
12  import java.io.IOException;
13  import java.io.InputStream;
14  import java.io.OutputStream;
15  import java.net.HttpURLConnection;
16  import java.net.ProtocolException;
17  import java.net.URL;
18  import java.security.KeyManagementException;
19  import java.security.NoSuchAlgorithmException;
20  import java.security.SecureRandom;
21  import java.util.List;
22  import java.util.Map;
23  
24  import javax.net.ssl.HostnameVerifier;
25  import javax.net.ssl.KeyManager;
26  import javax.net.ssl.TrustManager;
27  
28  import org.eclipse.jgit.annotations.NonNull;
29  
30  /**
31   * The interface of connections used during HTTP communication. This interface
32   * is that subset of the interface exposed by {@link java.net.HttpURLConnection}
33   * which is used by JGit
34   *
35   * @since 3.3
36   */
37  public interface HttpConnection {
38  	/**
39  	 * @see HttpURLConnection#HTTP_OK
40  	 */
41  	int HTTP_OK = java.net.HttpURLConnection.HTTP_OK;
42  
43  	/**
44  	 * @see HttpURLConnection#HTTP_NOT_AUTHORITATIVE
45  	 * @since 5.8
46  	 */
47  	int HTTP_NOT_AUTHORITATIVE = java.net.HttpURLConnection.HTTP_NOT_AUTHORITATIVE;
48  
49  	/**
50  	 * @see HttpURLConnection#HTTP_MOVED_PERM
51  	 * @since 4.7
52  	 */
53  	int HTTP_MOVED_PERM = java.net.HttpURLConnection.HTTP_MOVED_PERM;
54  
55  	/**
56  	 * @see HttpURLConnection#HTTP_MOVED_TEMP
57  	 * @since 4.9
58  	 */
59  	int HTTP_MOVED_TEMP = java.net.HttpURLConnection.HTTP_MOVED_TEMP;
60  
61  	/**
62  	 * @see HttpURLConnection#HTTP_SEE_OTHER
63  	 * @since 4.9
64  	 */
65  	int HTTP_SEE_OTHER = java.net.HttpURLConnection.HTTP_SEE_OTHER;
66  
67  	/**
68  	 * HTTP 1.1 additional "temporary redirect" status code; value = 307.
69  	 *
70  	 * @see #HTTP_MOVED_TEMP
71  	 * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.4.7">RFC
72  	 *      7231, section 6.4.7: 307 Temporary Redirect</a>
73  	 * @since 4.9
74  	 */
75  	int HTTP_11_MOVED_TEMP = 307;
76  
77  	/**
78  	 * HTTP 1.1 additional "permanent redirect" status code; value = 308.
79  	 *
80  	 * @see #HTTP_MOVED_TEMP
81  	 * @see <a href="https://tools.ietf.org/html/rfc7538#section-3">RFC 7538,
82  	 *      section 3: 308 Permanent Redirect</a>
83  	 * @since 5.8
84  	 */
85  	int HTTP_11_MOVED_PERM = 308;
86  
87  	/**
88  	 * @see HttpURLConnection#HTTP_NOT_FOUND
89  	 */
90  	int HTTP_NOT_FOUND = java.net.HttpURLConnection.HTTP_NOT_FOUND;
91  
92  	/**
93  	 * @see HttpURLConnection#HTTP_UNAUTHORIZED
94  	 */
95  	int HTTP_UNAUTHORIZED = java.net.HttpURLConnection.HTTP_UNAUTHORIZED;
96  
97  	/**
98  	 * @see HttpURLConnection#HTTP_FORBIDDEN
99  	 */
100 	int HTTP_FORBIDDEN = java.net.HttpURLConnection.HTTP_FORBIDDEN;
101 
102 	/**
103 	 * Get response code
104 	 *
105 	 * @see HttpURLConnection#getResponseCode()
106 	 * @return the HTTP Status-Code, or -1
107 	 * @throws java.io.IOException
108 	 */
109 	int getResponseCode() throws IOException;
110 
111 	/**
112 	 * Get URL
113 	 *
114 	 * @see HttpURLConnection#getURL()
115 	 * @return the URL.
116 	 */
117 	URL getURL();
118 
119 	/**
120 	 * Get response message
121 	 *
122 	 * @see HttpURLConnection#getResponseMessage()
123 	 * @return the HTTP response message, or <code>null</code>
124 	 * @throws java.io.IOException
125 	 */
126 	String getResponseMessage() throws IOException;
127 
128 	/**
129 	 * Get map of header fields
130 	 *
131 	 * @see HttpURLConnection#getHeaderFields()
132 	 * @return a Map of header fields
133 	 */
134 	Map<String, List<String>> getHeaderFields();
135 
136 	/**
137 	 * Set request property
138 	 *
139 	 * @see HttpURLConnection#setRequestProperty(String, String)
140 	 * @param key
141 	 *            the keyword by which the request is known (e.g., "
142 	 *            <code>Accept</code>").
143 	 * @param value
144 	 *            the value associated with it.
145 	 */
146 	void setRequestProperty(String key, String value);
147 
148 	/**
149 	 * Set request method
150 	 *
151 	 * @see HttpURLConnection#setRequestMethod(String)
152 	 * @param method
153 	 *            the HTTP method
154 	 * @exception ProtocolException
155 	 *                if the method cannot be reset or if the requested method
156 	 *                isn't valid for HTTP.
157 	 * @throws java.net.ProtocolException
158 	 *             if any.
159 	 */
160 	void setRequestMethod(String method)
161 			throws ProtocolException;
162 
163 	/**
164 	 * Set if to use caches
165 	 *
166 	 * @see HttpURLConnection#setUseCaches(boolean)
167 	 * @param usecaches
168 	 *            a <code>boolean</code> indicating whether or not to allow
169 	 *            caching
170 	 */
171 	void setUseCaches(boolean usecaches);
172 
173 	/**
174 	 * Set connect timeout
175 	 *
176 	 * @see HttpURLConnection#setConnectTimeout(int)
177 	 * @param timeout
178 	 *            an <code>int</code> that specifies the connect timeout value
179 	 *            in milliseconds
180 	 */
181 	void setConnectTimeout(int timeout);
182 
183 	/**
184 	 * Set read timeout
185 	 *
186 	 * @see HttpURLConnection#setReadTimeout(int)
187 	 * @param timeout
188 	 *            an <code>int</code> that specifies the timeout value to be
189 	 *            used in milliseconds
190 	 */
191 	void setReadTimeout(int timeout);
192 
193 	/**
194 	 * Get content type
195 	 *
196 	 * @see HttpURLConnection#getContentType()
197 	 * @return the content type of the resource that the URL references, or
198 	 *         <code>null</code> if not known.
199 	 */
200 	String getContentType();
201 
202 	/**
203 	 * Get input stream
204 	 *
205 	 * @see HttpURLConnection#getInputStream()
206 	 * @return an input stream that reads from this open connection.
207 	 * @exception IOException
208 	 *                if an I/O error occurs while creating the input stream.
209 	 * @throws java.io.IOException
210 	 *             if any.
211 	 */
212 	InputStream getInputStream() throws IOException;
213 
214 	/**
215 	 * Get header field. According to
216 	 * {@link <a href="https://tools.ietf.org/html/rfc2616#section-4.2">RFC
217 	 * 2616</a>} header field names are case insensitive. Header fields defined
218 	 * as a comma separated list can have multiple header fields with the same
219 	 * field name. This method only returns one of these header fields. If you
220 	 * want the union of all values of all multiple header fields with the same
221 	 * field name then use {@link #getHeaderFields(String)}
222 	 *
223 	 * @see HttpURLConnection#getHeaderField(String)
224 	 * @param name
225 	 *            the name of a header field.
226 	 * @return the value of the named header field, or <code>null</code> if
227 	 *         there is no such field in the header.
228 	 */
229 	String getHeaderField(@NonNull String name);
230 
231 	/**
232 	 * Get all values of given header field. According to
233 	 * {@link <a href="https://tools.ietf.org/html/rfc2616#section-4.2">RFC
234 	 * 2616</a>} header field names are case insensitive. Header fields defined
235 	 * as a comma separated list can have multiple header fields with the same
236 	 * field name. This method does not validate if the given header field is
237 	 * defined as a comma separated list.
238 	 *
239 	 * @param name
240 	 *            the name of a header field.
241 	 * @return the list of values of the named header field
242 	 * @since 5.2
243 	 */
244 	List<String> getHeaderFields(@NonNull String name);
245 
246 	/**
247 	 * Get content length
248 	 *
249 	 * @see HttpURLConnection#getContentLength()
250 	 * @return the content length of the resource that this connection's URL
251 	 *         references, {@code -1} if the content length is not known, or if
252 	 *         the content length is greater than Integer.MAX_VALUE.
253 	 */
254 	int getContentLength();
255 
256 	/**
257 	 * Set whether or not to follow HTTP redirects.
258 	 *
259 	 * @see HttpURLConnection#setInstanceFollowRedirects(boolean)
260 	 * @param followRedirects
261 	 *            a <code>boolean</code> indicating whether or not to follow
262 	 *            HTTP redirects.
263 	 */
264 	void setInstanceFollowRedirects(boolean followRedirects);
265 
266 	/**
267 	 * Set if to do output
268 	 *
269 	 * @see HttpURLConnection#setDoOutput(boolean)
270 	 * @param dooutput
271 	 *            the new value.
272 	 */
273 	void setDoOutput(boolean dooutput);
274 
275 	/**
276 	 * Set fixed length streaming mode
277 	 *
278 	 * @see HttpURLConnection#setFixedLengthStreamingMode(int)
279 	 * @param contentLength
280 	 *            The number of bytes which will be written to the OutputStream.
281 	 */
282 	void setFixedLengthStreamingMode(int contentLength);
283 
284 	/**
285 	 * Get output stream
286 	 *
287 	 * @see HttpURLConnection#getOutputStream()
288 	 * @return an output stream that writes to this connection.
289 	 * @throws java.io.IOException
290 	 */
291 	OutputStream getOutputStream() throws IOException;
292 
293 	/**
294 	 * Set chunked streaming mode
295 	 *
296 	 * @see HttpURLConnection#setChunkedStreamingMode(int)
297 	 * @param chunklen
298 	 *            The number of bytes to write in each chunk. If chunklen is
299 	 *            less than or equal to zero, a default value will be used.
300 	 */
301 	void setChunkedStreamingMode(int chunklen);
302 
303 	/**
304 	 * Get request method
305 	 *
306 	 * @see HttpURLConnection#getRequestMethod()
307 	 * @return the HTTP request method
308 	 */
309 	String getRequestMethod();
310 
311 	/**
312 	 * Whether we use a proxy
313 	 *
314 	 * @see HttpURLConnection#usingProxy()
315 	 * @return a boolean indicating if the connection is using a proxy.
316 	 */
317 	boolean usingProxy();
318 
319 	/**
320 	 * Connect
321 	 *
322 	 * @see HttpURLConnection#connect()
323 	 * @throws java.io.IOException
324 	 */
325 	void connect() throws IOException;
326 
327 	/**
328 	 * Configure the connection so that it can be used for https communication.
329 	 *
330 	 * @param km
331 	 *            the keymanager managing the key material used to authenticate
332 	 *            the local SSLSocket to its peer
333 	 * @param tm
334 	 *            the trustmanager responsible for managing the trust material
335 	 *            that is used when making trust decisions, and for deciding
336 	 *            whether credentials presented by a peer should be accepted.
337 	 * @param random
338 	 *            the source of randomness for this generator or null. See
339 	 *            {@link javax.net.ssl.SSLContext#init(KeyManager[], TrustManager[], SecureRandom)}
340 	 * @throws java.security.NoSuchAlgorithmException
341 	 * @throws java.security.KeyManagementException
342 	 */
343 	void configure(KeyManager[] km, TrustManager[] tm,
344 			SecureRandom random) throws NoSuchAlgorithmException,
345 			KeyManagementException;
346 
347 	/**
348 	 * Set the {@link javax.net.ssl.HostnameVerifier} used during https
349 	 * communication
350 	 *
351 	 * @param hostnameverifier
352 	 *            a {@link javax.net.ssl.HostnameVerifier} object.
353 	 * @throws java.security.NoSuchAlgorithmException
354 	 * @throws java.security.KeyManagementException
355 	 */
356 	void setHostnameVerifier(HostnameVerifier hostnameverifier)
357 			throws NoSuchAlgorithmException, KeyManagementException;
358 }