001/* 002 * ==================================================================== 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, 014 * software distributed under the License is distributed on an 015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 016 * KIND, either express or implied. See the License for the 017 * specific language governing permissions and limitations 018 * under the License. 019 * ==================================================================== 020 * 021 * This software consists of voluntary contributions made by many 022 * individuals on behalf of the Apache Software Foundation. For more 023 * information on the Apache Software Foundation, please see 024 * <http://www.apache.org/>. 025 * 026 */ 027package org.apache.http.impl.nio.pool; 028 029import java.net.InetSocketAddress; 030import java.net.SocketAddress; 031import java.util.concurrent.Future; 032import java.util.concurrent.TimeUnit; 033import java.util.concurrent.atomic.AtomicLong; 034 035import org.apache.http.HttpHost; 036import org.apache.http.annotation.ThreadingBehavior; 037import org.apache.http.annotation.Contract; 038import org.apache.http.concurrent.FutureCallback; 039import org.apache.http.config.ConnectionConfig; 040import org.apache.http.nio.NHttpClientConnection; 041import org.apache.http.nio.pool.AbstractNIOConnPool; 042import org.apache.http.nio.pool.NIOConnFactory; 043import org.apache.http.nio.pool.SocketAddressResolver; 044import org.apache.http.nio.reactor.ConnectingIOReactor; 045import org.apache.http.params.CoreConnectionPNames; 046import org.apache.http.params.HttpParams; 047import org.apache.http.util.Args; 048 049/** 050 * A very basic {@link org.apache.http.pool.ConnPool} implementation that 051 * represents a pool of non-blocking {@link NHttpClientConnection} connections 052 * identified by an {@link HttpHost} instance. Please note this pool 053 * implementation does not support complex routes via a proxy cannot 054 * differentiate between direct and proxied connections. 055 * 056 * @see HttpHost 057 * @since 4.2 058 */ 059@SuppressWarnings("deprecation") 060@Contract(threading = ThreadingBehavior.SAFE) 061public class BasicNIOConnPool extends AbstractNIOConnPool<HttpHost, NHttpClientConnection, BasicNIOPoolEntry> { 062 063 private static final AtomicLong COUNTER = new AtomicLong(); 064 065 private final int connectTimeout; 066 067 static class BasicAddressResolver implements SocketAddressResolver<HttpHost> { 068 069 @Override 070 public SocketAddress resolveLocalAddress(final HttpHost host) { 071 return null; 072 } 073 074 @Override 075 public SocketAddress resolveRemoteAddress(final HttpHost host) { 076 final String hostname = host.getHostName(); 077 int port = host.getPort(); 078 if (port == -1) { 079 if (host.getSchemeName().equalsIgnoreCase("http")) { 080 port = 80; 081 } else if (host.getSchemeName().equalsIgnoreCase("https")) { 082 port = 443; 083 } 084 } 085 return new InetSocketAddress(hostname, port); 086 } 087 088 } 089 090 /** 091 * @deprecated (4.3) use {@link BasicNIOConnPool#BasicNIOConnPool(ConnectingIOReactor, NIOConnFactory, int)} 092 */ 093 @Deprecated 094 public BasicNIOConnPool( 095 final ConnectingIOReactor ioreactor, 096 final NIOConnFactory<HttpHost, NHttpClientConnection> connFactory, 097 final HttpParams params) { 098 super(ioreactor, connFactory, 2, 20); 099 Args.notNull(params, "HTTP parameters"); 100 this.connectTimeout = params.getIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 0); 101 } 102 103 /** 104 * @deprecated (4.3) use {@link BasicNIOConnPool#BasicNIOConnPool(ConnectingIOReactor, 105 * ConnectionConfig)} 106 */ 107 @Deprecated 108 public BasicNIOConnPool( 109 final ConnectingIOReactor ioreactor, final HttpParams params) { 110 this(ioreactor, new BasicNIOConnFactory(params), params); 111 } 112 113 /** 114 * @since 4.3 115 */ 116 public BasicNIOConnPool( 117 final ConnectingIOReactor ioreactor, 118 final NIOConnFactory<HttpHost, NHttpClientConnection> connFactory, 119 final int connectTimeout) { 120 super(ioreactor, connFactory, new BasicAddressResolver(), 2, 20); 121 this.connectTimeout = connectTimeout; 122 } 123 124 /** 125 * @since 4.3 126 */ 127 public BasicNIOConnPool( 128 final ConnectingIOReactor ioreactor, 129 final int connectTimeout, 130 final ConnectionConfig config) { 131 this(ioreactor, new BasicNIOConnFactory(config), connectTimeout); 132 } 133 134 /** 135 * @since 4.3 136 */ 137 public BasicNIOConnPool( 138 final ConnectingIOReactor ioreactor, 139 final ConnectionConfig config) { 140 this(ioreactor, new BasicNIOConnFactory(config), 0); 141 } 142 143 /** 144 * @since 4.3 145 */ 146 public BasicNIOConnPool(final ConnectingIOReactor ioreactor) { 147 this(ioreactor, new BasicNIOConnFactory(ConnectionConfig.DEFAULT), 0); 148 } 149 150 /** 151 * @deprecated (4.3) use {@link SocketAddressResolver} 152 */ 153 @Deprecated 154 @Override 155 protected SocketAddress resolveRemoteAddress(final HttpHost host) { 156 return new InetSocketAddress(host.getHostName(), host.getPort()); 157 } 158 159 /** 160 * @deprecated (4.3) use {@link SocketAddressResolver} 161 */ 162 @Deprecated 163 @Override 164 protected SocketAddress resolveLocalAddress(final HttpHost host) { 165 return null; 166 } 167 168 @Override 169 protected BasicNIOPoolEntry createEntry(final HttpHost host, final NHttpClientConnection conn) { 170 final BasicNIOPoolEntry entry = new BasicNIOPoolEntry( 171 Long.toString(COUNTER.getAndIncrement()), host, conn); 172 entry.setSocketTimeout(conn.getSocketTimeout()); 173 return entry; 174 } 175 176 @Override 177 public Future<BasicNIOPoolEntry> lease( 178 final HttpHost route, 179 final Object state, 180 final FutureCallback<BasicNIOPoolEntry> callback) { 181 return super.lease(route, state, 182 this.connectTimeout, TimeUnit.MILLISECONDS, callback); 183 } 184 185 @Override 186 public Future<BasicNIOPoolEntry> lease( 187 final HttpHost route, 188 final Object state) { 189 return super.lease(route, state, 190 this.connectTimeout, TimeUnit.MILLISECONDS, null); 191 } 192 193 @Override 194 protected void onLease(final BasicNIOPoolEntry entry) { 195 final NHttpClientConnection conn = entry.getConnection(); 196 conn.setSocketTimeout(entry.getSocketTimeout()); 197 } 198 199 @Override 200 protected void onRelease(final BasicNIOPoolEntry entry) { 201 final NHttpClientConnection conn = entry.getConnection(); 202 entry.setSocketTimeout(conn.getSocketTimeout()); 203 conn.setSocketTimeout(0); 204 } 205 206}