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