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.client5.http.socket;
29
30 import java.io.IOException;
31 import java.net.InetSocketAddress;
32 import java.net.Proxy;
33 import java.net.Socket;
34 import java.security.AccessController;
35 import java.security.PrivilegedActionException;
36 import java.security.PrivilegedExceptionAction;
37
38 import org.apache.hc.core5.annotation.Contract;
39 import org.apache.hc.core5.annotation.ThreadingBehavior;
40 import org.apache.hc.core5.http.HttpHost;
41 import org.apache.hc.core5.http.protocol.HttpContext;
42 import org.apache.hc.core5.io.Closer;
43 import org.apache.hc.core5.util.Asserts;
44 import org.apache.hc.core5.util.TimeValue;
45
46
47
48
49
50
51 @Contract(threading = ThreadingBehavior.STATELESS)
52 public class PlainConnectionSocketFactory implements ConnectionSocketFactory {
53
54 public static final PlainConnectionSocketFactory INSTANCE = new PlainConnectionSocketFactory();
55
56 public static PlainConnectionSocketFactory getSocketFactory() {
57 return INSTANCE;
58 }
59
60 public PlainConnectionSocketFactory() {
61 super();
62 }
63
64 @Override
65 public Socket createSocket(final Proxy proxy, final HttpContext context) throws IOException {
66 return proxy != null ? new Socket(proxy) : new Socket();
67 }
68
69 @Override
70 public Socket createSocket(final HttpContext context) throws IOException {
71 return new Socket();
72 }
73
74 @Override
75 public Socket connectSocket(
76 final TimeValue connectTimeout,
77 final Socket socket,
78 final HttpHost host,
79 final InetSocketAddress remoteAddress,
80 final InetSocketAddress localAddress,
81 final HttpContext context) throws IOException {
82 final Socket sock = socket != null ? socket : createSocket(context);
83 if (localAddress != null) {
84 sock.bind(localAddress);
85 }
86 try {
87
88
89 try {
90 AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
91 sock.connect(remoteAddress, TimeValue.isPositive(connectTimeout) ? connectTimeout.toMillisecondsIntBound() : 0);
92 return null;
93 });
94 } catch (final PrivilegedActionException e) {
95 Asserts.check(e.getCause() instanceof IOException,
96 "method contract violation only checked exceptions are wrapped: " + e.getCause());
97
98 throw (IOException) e.getCause();
99 }
100 } catch (final IOException ex) {
101 Closer.closeQuietly(sock);
102 throw ex;
103 }
104 return sock;
105 }
106
107 }