Mercurial Hosting > luan
comparison src/org/eclipse/jetty/server/AbstractConnector.java @ 864:e21ca9878a10
simplify ThreadPool use
| author | Franklin Schmidt <fschmidt@gmail.com> | 
|---|---|
| date | Sun, 02 Oct 2016 16:17:38 -0600 | 
| parents | 8e9db0bbf4f9 | 
| children | 6b210bb66c63 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 863:88d3c8ff242a | 864:e21ca9878a10 | 
|---|---|
| 53 * <li>Optional reverse proxy headers checking</li> | 53 * <li>Optional reverse proxy headers checking</li> | 
| 54 * </ul> | 54 * </ul> | 
| 55 */ | 55 */ | 
| 56 public abstract class AbstractConnector extends AggregateLifeCycle implements HttpBuffers, Connector, Dumpable | 56 public abstract class AbstractConnector extends AggregateLifeCycle implements HttpBuffers, Connector, Dumpable | 
| 57 { | 57 { | 
| 58 private static final Logger LOG = LoggerFactory.getLogger(AbstractConnector.class); | 58 private static final Logger LOG = LoggerFactory.getLogger(AbstractConnector.class); | 
| 59 | 59 | 
| 60 private String _name; | 60 private String _name; | 
| 61 | 61 | 
| 62 private Server _server; | 62 private Server _server; | 
| 63 private ThreadPool _threadPool; | 63 private String _host; | 
| 64 private String _host; | 64 private int _port = 0; | 
| 65 private int _port = 0; | 65 private String _integralScheme = HttpSchemes.HTTPS; | 
| 66 private String _integralScheme = HttpSchemes.HTTPS; | 66 private int _integralPort = 0; | 
| 67 private int _integralPort = 0; | 67 private String _confidentialScheme = HttpSchemes.HTTPS; | 
| 68 private String _confidentialScheme = HttpSchemes.HTTPS; | 68 private int _confidentialPort = 0; | 
| 69 private int _confidentialPort = 0; | 69 private int _acceptQueueSize = 0; | 
| 70 private int _acceptQueueSize = 0; | 70 private int _acceptors = 1; | 
| 71 private int _acceptors = 1; | 71 private int _acceptorPriorityOffset = 0; | 
| 72 private int _acceptorPriorityOffset = 0; | 72 private boolean _useDNS; | 
| 73 private boolean _useDNS; | 73 private boolean _forwarded; | 
| 74 private boolean _forwarded; | 74 private String _hostHeader; | 
| 75 private String _hostHeader; | 75 | 
| 76 | 76 private String _forwardedHostHeader = HttpHeaders.X_FORWARDED_HOST; | 
| 77 private String _forwardedHostHeader = HttpHeaders.X_FORWARDED_HOST; | 77 private String _forwardedServerHeader = HttpHeaders.X_FORWARDED_SERVER; | 
| 78 private String _forwardedServerHeader = HttpHeaders.X_FORWARDED_SERVER; | 78 private String _forwardedForHeader = HttpHeaders.X_FORWARDED_FOR; | 
| 79 private String _forwardedForHeader = HttpHeaders.X_FORWARDED_FOR; | 79 private String _forwardedProtoHeader = HttpHeaders.X_FORWARDED_PROTO; | 
| 80 private String _forwardedProtoHeader = HttpHeaders.X_FORWARDED_PROTO; | 80 private String _forwardedCipherSuiteHeader; | 
| 81 private String _forwardedCipherSuiteHeader; | 81 private String _forwardedSslSessionIdHeader; | 
| 82 private String _forwardedSslSessionIdHeader; | 82 private boolean _reuseAddress = true; | 
| 83 private boolean _reuseAddress = true; | 83 | 
| 84 | 84 protected int _maxIdleTime = 200000; | 
| 85 protected int _maxIdleTime = 200000; | 85 protected int _lowResourceMaxIdleTime = -1; | 
| 86 protected int _lowResourceMaxIdleTime = -1; | 86 protected int _soLingerTime = -1; | 
| 87 protected int _soLingerTime = -1; | 87 | 
| 88 | 88 private transient Thread[] _acceptorThreads; | 
| 89 private transient Thread[] _acceptorThreads; | 89 | 
| 90 | 90 protected final HttpBuffersImpl _buffers = new HttpBuffersImpl(); | 
| 91 protected final HttpBuffersImpl _buffers = new HttpBuffersImpl(); | 91 | 
| 92 | 92 /* ------------------------------------------------------------ */ | 
| 93 /* ------------------------------------------------------------ */ | 93 /** | 
| 94 /** | 94 */ | 
| 95 */ | 95 public AbstractConnector() | 
| 96 public AbstractConnector() | 96 { | 
| 97 { | 97 addBean(_buffers); | 
| 98 addBean(_buffers); | 98 } | 
| 99 } | 99 | 
| 100 | 100 /* ------------------------------------------------------------ */ | 
| 101 /* ------------------------------------------------------------ */ | 101 /* | 
| 102 /* | 102 */ | 
| 103 */ | 103 public Server getServer() | 
| 104 public Server getServer() | 104 { | 
| 105 { | 105 return _server; | 
| 106 return _server; | 106 } | 
| 107 } | 107 | 
| 108 | 108 /* ------------------------------------------------------------ */ | 
| 109 /* ------------------------------------------------------------ */ | 109 public void setServer(Server server) | 
| 110 public void setServer(Server server) | 110 { | 
| 111 { | 111 _server = server; | 
| 112 _server = server; | 112 } | 
| 113 } | 113 | 
| 114 | 114 /* ------------------------------------------------------------ */ | 
| 115 /* ------------------------------------------------------------ */ | 115 public ThreadPool getThreadPool() | 
| 116 public ThreadPool getThreadPool() | 116 { | 
| 117 { | 117 return _server.getThreadPool(); | 
| 118 return _threadPool; | 118 } | 
| 119 } | 119 | 
| 120 | 120 /* ------------------------------------------------------------ */ | 
| 121 /* ------------------------------------------------------------ */ | 121 /** | 
| 122 /** Set the ThreadPool. | 122 */ | 
| 123 * The threadpool passed is added via {@link #addBean(Object)} so that | 123 public void setHost(String host) | 
| 124 * it's lifecycle may be managed as a {@link AggregateLifeCycle}. | 124 { | 
| 125 * @param pool the threadPool to set | 125 _host = host; | 
| 126 */ | 126 } | 
| 127 public void setThreadPool(ThreadPool pool) | 127 | 
| 128 { | 128 /* ------------------------------------------------------------ */ | 
| 129 removeBean(_threadPool); | 129 /* | 
| 130 _threadPool = pool; | 130 */ | 
| 131 addBean(_threadPool); | 131 public String getHost() | 
| 132 } | 132 { | 
| 133 | 133 return _host; | 
| 134 /* ------------------------------------------------------------ */ | 134 } | 
| 135 /** | 135 | 
| 136 */ | 136 /* ------------------------------------------------------------ */ | 
| 137 public void setHost(String host) | 137 public void setPort(int port) | 
| 138 { | 138 { | 
| 139 _host = host; | 139 _port = port; | 
| 140 } | 140 } | 
| 141 | 141 | 
| 142 /* ------------------------------------------------------------ */ | 142 /* ------------------------------------------------------------ */ | 
| 143 /* | 143 public int getPort() | 
| 144 */ | 144 { | 
| 145 public String getHost() | 145 return _port; | 
| 146 { | 146 } | 
| 147 return _host; | 147 | 
| 148 } | 148 /* ------------------------------------------------------------ */ | 
| 149 | 149 /** | 
| 150 /* ------------------------------------------------------------ */ | 150 * @return Returns the maxIdleTime. | 
| 151 public void setPort(int port) | 151 */ | 
| 152 { | 152 public int getMaxIdleTime() | 
| 153 _port = port; | 153 { | 
| 154 } | 154 return _maxIdleTime; | 
| 155 | 155 } | 
| 156 /* ------------------------------------------------------------ */ | 156 | 
| 157 public int getPort() | 157 /* ------------------------------------------------------------ */ | 
| 158 { | 158 /** | 
| 159 return _port; | 159 * Set the maximum Idle time for a connection, which roughly translates to the {@link Socket#setSoTimeout(int)} call, although with NIO implementations | 
| 160 } | 160 * other mechanisms may be used to implement the timeout. The max idle time is applied: | 
| 161 | 161 * <ul> | 
| 162 /* ------------------------------------------------------------ */ | 162 * <li>When waiting for a new request to be received on a connection</li> | 
| 163 /** | 163 * <li>When reading the headers and content of a request</li> | 
| 164 * @return Returns the maxIdleTime. | 164 * <li>When writing the headers and content of a response</li> | 
| 165 */ | 165 * </ul> | 
| 166 public int getMaxIdleTime() | 166 * Jetty interprets this value as the maximum time between some progress being made on the connection. So if a single byte is read or written, then the | 
| 167 { | 167 * timeout (if implemented by jetty) is reset. However, in many instances, the reading/writing is delegated to the JVM, and the semantic is more strictly | 
| 168 return _maxIdleTime; | 168 * enforced as the maximum time a single read/write operation can take. Note, that as Jetty supports writes of memory mapped file buffers, then a write may | 
| 169 } | 169 * take many 10s of seconds for large content written to a slow device. | 
| 170 | 170 * <p> | 
| 171 /* ------------------------------------------------------------ */ | 171 * Previously, Jetty supported separate idle timeouts and IO operation timeouts, however the expense of changing the value of soTimeout was significant, so | 
| 172 /** | 172 * these timeouts were merged. With the advent of NIO, it may be possible to again differentiate these values (if there is demand). | 
| 173 * Set the maximum Idle time for a connection, which roughly translates to the {@link Socket#setSoTimeout(int)} call, although with NIO implementations | 173 * | 
| 174 * other mechanisms may be used to implement the timeout. The max idle time is applied: | 174 * @param maxIdleTime | 
| 175 * <ul> | 175 * The maxIdleTime to set. | 
| 176 * <li>When waiting for a new request to be received on a connection</li> | 176 */ | 
| 177 * <li>When reading the headers and content of a request</li> | 177 public void setMaxIdleTime(int maxIdleTime) | 
| 178 * <li>When writing the headers and content of a response</li> | 178 { | 
| 179 * </ul> | 179 _maxIdleTime = maxIdleTime; | 
| 180 * Jetty interprets this value as the maximum time between some progress being made on the connection. So if a single byte is read or written, then the | 180 } | 
| 181 * timeout (if implemented by jetty) is reset. However, in many instances, the reading/writing is delegated to the JVM, and the semantic is more strictly | 181 | 
| 182 * enforced as the maximum time a single read/write operation can take. Note, that as Jetty supports writes of memory mapped file buffers, then a write may | 182 /* ------------------------------------------------------------ */ | 
| 183 * take many 10s of seconds for large content written to a slow device. | 183 /** | 
| 184 * <p> | 184 * @return Returns the maxIdleTime when resources are low. | 
| 185 * Previously, Jetty supported separate idle timeouts and IO operation timeouts, however the expense of changing the value of soTimeout was significant, so | 185 */ | 
| 186 * these timeouts were merged. With the advent of NIO, it may be possible to again differentiate these values (if there is demand). | 186 public int getLowResourcesMaxIdleTime() | 
| 187 * | 187 { | 
| 188 * @param maxIdleTime | 188 return _lowResourceMaxIdleTime; | 
| 189 * The maxIdleTime to set. | 189 } | 
| 190 */ | 190 | 
| 191 public void setMaxIdleTime(int maxIdleTime) | 191 /* ------------------------------------------------------------ */ | 
| 192 { | 192 /** | 
| 193 _maxIdleTime = maxIdleTime; | 193 * @param maxIdleTime | 
| 194 } | 194 * The maxIdleTime to set when resources are low. | 
| 195 | 195 */ | 
| 196 /* ------------------------------------------------------------ */ | 196 public void setLowResourcesMaxIdleTime(int maxIdleTime) | 
| 197 /** | 197 { | 
| 198 * @return Returns the maxIdleTime when resources are low. | 198 _lowResourceMaxIdleTime = maxIdleTime; | 
| 199 */ | 199 } | 
| 200 public int getLowResourcesMaxIdleTime() | 200 | 
| 201 { | 201 /* ------------------------------------------------------------ */ | 
| 202 return _lowResourceMaxIdleTime; | 202 /** | 
| 203 } | 203 * @return Returns the maxIdleTime when resources are low. | 
| 204 | 204 * @deprecated | 
| 205 /* ------------------------------------------------------------ */ | 205 */ | 
| 206 /** | 206 @Deprecated | 
| 207 * @param maxIdleTime | 207 public final int getLowResourceMaxIdleTime() | 
| 208 * The maxIdleTime to set when resources are low. | 208 { | 
| 209 */ | 209 return getLowResourcesMaxIdleTime(); | 
| 210 public void setLowResourcesMaxIdleTime(int maxIdleTime) | 210 } | 
| 211 { | 211 | 
| 212 _lowResourceMaxIdleTime = maxIdleTime; | 212 /* ------------------------------------------------------------ */ | 
| 213 } | 213 /** | 
| 214 | 214 * @param maxIdleTime | 
| 215 /* ------------------------------------------------------------ */ | 215 * The maxIdleTime to set when resources are low. | 
| 216 /** | 216 * @deprecated | 
| 217 * @return Returns the maxIdleTime when resources are low. | 217 */ | 
| 218 * @deprecated | 218 @Deprecated | 
| 219 */ | 219 public final void setLowResourceMaxIdleTime(int maxIdleTime) | 
| 220 @Deprecated | 220 { | 
| 221 public final int getLowResourceMaxIdleTime() | 221 setLowResourcesMaxIdleTime(maxIdleTime); | 
| 222 { | 222 } | 
| 223 return getLowResourcesMaxIdleTime(); | 223 | 
| 224 } | 224 /* ------------------------------------------------------------ */ | 
| 225 | 225 /** | 
| 226 /* ------------------------------------------------------------ */ | 226 * @return Returns the soLingerTime. | 
| 227 /** | 227 */ | 
| 228 * @param maxIdleTime | 228 public int getSoLingerTime() | 
| 229 * The maxIdleTime to set when resources are low. | 229 { | 
| 230 * @deprecated | 230 return _soLingerTime; | 
| 231 */ | 231 } | 
| 232 @Deprecated | 232 | 
| 233 public final void setLowResourceMaxIdleTime(int maxIdleTime) | 233 /* ------------------------------------------------------------ */ | 
| 234 { | 234 /** | 
| 235 setLowResourcesMaxIdleTime(maxIdleTime); | 235 * @return Returns the acceptQueueSize. | 
| 236 } | 236 */ | 
| 237 | 237 public int getAcceptQueueSize() | 
| 238 /* ------------------------------------------------------------ */ | 238 { | 
| 239 /** | 239 return _acceptQueueSize; | 
| 240 * @return Returns the soLingerTime. | 240 } | 
| 241 */ | 241 | 
| 242 public int getSoLingerTime() | 242 /* ------------------------------------------------------------ */ | 
| 243 { | 243 /** | 
| 244 return _soLingerTime; | 244 * @param acceptQueueSize | 
| 245 } | 245 * The acceptQueueSize to set. | 
| 246 | 246 */ | 
| 247 /* ------------------------------------------------------------ */ | 247 public void setAcceptQueueSize(int acceptQueueSize) | 
| 248 /** | 248 { | 
| 249 * @return Returns the acceptQueueSize. | 249 _acceptQueueSize = acceptQueueSize; | 
| 250 */ | 250 } | 
| 251 public int getAcceptQueueSize() | 251 | 
| 252 { | 252 /* ------------------------------------------------------------ */ | 
| 253 return _acceptQueueSize; | 253 /** | 
| 254 } | 254 * @return Returns the number of acceptor threads. | 
| 255 | 255 */ | 
| 256 /* ------------------------------------------------------------ */ | 256 public int getAcceptors() | 
| 257 /** | 257 { | 
| 258 * @param acceptQueueSize | 258 return _acceptors; | 
| 259 * The acceptQueueSize to set. | 259 } | 
| 260 */ | 260 | 
| 261 public void setAcceptQueueSize(int acceptQueueSize) | 261 /* ------------------------------------------------------------ */ | 
| 262 { | 262 /** | 
| 263 _acceptQueueSize = acceptQueueSize; | 263 * @param acceptors | 
| 264 } | 264 * The number of acceptor threads to set. | 
| 265 | 265 */ | 
| 266 /* ------------------------------------------------------------ */ | 266 public void setAcceptors(int acceptors) | 
| 267 /** | 267 { | 
| 268 * @return Returns the number of acceptor threads. | 268 if (acceptors > 2 * Runtime.getRuntime().availableProcessors()) | 
| 269 */ | 269 LOG.warn("Acceptors should be <=2*availableProcessors: " + this); | 
| 270 public int getAcceptors() | 270 _acceptors = acceptors; | 
| 271 { | 271 } | 
| 272 return _acceptors; | 272 | 
| 273 } | 273 /* ------------------------------------------------------------ */ | 
| 274 | 274 /** | 
| 275 /* ------------------------------------------------------------ */ | 275 * @param soLingerTime | 
| 276 /** | 276 * The soLingerTime to set or -1 to disable. | 
| 277 * @param acceptors | 277 */ | 
| 278 * The number of acceptor threads to set. | 278 public void setSoLingerTime(int soLingerTime) | 
| 279 */ | 279 { | 
| 280 public void setAcceptors(int acceptors) | 280 _soLingerTime = soLingerTime; | 
| 281 { | 281 } | 
| 282 if (acceptors > 2 * Runtime.getRuntime().availableProcessors()) | 282 | 
| 283 LOG.warn("Acceptors should be <=2*availableProcessors: " + this); | 283 /* ------------------------------------------------------------ */ | 
| 284 _acceptors = acceptors; | 284 @Override | 
| 285 } | 285 protected void doStart() throws Exception | 
| 286 | 286 { | 
| 287 /* ------------------------------------------------------------ */ | 287 if (_server == null) | 
| 288 /** | 288 throw new IllegalStateException("No server"); | 
| 289 * @param soLingerTime | 289 | 
| 290 * The soLingerTime to set or -1 to disable. | 290 // open listener port | 
| 291 */ | 291 open(); | 
| 292 public void setSoLingerTime(int soLingerTime) | 292 | 
| 293 { | 293 super.doStart(); | 
| 294 _soLingerTime = soLingerTime; | 294 | 
| 295 } | 295 // Start selector thread | 
| 296 | 296 synchronized (this) | 
| 297 /* ------------------------------------------------------------ */ | 297 { | 
| 298 @Override | 298 _acceptorThreads = new Thread[getAcceptors()]; | 
| 299 protected void doStart() throws Exception | 299 | 
| 300 { | 300 ThreadPool _threadPool = getThreadPool(); | 
| 301 if (_server == null) | 301 for (int i = 0; i < _acceptorThreads.length; i++) | 
| 302 throw new IllegalStateException("No server"); | 302 if (!_threadPool.dispatch(new Acceptor(i))) | 
| 303 | 303 throw new IllegalStateException("!accepting"); | 
| 304 // open listener port | 304 if (_threadPool.isLowOnThreads()) | 
| 305 open(); | 305 LOG.warn("insufficient threads configured for {}",this); | 
| 306 | 306 } | 
| 307 if (_threadPool == null) | 307 | 
| 308 { | 308 LOG.info("Started {}",this); | 
| 309 _threadPool = _server.getThreadPool(); | 309 } | 
| 310 addBean(_threadPool,false); | 310 | 
| 311 } | 311 /* ------------------------------------------------------------ */ | 
| 312 | 312 @Override | 
| 313 super.doStart(); | 313 protected void doStop() throws Exception | 
| 314 | 314 { | 
| 315 // Start selector thread | 315 try | 
| 316 synchronized (this) | 316 { | 
| 317 { | 317 close(); | 
| 318 _acceptorThreads = new Thread[getAcceptors()]; | 318 } | 
| 319 | 319 catch (IOException e) | 
| 320 for (int i = 0; i < _acceptorThreads.length; i++) | 320 { | 
| 321 if (!_threadPool.dispatch(new Acceptor(i))) | 321 LOG.warn("",e); | 
| 322 throw new IllegalStateException("!accepting"); | 322 } | 
| 323 if (_threadPool.isLowOnThreads()) | 323 | 
| 324 LOG.warn("insufficient threads configured for {}",this); | 324 super.doStop(); | 
| 325 } | 325 | 
| 326 | 326 Thread[] acceptors; | 
| 327 LOG.info("Started {}",this); | 327 synchronized (this) | 
| 328 } | 328 { | 
| 329 | 329 acceptors = _acceptorThreads; | 
| 330 /* ------------------------------------------------------------ */ | 330 _acceptorThreads = null; | 
| 331 @Override | 331 } | 
| 332 protected void doStop() throws Exception | 332 if (acceptors != null) | 
| 333 { | 333 { | 
| 334 try | 334 for (Thread thread : acceptors) | 
| 335 { | 335 { | 
| 336 close(); | 336 if (thread != null) | 
| 337 } | 337 thread.interrupt(); | 
| 338 catch (IOException e) | 338 } | 
| 339 { | 339 } | 
| 340 LOG.warn("",e); | 340 } | 
| 341 } | 341 | 
| 342 | 342 /* ------------------------------------------------------------ */ | 
| 343 super.doStop(); | 343 public void join() throws InterruptedException | 
| 344 | 344 { | 
| 345 Thread[] acceptors; | 345 Thread[] threads; | 
| 346 synchronized (this) | 346 synchronized(this) | 
| 347 { | 347 { | 
| 348 acceptors = _acceptorThreads; | 348 threads=_acceptorThreads; | 
| 349 _acceptorThreads = null; | 349 } | 
| 350 } | 350 if (threads != null) | 
| 351 if (acceptors != null) | 351 for (Thread thread : threads) | 
| 352 { | 352 if (thread != null) | 
| 353 for (Thread thread : acceptors) | 353 thread.join(); | 
| 354 { | 354 } | 
| 355 if (thread != null) | 355 | 
| 356 thread.interrupt(); | 356 /* ------------------------------------------------------------ */ | 
| 357 } | 357 protected void configure(Socket socket) throws IOException | 
| 358 } | 358 { | 
| 359 } | 359 try | 
| 360 | 360 { | 
| 361 /* ------------------------------------------------------------ */ | 361 socket.setTcpNoDelay(true); | 
| 362 public void join() throws InterruptedException | 362 if (_soLingerTime >= 0) | 
| 363 { | 363 socket.setSoLinger(true,_soLingerTime / 1000); | 
| 364 Thread[] threads; | 364 else | 
| 365 synchronized(this) | 365 socket.setSoLinger(false,0); | 
| 366 { | 366 } | 
| 367 threads=_acceptorThreads; | 367 catch (Exception e) | 
| 368 } | 368 { | 
| 369 if (threads != null) | 369 LOG.trace("",e); | 
| 370 for (Thread thread : threads) | 370 } | 
| 371 if (thread != null) | 371 } | 
| 372 thread.join(); | 372 | 
| 373 } | 373 /* ------------------------------------------------------------ */ | 
| 374 | 374 public void customize(EndPoint endpoint, Request request) throws IOException | 
| 375 /* ------------------------------------------------------------ */ | 375 { | 
| 376 protected void configure(Socket socket) throws IOException | 376 if (isForwarded()) | 
| 377 { | 377 checkForwardedHeaders(endpoint,request); | 
| 378 try | 378 } | 
| 379 { | 379 | 
| 380 socket.setTcpNoDelay(true); | 380 /* ------------------------------------------------------------ */ | 
| 381 if (_soLingerTime >= 0) | 381 protected void checkForwardedHeaders(EndPoint endpoint, Request request) throws IOException | 
| 382 socket.setSoLinger(true,_soLingerTime / 1000); | 382 { | 
| 383 else | 383 HttpFields httpFields = request.getConnection().getRequestFields(); | 
| 384 socket.setSoLinger(false,0); | 384 | 
| 385 } | 385 // Do SSL first | 
| 386 catch (Exception e) | 386 if (getForwardedCipherSuiteHeader()!=null) | 
| 387 { | 387 { | 
| 388 LOG.trace("",e); | 388 String cipher_suite=httpFields.getStringField(getForwardedCipherSuiteHeader()); | 
| 389 } | 389 if (cipher_suite!=null) | 
| 390 } | 390 request.setAttribute("javax.servlet.request.cipher_suite",cipher_suite); | 
| 391 | 391 } | 
| 392 /* ------------------------------------------------------------ */ | 392 if (getForwardedSslSessionIdHeader()!=null) | 
| 393 public void customize(EndPoint endpoint, Request request) throws IOException | 393 { | 
| 394 { | 394 String ssl_session_id=httpFields.getStringField(getForwardedSslSessionIdHeader()); | 
| 395 if (isForwarded()) | 395 if(ssl_session_id!=null) | 
| 396 checkForwardedHeaders(endpoint,request); | 396 { | 
| 397 } | 397 request.setAttribute("javax.servlet.request.ssl_session_id", ssl_session_id); | 
| 398 | 398 request.setScheme(HttpSchemes.HTTPS); | 
| 399 /* ------------------------------------------------------------ */ | 399 } | 
| 400 protected void checkForwardedHeaders(EndPoint endpoint, Request request) throws IOException | 400 } | 
| 401 { | 401 | 
| 402 HttpFields httpFields = request.getConnection().getRequestFields(); | 402 // Retrieving headers from the request | 
| 403 | 403 String forwardedHost = getLeftMostFieldValue(httpFields,getForwardedHostHeader()); | 
| 404 // Do SSL first | 404 String forwardedServer = getLeftMostFieldValue(httpFields,getForwardedServerHeader()); | 
| 405 if (getForwardedCipherSuiteHeader()!=null) | 405 String forwardedFor = getLeftMostFieldValue(httpFields,getForwardedForHeader()); | 
| 406 { | 406 String forwardedProto = getLeftMostFieldValue(httpFields,getForwardedProtoHeader()); | 
| 407 String cipher_suite=httpFields.getStringField(getForwardedCipherSuiteHeader()); | 407 | 
| 408 if (cipher_suite!=null) | 408 if (_hostHeader != null) | 
| 409 request.setAttribute("javax.servlet.request.cipher_suite",cipher_suite); | 409 { | 
| 410 } | 410 // Update host header | 
| 411 if (getForwardedSslSessionIdHeader()!=null) | 411 httpFields.put(HttpHeaders.HOST_BUFFER,_hostHeader); | 
| 412 { | 412 request.setServerName(null); | 
| 413 String ssl_session_id=httpFields.getStringField(getForwardedSslSessionIdHeader()); | 413 request.setServerPort(-1); | 
| 414 if(ssl_session_id!=null) | 414 request.getServerName(); | 
| 415 { | 415 } | 
| 416 request.setAttribute("javax.servlet.request.ssl_session_id", ssl_session_id); | 416 else if (forwardedHost != null) | 
| 417 request.setScheme(HttpSchemes.HTTPS); | 417 { | 
| 418 } | 418 // Update host header | 
| 419 } | 419 httpFields.put(HttpHeaders.HOST_BUFFER,forwardedHost); | 
| 420 | 420 request.setServerName(null); | 
| 421 // Retrieving headers from the request | 421 request.setServerPort(-1); | 
| 422 String forwardedHost = getLeftMostFieldValue(httpFields,getForwardedHostHeader()); | 422 request.getServerName(); | 
| 423 String forwardedServer = getLeftMostFieldValue(httpFields,getForwardedServerHeader()); | 423 } | 
| 424 String forwardedFor = getLeftMostFieldValue(httpFields,getForwardedForHeader()); | 424 else if (forwardedServer != null) | 
| 425 String forwardedProto = getLeftMostFieldValue(httpFields,getForwardedProtoHeader()); | 425 { | 
| 426 | 426 // Use provided server name | 
| 427 if (_hostHeader != null) | 427 request.setServerName(forwardedServer); | 
| 428 { | 428 } | 
| 429 // Update host header | 429 | 
| 430 httpFields.put(HttpHeaders.HOST_BUFFER,_hostHeader); | 430 if (forwardedFor != null) | 
| 431 request.setServerName(null); | 431 { | 
| 432 request.setServerPort(-1); | 432 request.setRemoteAddr(forwardedFor); | 
| 433 request.getServerName(); | 433 InetAddress inetAddress = null; | 
| 434 } | 434 | 
| 435 else if (forwardedHost != null) | 435 if (_useDNS) | 
| 436 { | 436 { | 
| 437 // Update host header | 437 try | 
| 438 httpFields.put(HttpHeaders.HOST_BUFFER,forwardedHost); | 438 { | 
| 439 request.setServerName(null); | 439 inetAddress = InetAddress.getByName(forwardedFor); | 
| 440 request.setServerPort(-1); | 440 } | 
| 441 request.getServerName(); | 441 catch (UnknownHostException e) | 
| 442 } | 442 { | 
| 443 else if (forwardedServer != null) | 443 LOG.trace("",e); | 
| 444 { | 444 } | 
| 445 // Use provided server name | 445 } | 
| 446 request.setServerName(forwardedServer); | 446 | 
| 447 } | 447 request.setRemoteHost(inetAddress == null?forwardedFor:inetAddress.getHostName()); | 
| 448 | 448 } | 
| 449 if (forwardedFor != null) | 449 | 
| 450 { | 450 if (forwardedProto != null) | 
| 451 request.setRemoteAddr(forwardedFor); | 451 { | 
| 452 InetAddress inetAddress = null; | 452 request.setScheme(forwardedProto); | 
| 453 | 453 } | 
| 454 if (_useDNS) | 454 } | 
| 455 { | 455 | 
| 456 try | 456 /* ------------------------------------------------------------ */ | 
| 457 { | 457 protected String getLeftMostFieldValue(HttpFields fields, String header) | 
| 458 inetAddress = InetAddress.getByName(forwardedFor); | 458 { | 
| 459 } | 459 if (header == null) | 
| 460 catch (UnknownHostException e) | 460 return null; | 
| 461 { | 461 | 
| 462 LOG.trace("",e); | 462 String headerValue = fields.getStringField(header); | 
| 463 } | 463 | 
| 464 } | 464 if (headerValue == null) | 
| 465 | 465 return null; | 
| 466 request.setRemoteHost(inetAddress == null?forwardedFor:inetAddress.getHostName()); | 466 | 
| 467 } | 467 int commaIndex = headerValue.indexOf(','); | 
| 468 | 468 | 
| 469 if (forwardedProto != null) | 469 if (commaIndex == -1) | 
| 470 { | 470 { | 
| 471 request.setScheme(forwardedProto); | 471 // Single value | 
| 472 } | 472 return headerValue; | 
| 473 } | 473 } | 
| 474 | 474 | 
| 475 /* ------------------------------------------------------------ */ | 475 // The left-most value is the farthest downstream client | 
| 476 protected String getLeftMostFieldValue(HttpFields fields, String header) | 476 return headerValue.substring(0,commaIndex); | 
| 477 { | 477 } | 
| 478 if (header == null) | 478 | 
| 479 return null; | 479 /* ------------------------------------------------------------ */ | 
| 480 | 480 public void persist(EndPoint endpoint) throws IOException | 
| 481 String headerValue = fields.getStringField(header); | 481 { | 
| 482 | 482 } | 
| 483 if (headerValue == null) | 483 | 
| 484 return null; | 484 /* ------------------------------------------------------------ */ | 
| 485 | 485 /* | 
| 486 int commaIndex = headerValue.indexOf(','); | 486 * @see org.eclipse.jetty.server.Connector#getConfidentialPort() | 
| 487 | 487 */ | 
| 488 if (commaIndex == -1) | 488 public int getConfidentialPort() | 
| 489 { | 489 { | 
| 490 // Single value | 490 return _confidentialPort; | 
| 491 return headerValue; | 491 } | 
| 492 } | 492 | 
| 493 | 493 /* ------------------------------------------------------------ */ | 
| 494 // The left-most value is the farthest downstream client | 494 /* ------------------------------------------------------------ */ | 
| 495 return headerValue.substring(0,commaIndex); | 495 /* | 
| 496 } | 496 * @see org.eclipse.jetty.server.Connector#getConfidentialScheme() | 
| 497 | 497 */ | 
| 498 /* ------------------------------------------------------------ */ | 498 public String getConfidentialScheme() | 
| 499 public void persist(EndPoint endpoint) throws IOException | 499 { | 
| 500 { | 500 return _confidentialScheme; | 
| 501 } | 501 } | 
| 502 | 502 | 
| 503 /* ------------------------------------------------------------ */ | 503 /* ------------------------------------------------------------ */ | 
| 504 /* | 504 /* | 
| 505 * @see org.eclipse.jetty.server.Connector#getConfidentialPort() | 505 * @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server .Request) | 
| 506 */ | 506 */ | 
| 507 public int getConfidentialPort() | 507 public boolean isIntegral(Request request) | 
| 508 { | 508 { | 
| 509 return _confidentialPort; | 509 return false; | 
| 510 } | 510 } | 
| 511 | 511 | 
| 512 /* ------------------------------------------------------------ */ | 512 /* ------------------------------------------------------------ */ | 
| 513 /* ------------------------------------------------------------ */ | 513 /* | 
| 514 /* | 514 * @see org.eclipse.jetty.server.Connector#getConfidentialPort() | 
| 515 * @see org.eclipse.jetty.server.Connector#getConfidentialScheme() | 515 */ | 
| 516 */ | 516 public int getIntegralPort() | 
| 517 public String getConfidentialScheme() | 517 { | 
| 518 { | 518 return _integralPort; | 
| 519 return _confidentialScheme; | 519 } | 
| 520 } | 520 | 
| 521 | 521 /* ------------------------------------------------------------ */ | 
| 522 /* ------------------------------------------------------------ */ | 522 /* | 
| 523 /* | 523 * @see org.eclipse.jetty.server.Connector#getIntegralScheme() | 
| 524 * @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server .Request) | 524 */ | 
| 525 */ | 525 public String getIntegralScheme() | 
| 526 public boolean isIntegral(Request request) | 526 { | 
| 527 { | 527 return _integralScheme; | 
| 528 return false; | 528 } | 
| 529 } | 529 | 
| 530 | 530 /* ------------------------------------------------------------ */ | 
| 531 /* ------------------------------------------------------------ */ | 531 /* | 
| 532 /* | 532 * @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server.Request) | 
| 533 * @see org.eclipse.jetty.server.Connector#getConfidentialPort() | 533 */ | 
| 534 */ | 534 public boolean isConfidential(Request request) | 
| 535 public int getIntegralPort() | 535 { | 
| 536 { | 536 return _forwarded && request.getScheme().equalsIgnoreCase(HttpSchemes.HTTPS); | 
| 537 return _integralPort; | 537 } | 
| 538 } | 538 | 
| 539 | 539 /* ------------------------------------------------------------ */ | 
| 540 /* ------------------------------------------------------------ */ | 540 /** | 
| 541 /* | 541 * @param confidentialPort | 
| 542 * @see org.eclipse.jetty.server.Connector#getIntegralScheme() | 542 * The confidentialPort to set. | 
| 543 */ | 543 */ | 
| 544 public String getIntegralScheme() | 544 public void setConfidentialPort(int confidentialPort) | 
| 545 { | 545 { | 
| 546 return _integralScheme; | 546 _confidentialPort = confidentialPort; | 
| 547 } | 547 } | 
| 548 | 548 | 
| 549 /* ------------------------------------------------------------ */ | 549 /* ------------------------------------------------------------ */ | 
| 550 /* | 550 /** | 
| 551 * @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server.Request) | 551 * @param confidentialScheme | 
| 552 */ | 552 * The confidentialScheme to set. | 
| 553 public boolean isConfidential(Request request) | 553 */ | 
| 554 { | 554 public void setConfidentialScheme(String confidentialScheme) | 
| 555 return _forwarded && request.getScheme().equalsIgnoreCase(HttpSchemes.HTTPS); | 555 { | 
| 556 } | 556 _confidentialScheme = confidentialScheme; | 
| 557 | 557 } | 
| 558 /* ------------------------------------------------------------ */ | 558 | 
| 559 /** | 559 /* ------------------------------------------------------------ */ | 
| 560 * @param confidentialPort | 560 /** | 
| 561 * The confidentialPort to set. | 561 * @param integralPort | 
| 562 */ | 562 * The integralPort to set. | 
| 563 public void setConfidentialPort(int confidentialPort) | 563 */ | 
| 564 { | 564 public void setIntegralPort(int integralPort) | 
| 565 _confidentialPort = confidentialPort; | 565 { | 
| 566 } | 566 _integralPort = integralPort; | 
| 567 | 567 } | 
| 568 /* ------------------------------------------------------------ */ | 568 | 
| 569 /** | 569 /* ------------------------------------------------------------ */ | 
| 570 * @param confidentialScheme | 570 /** | 
| 571 * The confidentialScheme to set. | 571 * @param integralScheme | 
| 572 */ | 572 * The integralScheme to set. | 
| 573 public void setConfidentialScheme(String confidentialScheme) | 573 */ | 
| 574 { | 574 public void setIntegralScheme(String integralScheme) | 
| 575 _confidentialScheme = confidentialScheme; | 575 { | 
| 576 } | 576 _integralScheme = integralScheme; | 
| 577 | 577 } | 
| 578 /* ------------------------------------------------------------ */ | 578 | 
| 579 /** | 579 /* ------------------------------------------------------------ */ | 
| 580 * @param integralPort | 580 protected abstract void accept(int acceptorID) throws IOException, InterruptedException; | 
| 581 * The integralPort to set. | 581 | 
| 582 */ | 582 /* ------------------------------------------------------------ */ | 
| 583 public void setIntegralPort(int integralPort) | 583 public void stopAccept(int acceptorID) throws Exception | 
| 584 { | 584 { | 
| 585 _integralPort = integralPort; | 585 } | 
| 586 } | 586 | 
| 587 | 587 /* ------------------------------------------------------------ */ | 
| 588 /* ------------------------------------------------------------ */ | 588 public boolean getResolveNames() | 
| 589 /** | 589 { | 
| 590 * @param integralScheme | 590 return _useDNS; | 
| 591 * The integralScheme to set. | 591 } | 
| 592 */ | 592 | 
| 593 public void setIntegralScheme(String integralScheme) | 593 /* ------------------------------------------------------------ */ | 
| 594 { | 594 public void setResolveNames(boolean resolve) | 
| 595 _integralScheme = integralScheme; | 595 { | 
| 596 } | 596 _useDNS = resolve; | 
| 597 | 597 } | 
| 598 /* ------------------------------------------------------------ */ | 598 | 
| 599 protected abstract void accept(int acceptorID) throws IOException, InterruptedException; | 599 /* ------------------------------------------------------------ */ | 
| 600 | 600 /** | 
| 601 /* ------------------------------------------------------------ */ | 601 * Is reverse proxy handling on? | 
| 602 public void stopAccept(int acceptorID) throws Exception | 602 * | 
| 603 { | 603 * @return true if this connector is checking the x-forwarded-for/host/server headers | 
| 604 } | 604 */ | 
| 605 | 605 public boolean isForwarded() | 
| 606 /* ------------------------------------------------------------ */ | 606 { | 
| 607 public boolean getResolveNames() | 607 return _forwarded; | 
| 608 { | 608 } | 
| 609 return _useDNS; | 609 | 
| 610 } | 610 /* ------------------------------------------------------------ */ | 
| 611 | 611 /** | 
| 612 /* ------------------------------------------------------------ */ | 612 * Set reverse proxy handling. If set to true, then the X-Forwarded headers (or the headers set in their place) are looked for to set the request protocol, | 
| 613 public void setResolveNames(boolean resolve) | 613 * host, server and client ip. | 
| 614 { | 614 * | 
| 615 _useDNS = resolve; | 615 * @param check | 
| 616 } | 616 * true if this connector is checking the x-forwarded-for/host/server headers | 
| 617 | 617 * @see #setForwardedForHeader(String) | 
| 618 /* ------------------------------------------------------------ */ | 618 * @see #setForwardedHostHeader(String) | 
| 619 /** | 619 * @see #setForwardedProtoHeader(String) | 
| 620 * Is reverse proxy handling on? | 620 * @see #setForwardedServerHeader(String) | 
| 621 * | 621 */ | 
| 622 * @return true if this connector is checking the x-forwarded-for/host/server headers | 622 public void setForwarded(boolean check) | 
| 623 */ | 623 { | 
| 624 public boolean isForwarded() | 624 if (check) | 
| 625 { | 625 LOG.debug("{} is forwarded",this); | 
| 626 return _forwarded; | 626 _forwarded = check; | 
| 627 } | 627 } | 
| 628 | 628 | 
| 629 /* ------------------------------------------------------------ */ | 629 /* ------------------------------------------------------------ */ | 
| 630 /** | 630 public String getHostHeader() | 
| 631 * Set reverse proxy handling. If set to true, then the X-Forwarded headers (or the headers set in their place) are looked for to set the request protocol, | 631 { | 
| 632 * host, server and client ip. | 632 return _hostHeader; | 
| 633 * | 633 } | 
| 634 * @param check | 634 | 
| 635 * true if this connector is checking the x-forwarded-for/host/server headers | 635 /* ------------------------------------------------------------ */ | 
| 636 * @see #setForwardedForHeader(String) | 636 /** | 
| 637 * @see #setForwardedHostHeader(String) | 637 * Set a forced valued for the host header to control what is returned by {@link ServletRequest#getServerName()} and {@link ServletRequest#getServerPort()}. | 
| 638 * @see #setForwardedProtoHeader(String) | 638 * This value is only used if {@link #isForwarded()} is true. | 
| 639 * @see #setForwardedServerHeader(String) | 639 * | 
| 640 */ | 640 * @param hostHeader | 
| 641 public void setForwarded(boolean check) | 641 * The value of the host header to force. | 
| 642 { | 642 */ | 
| 643 if (check) | 643 public void setHostHeader(String hostHeader) | 
| 644 LOG.debug("{} is forwarded",this); | 644 { | 
| 645 _forwarded = check; | 645 _hostHeader = hostHeader; | 
| 646 } | 646 } | 
| 647 | 647 | 
| 648 /* ------------------------------------------------------------ */ | 648 /* ------------------------------------------------------------ */ | 
| 649 public String getHostHeader() | 649 /* | 
| 650 { | 650 * | 
| 651 return _hostHeader; | 651 * @see #setForwarded(boolean) | 
| 652 } | 652 */ | 
| 653 | 653 public String getForwardedHostHeader() | 
| 654 /* ------------------------------------------------------------ */ | 654 { | 
| 655 /** | 655 return _forwardedHostHeader; | 
| 656 * Set a forced valued for the host header to control what is returned by {@link ServletRequest#getServerName()} and {@link ServletRequest#getServerPort()}. | 656 } | 
| 657 * This value is only used if {@link #isForwarded()} is true. | 657 | 
| 658 * | 658 /* ------------------------------------------------------------ */ | 
| 659 * @param hostHeader | 659 /** | 
| 660 * The value of the host header to force. | 660 * @param forwardedHostHeader | 
| 661 */ | 661 * The header name for forwarded hosts (default x-forwarded-host) | 
| 662 public void setHostHeader(String hostHeader) | 662 * @see #setForwarded(boolean) | 
| 663 { | 663 */ | 
| 664 _hostHeader = hostHeader; | 664 public void setForwardedHostHeader(String forwardedHostHeader) | 
| 665 } | 665 { | 
| 666 | 666 _forwardedHostHeader = forwardedHostHeader; | 
| 667 /* ------------------------------------------------------------ */ | 667 } | 
| 668 /* | 668 | 
| 669 * | 669 /* ------------------------------------------------------------ */ | 
| 670 * @see #setForwarded(boolean) | 670 /** | 
| 671 */ | 671 * @return the header name for forwarded server. | 
| 672 public String getForwardedHostHeader() | 672 * @see #setForwarded(boolean) | 
| 673 { | 673 */ | 
| 674 return _forwardedHostHeader; | 674 public String getForwardedServerHeader() | 
| 675 } | 675 { | 
| 676 | 676 return _forwardedServerHeader; | 
| 677 /* ------------------------------------------------------------ */ | 677 } | 
| 678 /** | 678 | 
| 679 * @param forwardedHostHeader | 679 /* ------------------------------------------------------------ */ | 
| 680 * The header name for forwarded hosts (default x-forwarded-host) | 680 /** | 
| 681 * @see #setForwarded(boolean) | 681 * @param forwardedServerHeader | 
| 682 */ | 682 * The header name for forwarded server (default x-forwarded-server) | 
| 683 public void setForwardedHostHeader(String forwardedHostHeader) | 683 * @see #setForwarded(boolean) | 
| 684 { | 684 */ | 
| 685 _forwardedHostHeader = forwardedHostHeader; | 685 public void setForwardedServerHeader(String forwardedServerHeader) | 
| 686 } | 686 { | 
| 687 | 687 _forwardedServerHeader = forwardedServerHeader; | 
| 688 /* ------------------------------------------------------------ */ | 688 } | 
| 689 /** | 689 | 
| 690 * @return the header name for forwarded server. | 690 /* ------------------------------------------------------------ */ | 
| 691 * @see #setForwarded(boolean) | 691 /** | 
| 692 */ | 692 * @see #setForwarded(boolean) | 
| 693 public String getForwardedServerHeader() | 693 */ | 
| 694 { | 694 public String getForwardedForHeader() | 
| 695 return _forwardedServerHeader; | 695 { | 
| 696 } | 696 return _forwardedForHeader; | 
| 697 | 697 } | 
| 698 /* ------------------------------------------------------------ */ | 698 | 
| 699 /** | 699 /* ------------------------------------------------------------ */ | 
| 700 * @param forwardedServerHeader | 700 /** | 
| 701 * The header name for forwarded server (default x-forwarded-server) | 701 * @param forwardedRemoteAddressHeader | 
| 702 * @see #setForwarded(boolean) | 702 * The header name for forwarded for (default x-forwarded-for) | 
| 703 */ | 703 * @see #setForwarded(boolean) | 
| 704 public void setForwardedServerHeader(String forwardedServerHeader) | 704 */ | 
| 705 { | 705 public void setForwardedForHeader(String forwardedRemoteAddressHeader) | 
| 706 _forwardedServerHeader = forwardedServerHeader; | 706 { | 
| 707 } | 707 _forwardedForHeader = forwardedRemoteAddressHeader; | 
| 708 | 708 } | 
| 709 /* ------------------------------------------------------------ */ | 709 | 
| 710 /** | 710 /* ------------------------------------------------------------ */ | 
| 711 * @see #setForwarded(boolean) | 711 /** | 
| 712 */ | 712 * Get the forwardedProtoHeader. | 
| 713 public String getForwardedForHeader() | 713 * | 
| 714 { | 714 * @return the forwardedProtoHeader (default X-Forwarded-For) | 
| 715 return _forwardedForHeader; | 715 * @see #setForwarded(boolean) | 
| 716 } | 716 */ | 
| 717 | 717 public String getForwardedProtoHeader() | 
| 718 /* ------------------------------------------------------------ */ | 718 { | 
| 719 /** | 719 return _forwardedProtoHeader; | 
| 720 * @param forwardedRemoteAddressHeader | 720 } | 
| 721 * The header name for forwarded for (default x-forwarded-for) | 721 | 
| 722 * @see #setForwarded(boolean) | 722 /* ------------------------------------------------------------ */ | 
| 723 */ | 723 /** | 
| 724 public void setForwardedForHeader(String forwardedRemoteAddressHeader) | 724 * Set the forwardedProtoHeader. | 
| 725 { | 725 * | 
| 726 _forwardedForHeader = forwardedRemoteAddressHeader; | 726 * @param forwardedProtoHeader | 
| 727 } | 727 * the forwardedProtoHeader to set (default X-Forwarded-For) | 
| 728 | 728 * @see #setForwarded(boolean) | 
| 729 /* ------------------------------------------------------------ */ | 729 */ | 
| 730 /** | 730 public void setForwardedProtoHeader(String forwardedProtoHeader) | 
| 731 * Get the forwardedProtoHeader. | 731 { | 
| 732 * | 732 _forwardedProtoHeader = forwardedProtoHeader; | 
| 733 * @return the forwardedProtoHeader (default X-Forwarded-For) | 733 } | 
| 734 * @see #setForwarded(boolean) | 734 | 
| 735 */ | 735 /* ------------------------------------------------------------ */ | 
| 736 public String getForwardedProtoHeader() | 736 /** | 
| 737 { | 737 * @return The header name holding a forwarded cipher suite (default null) | 
| 738 return _forwardedProtoHeader; | 738 */ | 
| 739 } | 739 public String getForwardedCipherSuiteHeader() | 
| 740 | 740 { | 
| 741 /* ------------------------------------------------------------ */ | 741 return _forwardedCipherSuiteHeader; | 
| 742 /** | 742 } | 
| 743 * Set the forwardedProtoHeader. | 743 | 
| 744 * | 744 /* ------------------------------------------------------------ */ | 
| 745 * @param forwardedProtoHeader | 745 /** | 
| 746 * the forwardedProtoHeader to set (default X-Forwarded-For) | 746 * @param forwardedCipherSuite | 
| 747 * @see #setForwarded(boolean) | 747 * The header name holding a forwarded cipher suite (default null) | 
| 748 */ | 748 */ | 
| 749 public void setForwardedProtoHeader(String forwardedProtoHeader) | 749 public void setForwardedCipherSuiteHeader(String forwardedCipherSuite) | 
| 750 { | 750 { | 
| 751 _forwardedProtoHeader = forwardedProtoHeader; | 751 _forwardedCipherSuiteHeader = forwardedCipherSuite; | 
| 752 } | 752 } | 
| 753 | 753 | 
| 754 /* ------------------------------------------------------------ */ | 754 /* ------------------------------------------------------------ */ | 
| 755 /** | 755 /** | 
| 756 * @return The header name holding a forwarded cipher suite (default null) | 756 * @return The header name holding a forwarded SSL Session ID (default null) | 
| 757 */ | 757 */ | 
| 758 public String getForwardedCipherSuiteHeader() | 758 public String getForwardedSslSessionIdHeader() | 
| 759 { | 759 { | 
| 760 return _forwardedCipherSuiteHeader; | 760 return _forwardedSslSessionIdHeader; | 
| 761 } | 761 } | 
| 762 | 762 | 
| 763 /* ------------------------------------------------------------ */ | 763 /* ------------------------------------------------------------ */ | 
| 764 /** | 764 /** | 
| 765 * @param forwardedCipherSuite | 765 * @param forwardedSslSessionId | 
| 766 * The header name holding a forwarded cipher suite (default null) | 766 * The header name holding a forwarded SSL Session ID (default null) | 
| 767 */ | 767 */ | 
| 768 public void setForwardedCipherSuiteHeader(String forwardedCipherSuite) | 768 public void setForwardedSslSessionIdHeader(String forwardedSslSessionId) | 
| 769 { | 769 { | 
| 770 _forwardedCipherSuiteHeader = forwardedCipherSuite; | 770 _forwardedSslSessionIdHeader = forwardedSslSessionId; | 
| 771 } | 771 } | 
| 772 | 772 | 
| 773 /* ------------------------------------------------------------ */ | 773 public int getRequestBufferSize() | 
| 774 /** | 774 { | 
| 775 * @return The header name holding a forwarded SSL Session ID (default null) | 775 return _buffers.getRequestBufferSize(); | 
| 776 */ | 776 } | 
| 777 public String getForwardedSslSessionIdHeader() | 777 | 
| 778 { | 778 public void setRequestBufferSize(int requestBufferSize) | 
| 779 return _forwardedSslSessionIdHeader; | 779 { | 
| 780 } | 780 _buffers.setRequestBufferSize(requestBufferSize); | 
| 781 | 781 } | 
| 782 /* ------------------------------------------------------------ */ | 782 | 
| 783 /** | 783 public int getRequestHeaderSize() | 
| 784 * @param forwardedSslSessionId | 784 { | 
| 785 * The header name holding a forwarded SSL Session ID (default null) | 785 return _buffers.getRequestHeaderSize(); | 
| 786 */ | 786 } | 
| 787 public void setForwardedSslSessionIdHeader(String forwardedSslSessionId) | 787 | 
| 788 { | 788 public void setRequestHeaderSize(int requestHeaderSize) | 
| 789 _forwardedSslSessionIdHeader = forwardedSslSessionId; | 789 { | 
| 790 } | 790 _buffers.setRequestHeaderSize(requestHeaderSize); | 
| 791 | 791 } | 
| 792 public int getRequestBufferSize() | 792 | 
| 793 { | 793 public int getResponseBufferSize() | 
| 794 return _buffers.getRequestBufferSize(); | 794 { | 
| 795 } | 795 return _buffers.getResponseBufferSize(); | 
| 796 | 796 } | 
| 797 public void setRequestBufferSize(int requestBufferSize) | 797 | 
| 798 { | 798 public void setResponseBufferSize(int responseBufferSize) | 
| 799 _buffers.setRequestBufferSize(requestBufferSize); | 799 { | 
| 800 } | 800 _buffers.setResponseBufferSize(responseBufferSize); | 
| 801 | 801 } | 
| 802 public int getRequestHeaderSize() | 802 | 
| 803 { | 803 public int getResponseHeaderSize() | 
| 804 return _buffers.getRequestHeaderSize(); | 804 { | 
| 805 } | 805 return _buffers.getResponseHeaderSize(); | 
| 806 | 806 } | 
| 807 public void setRequestHeaderSize(int requestHeaderSize) | 807 | 
| 808 { | 808 public void setResponseHeaderSize(int responseHeaderSize) | 
| 809 _buffers.setRequestHeaderSize(requestHeaderSize); | 809 { | 
| 810 } | 810 _buffers.setResponseHeaderSize(responseHeaderSize); | 
| 811 | 811 } | 
| 812 public int getResponseBufferSize() | 812 | 
| 813 { | 813 public Type getRequestBufferType() | 
| 814 return _buffers.getResponseBufferSize(); | 814 { | 
| 815 } | 815 return _buffers.getRequestBufferType(); | 
| 816 | 816 } | 
| 817 public void setResponseBufferSize(int responseBufferSize) | 817 | 
| 818 { | 818 public Type getRequestHeaderType() | 
| 819 _buffers.setResponseBufferSize(responseBufferSize); | 819 { | 
| 820 } | 820 return _buffers.getRequestHeaderType(); | 
| 821 | 821 } | 
| 822 public int getResponseHeaderSize() | 822 | 
| 823 { | 823 public Type getResponseBufferType() | 
| 824 return _buffers.getResponseHeaderSize(); | 824 { | 
| 825 } | 825 return _buffers.getResponseBufferType(); | 
| 826 | 826 } | 
| 827 public void setResponseHeaderSize(int responseHeaderSize) | 827 | 
| 828 { | 828 public Type getResponseHeaderType() | 
| 829 _buffers.setResponseHeaderSize(responseHeaderSize); | 829 { | 
| 830 } | 830 return _buffers.getResponseHeaderType(); | 
| 831 | 831 } | 
| 832 public Type getRequestBufferType() | 832 | 
| 833 { | 833 public void setRequestBuffers(Buffers requestBuffers) | 
| 834 return _buffers.getRequestBufferType(); | 834 { | 
| 835 } | 835 _buffers.setRequestBuffers(requestBuffers); | 
| 836 | 836 } | 
| 837 public Type getRequestHeaderType() | 837 | 
| 838 { | 838 public void setResponseBuffers(Buffers responseBuffers) | 
| 839 return _buffers.getRequestHeaderType(); | 839 { | 
| 840 } | 840 _buffers.setResponseBuffers(responseBuffers); | 
| 841 | 841 } | 
| 842 public Type getResponseBufferType() | 842 | 
| 843 { | 843 public Buffers getRequestBuffers() | 
| 844 return _buffers.getResponseBufferType(); | 844 { | 
| 845 } | 845 return _buffers.getRequestBuffers(); | 
| 846 | 846 } | 
| 847 public Type getResponseHeaderType() | 847 | 
| 848 { | 848 public Buffers getResponseBuffers() | 
| 849 return _buffers.getResponseHeaderType(); | 849 { | 
| 850 } | 850 return _buffers.getResponseBuffers(); | 
| 851 | 851 } | 
| 852 public void setRequestBuffers(Buffers requestBuffers) | 852 | 
| 853 { | 853 public void setMaxBuffers(int maxBuffers) | 
| 854 _buffers.setRequestBuffers(requestBuffers); | 854 { | 
| 855 } | 855 _buffers.setMaxBuffers(maxBuffers); | 
| 856 | 856 } | 
| 857 public void setResponseBuffers(Buffers responseBuffers) | 857 | 
| 858 { | 858 public int getMaxBuffers() | 
| 859 _buffers.setResponseBuffers(responseBuffers); | 859 { | 
| 860 } | 860 return _buffers.getMaxBuffers(); | 
| 861 | 861 } | 
| 862 public Buffers getRequestBuffers() | 862 | 
| 863 { | 863 /* ------------------------------------------------------------ */ | 
| 864 return _buffers.getRequestBuffers(); | 864 @Override | 
| 865 } | 865 public String toString() | 
| 866 | 866 { | 
| 867 public Buffers getResponseBuffers() | 867 return String.format("%s@%s:%d", | 
| 868 { | 868 getClass().getSimpleName(), | 
| 869 return _buffers.getResponseBuffers(); | 869 getHost()==null?"0.0.0.0":getHost(), | 
| 870 } | 870 getLocalPort()<=0?getPort():getLocalPort()); | 
| 871 | 871 } | 
| 872 public void setMaxBuffers(int maxBuffers) | 872 | 
| 873 { | 873 /* ------------------------------------------------------------ */ | 
| 874 _buffers.setMaxBuffers(maxBuffers); | 874 /* ------------------------------------------------------------ */ | 
| 875 } | 875 /* ------------------------------------------------------------ */ | 
| 876 | 876 private class Acceptor implements Runnable | 
| 877 public int getMaxBuffers() | 877 { | 
| 878 { | 878 int _acceptor = 0; | 
| 879 return _buffers.getMaxBuffers(); | 879 | 
| 880 } | 880 Acceptor(int id) | 
| 881 | 881 { | 
| 882 /* ------------------------------------------------------------ */ | 882 _acceptor = id; | 
| 883 @Override | 883 } | 
| 884 public String toString() | 884 | 
| 885 { | 885 /* ------------------------------------------------------------ */ | 
| 886 return String.format("%s@%s:%d", | 886 public void run() | 
| 887 getClass().getSimpleName(), | 887 { | 
| 888 getHost()==null?"0.0.0.0":getHost(), | 888 Thread current = Thread.currentThread(); | 
| 889 getLocalPort()<=0?getPort():getLocalPort()); | 889 String name; | 
| 890 } | 890 synchronized (AbstractConnector.this) | 
| 891 | 891 { | 
| 892 /* ------------------------------------------------------------ */ | 892 if (_acceptorThreads == null) | 
| 893 /* ------------------------------------------------------------ */ | 893 return; | 
| 894 /* ------------------------------------------------------------ */ | 894 | 
| 895 private class Acceptor implements Runnable | 895 _acceptorThreads[_acceptor] = current; | 
| 896 { | 896 name = _acceptorThreads[_acceptor].getName(); | 
| 897 int _acceptor = 0; | 897 current.setName(name + " Acceptor" + _acceptor + " " + AbstractConnector.this); | 
| 898 | 898 } | 
| 899 Acceptor(int id) | 899 int old_priority = current.getPriority(); | 
| 900 { | 900 | 
| 901 _acceptor = id; | 901 try | 
| 902 } | 902 { | 
| 903 | 903 current.setPriority(old_priority - _acceptorPriorityOffset); | 
| 904 /* ------------------------------------------------------------ */ | 904 while (isRunning() && getConnection() != null) | 
| 905 public void run() | 905 { | 
| 906 { | 906 try | 
| 907 Thread current = Thread.currentThread(); | 907 { | 
| 908 String name; | 908 accept(_acceptor); | 
| 909 synchronized (AbstractConnector.this) | 909 } | 
| 910 { | 910 catch (EofException e) | 
| 911 if (_acceptorThreads == null) | 911 { | 
| 912 return; | 912 LOG.trace("",e); | 
| 913 | 913 } | 
| 914 _acceptorThreads[_acceptor] = current; | 914 catch (IOException e) | 
| 915 name = _acceptorThreads[_acceptor].getName(); | 915 { | 
| 916 current.setName(name + " Acceptor" + _acceptor + " " + AbstractConnector.this); | 916 LOG.trace("",e); | 
| 917 } | 917 } | 
| 918 int old_priority = current.getPriority(); | 918 catch (InterruptedException x) | 
| 919 | 919 { | 
| 920 try | 920 // Connector has been stopped | 
| 921 { | 921 LOG.trace("",x); | 
| 922 current.setPriority(old_priority - _acceptorPriorityOffset); | 922 } | 
| 923 while (isRunning() && getConnection() != null) | 923 catch (Throwable e) | 
| 924 { | 924 { | 
| 925 try | 925 LOG.warn("",e); | 
| 926 { | 926 } | 
| 927 accept(_acceptor); | 927 } | 
| 928 } | 928 } | 
| 929 catch (EofException e) | 929 finally | 
| 930 { | 930 { | 
| 931 LOG.trace("",e); | 931 current.setPriority(old_priority); | 
| 932 } | 932 current.setName(name); | 
| 933 catch (IOException e) | 933 | 
| 934 { | 934 synchronized (AbstractConnector.this) | 
| 935 LOG.trace("",e); | 935 { | 
| 936 } | 936 if (_acceptorThreads != null) | 
| 937 catch (InterruptedException x) | 937 _acceptorThreads[_acceptor] = null; | 
| 938 { | 938 } | 
| 939 // Connector has been stopped | 939 } | 
| 940 LOG.trace("",x); | 940 } | 
| 941 } | 941 } | 
| 942 catch (Throwable e) | 942 | 
| 943 { | 943 /* ------------------------------------------------------------ */ | 
| 944 LOG.warn("",e); | 944 public String getName() | 
| 945 } | 945 { | 
| 946 } | 946 if (_name == null) | 
| 947 } | 947 _name = (getHost() == null?"0.0.0.0":getHost()) + ":" + (getLocalPort() <= 0?getPort():getLocalPort()); | 
| 948 finally | 948 return _name; | 
| 949 { | 949 } | 
| 950 current.setPriority(old_priority); | 950 | 
| 951 current.setName(name); | 951 /* ------------------------------------------------------------ */ | 
| 952 | 952 public void setName(String name) | 
| 953 synchronized (AbstractConnector.this) | 953 { | 
| 954 { | 954 _name = name; | 
| 955 if (_acceptorThreads != null) | 955 } | 
| 956 _acceptorThreads[_acceptor] = null; | 956 | 
| 957 } | 957 /* ------------------------------------------------------------ */ | 
| 958 } | 958 protected void connectionOpened(Connection connection) | 
| 959 } | 959 { | 
| 960 } | 960 } | 
| 961 | 961 | 
| 962 /* ------------------------------------------------------------ */ | 962 /* ------------------------------------------------------------ */ | 
| 963 public String getName() | 963 protected void connectionUpgraded(Connection oldConnection, Connection newConnection) | 
| 964 { | 964 { | 
| 965 if (_name == null) | 965 } | 
| 966 _name = (getHost() == null?"0.0.0.0":getHost()) + ":" + (getLocalPort() <= 0?getPort():getLocalPort()); | 966 | 
| 967 return _name; | 967 /* ------------------------------------------------------------ */ | 
| 968 } | 968 protected void connectionClosed(Connection connection) | 
| 969 | 969 { | 
| 970 /* ------------------------------------------------------------ */ | 970 connection.onClose(); | 
| 971 public void setName(String name) | 971 } | 
| 972 { | 972 | 
| 973 _name = name; | 973 /* ------------------------------------------------------------ */ | 
| 974 } | 974 /** | 
| 975 | 975 * @return the acceptorPriority | 
| 976 /* ------------------------------------------------------------ */ | 976 */ | 
| 977 protected void connectionOpened(Connection connection) | 977 public int getAcceptorPriorityOffset() | 
| 978 { | 978 { | 
| 979 } | 979 return _acceptorPriorityOffset; | 
| 980 | 980 } | 
| 981 /* ------------------------------------------------------------ */ | 981 | 
| 982 protected void connectionUpgraded(Connection oldConnection, Connection newConnection) | 982 /* ------------------------------------------------------------ */ | 
| 983 { | 983 /** | 
| 984 } | 984 * Set the priority offset of the acceptor threads. The priority is adjusted by this amount (default 0) to either favour the acceptance of new threads and | 
| 985 | 985 * newly active connections or to favour the handling of already dispatched connections. | 
| 986 /* ------------------------------------------------------------ */ | 986 * | 
| 987 protected void connectionClosed(Connection connection) | 987 * @param offset | 
| 988 { | 988 * the amount to alter the priority of the acceptor threads. | 
| 989 connection.onClose(); | 989 */ | 
| 990 } | 990 public void setAcceptorPriorityOffset(int offset) | 
| 991 | 991 { | 
| 992 /* ------------------------------------------------------------ */ | 992 _acceptorPriorityOffset = offset; | 
| 993 /** | 993 } | 
| 994 * @return the acceptorPriority | 994 | 
| 995 */ | 995 /* ------------------------------------------------------------ */ | 
| 996 public int getAcceptorPriorityOffset() | 996 /** | 
| 997 { | 997 * @return True if the the server socket will be opened in SO_REUSEADDR mode. | 
| 998 return _acceptorPriorityOffset; | 998 */ | 
| 999 } | 999 public boolean getReuseAddress() | 
| 1000 | 1000 { | 
| 1001 /* ------------------------------------------------------------ */ | 1001 return _reuseAddress; | 
| 1002 /** | 1002 } | 
| 1003 * Set the priority offset of the acceptor threads. The priority is adjusted by this amount (default 0) to either favour the acceptance of new threads and | 1003 | 
| 1004 * newly active connections or to favour the handling of already dispatched connections. | 1004 /* ------------------------------------------------------------ */ | 
| 1005 * | 1005 /** | 
| 1006 * @param offset | 1006 * @param reuseAddress | 
| 1007 * the amount to alter the priority of the acceptor threads. | 1007 * True if the the server socket will be opened in SO_REUSEADDR mode. | 
| 1008 */ | 1008 */ | 
| 1009 public void setAcceptorPriorityOffset(int offset) | 1009 public void setReuseAddress(boolean reuseAddress) | 
| 1010 { | 1010 { | 
| 1011 _acceptorPriorityOffset = offset; | 1011 _reuseAddress = reuseAddress; | 
| 1012 } | 1012 } | 
| 1013 | 1013 | 
| 1014 /* ------------------------------------------------------------ */ | 1014 /* ------------------------------------------------------------ */ | 
| 1015 /** | 1015 public boolean isLowResources() | 
| 1016 * @return True if the the server socket will be opened in SO_REUSEADDR mode. | 1016 { | 
| 1017 */ | 1017 return getThreadPool().isLowOnThreads(); | 
| 1018 public boolean getReuseAddress() | 1018 } | 
| 1019 { | 1019 | 
| 1020 return _reuseAddress; | 1020 /* ------------------------------------------------------------ */ | 
| 1021 } | 1021 private void updateNotEqual(AtomicLong valueHolder, long compare, long value) | 
| 1022 | 1022 { | 
| 1023 /* ------------------------------------------------------------ */ | 1023 long oldValue = valueHolder.get(); | 
| 1024 /** | 1024 while (compare != oldValue) | 
| 1025 * @param reuseAddress | 1025 { | 
| 1026 * True if the the server socket will be opened in SO_REUSEADDR mode. | 1026 if (valueHolder.compareAndSet(oldValue,value)) | 
| 1027 */ | 1027 break; | 
| 1028 public void setReuseAddress(boolean reuseAddress) | 1028 oldValue = valueHolder.get(); | 
| 1029 { | 1029 } | 
| 1030 _reuseAddress = reuseAddress; | 1030 } | 
| 1031 } | |
| 1032 | |
| 1033 /* ------------------------------------------------------------ */ | |
| 1034 public boolean isLowResources() | |
| 1035 { | |
| 1036 if (_threadPool != null) | |
| 1037 return _threadPool.isLowOnThreads(); | |
| 1038 return _server.getThreadPool().isLowOnThreads(); | |
| 1039 } | |
| 1040 | |
| 1041 /* ------------------------------------------------------------ */ | |
| 1042 private void updateNotEqual(AtomicLong valueHolder, long compare, long value) | |
| 1043 { | |
| 1044 long oldValue = valueHolder.get(); | |
| 1045 while (compare != oldValue) | |
| 1046 { | |
| 1047 if (valueHolder.compareAndSet(oldValue,value)) | |
| 1048 break; | |
| 1049 oldValue = valueHolder.get(); | |
| 1050 } | |
| 1051 } | |
| 1052 } | 1031 } | 
