1
2
3
4
5
6
7
8
9
10
11
12
13
14 package org.mortbay.jetty.client;
15
16 import java.io.IOException;
17 import java.io.InterruptedIOException;
18 import java.net.Socket;
19 import javax.net.SocketFactory;
20 import javax.net.ssl.SSLContext;
21
22 import org.mortbay.component.AbstractLifeCycle;
23 import org.mortbay.io.EndPoint;
24 import org.mortbay.io.bio.SocketEndPoint;
25 import org.mortbay.log.Log;
26
27 class SocketConnector extends AbstractLifeCycle implements HttpClient.Connector
28 {
29
30
31
32 private final HttpClient _httpClient;
33
34
35
36
37 SocketConnector(HttpClient httpClient)
38 {
39 _httpClient = httpClient;
40 }
41
42 public void startConnection(final HttpDestination destination) throws IOException
43 {
44 Socket socket=null;
45
46 if ( destination.isSecure() )
47 {
48 SSLContext sslContext = _httpClient.getSSLContext();
49 socket = sslContext.getSocketFactory().createSocket();
50 }
51 else
52 {
53 Log.debug("Using Regular Socket");
54 socket = SocketFactory.getDefault().createSocket();
55 }
56
57 socket.setSoTimeout(_httpClient.getSoTimeout());
58 socket.setTcpNoDelay(true);
59
60 Address address = destination.isProxied() ? destination.getProxy() : destination.getAddress();
61 socket.connect(address.toSocketAddress());
62
63 EndPoint endpoint=new SocketEndPoint(socket);
64
65 final HttpConnection connection=new HttpConnection(_httpClient,endpoint,_httpClient.getHeaderBufferSize(),_httpClient.getRequestBufferSize());
66 connection.setDestination(destination);
67 destination.onNewConnection(connection);
68 _httpClient.getThreadPool().dispatch(new Runnable()
69 {
70 public void run()
71 {
72 try
73 {
74 connection.handle();
75 }
76 catch (IOException e)
77 {
78 if (e instanceof InterruptedIOException)
79 Log.ignore(e);
80 else
81 {
82 Log.warn(e);
83 destination.onException(e);
84 }
85 }
86 }
87 });
88
89 }
90 }