Skip to content

Commit

Permalink
Pull up common Http11ConnectionHandler methods.
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1656021 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
markt-asf committed Jan 30, 2015
1 parent 1ad835f commit 0757160
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 127 deletions.
53 changes: 52 additions & 1 deletion java/org/apache/coyote/http11/AbstractHttp11Protocol.java
Expand Up @@ -16,9 +16,16 @@
*/
package org.apache.coyote.http11;

import org.apache.coyote.AbstractProtocol;
import java.io.IOException;
import java.nio.ByteBuffer;

import javax.servlet.http.HttpUpgradeHandler;

import org.apache.coyote.AbstractProtocol;
import org.apache.coyote.Processor;
import org.apache.coyote.http11.upgrade.UpgradeProcessor;
import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.SocketWrapperBase;

public abstract class AbstractHttp11Protocol<S> extends AbstractProtocol<S> {

Expand All @@ -34,6 +41,17 @@ protected String getProtocolName() {
}


/**
* {@inheritDoc}
* <p>
* Over-ridden here to make the method visible to nested classes.
*/
@Override
protected AbstractEndpoint<S> getEndpoint() {
return super.getEndpoint();
}


// ------------------------------------------------ HTTP specific properties
// ------------------------------------------ managed in the ProtocolHandler

Expand Down Expand Up @@ -234,5 +252,38 @@ protected void configureProcessor(Http11Processor processor) {
protected abstract static class AbstractHttp11ConnectionHandler<S>
extends AbstractConnectionHandler<S,Http11Processor> {

private final AbstractHttp11Protocol<S> proto;


protected AbstractHttp11ConnectionHandler(AbstractHttp11Protocol<S> proto) {
this.proto = proto;
}


@Override
protected AbstractHttp11Protocol<S> getProtocol() {
return proto;
}


@Override
public Http11Processor createProcessor() {
Http11Processor processor = new Http11Processor(
proto.getMaxHttpHeaderSize(), proto.getEndpoint(),
proto.getMaxTrailerSize(), proto.getMaxExtensionSize(),
proto.getMaxSwallowSize());
proto.configureProcessor(processor);
register(processor);
return processor;
}


@Override
protected Processor createUpgradeProcessor(
SocketWrapperBase<?> socket, ByteBuffer leftoverInput,
HttpUpgradeHandler httpUpgradeHandler)
throws IOException {
return new UpgradeProcessor(socket, leftoverInput, httpUpgradeHandler);
}
}
}
49 changes: 8 additions & 41 deletions java/org/apache/coyote/http11/Http11AprProtocol.java
Expand Up @@ -16,14 +16,7 @@
*/
package org.apache.coyote.http11;

import java.io.IOException;
import java.nio.ByteBuffer;

import javax.servlet.http.HttpUpgradeHandler;

import org.apache.coyote.AbstractProtocol;
import org.apache.coyote.Processor;
import org.apache.coyote.http11.upgrade.UpgradeProcessor;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.net.AprEndpoint;
Expand Down Expand Up @@ -214,15 +207,8 @@ public void start() throws Exception {
protected static class Http11ConnectionHandler
extends AbstractHttp11ConnectionHandler<Long> {

protected Http11AprProtocol proto;

Http11ConnectionHandler(Http11AprProtocol proto) {
this.proto = proto;
}

@Override
protected AbstractProtocol<Long> getProtocol() {
return proto;
super(proto);
}

@Override
Expand All @@ -235,25 +221,25 @@ public void release(SocketWrapperBase<Long> socket,
Processor processor, boolean addToPoller) {
processor.recycle();
recycledProcessors.push(processor);
if (addToPoller && proto.getEndpoint().isRunning()) {
((AprEndpoint)proto.getEndpoint()).getPoller().add(
if (addToPoller && getProtocol().getEndpoint().isRunning()) {
((AprEndpoint)getProtocol().getEndpoint()).getPoller().add(
socket.getSocket().longValue(),
proto.getEndpoint().getKeepAliveTimeout(), true, false);
getProtocol().getEndpoint().getKeepAliveTimeout(), true, false);
}
}

@Override
public SocketState process(SocketWrapperBase<Long> socket,
SocketStatus status) {
if (proto.npnHandler != null) {
if (getProtocol().npnHandler != null) {
Processor processor = null;
if (status == SocketStatus.OPEN_READ) {
processor = connections.get(socket.getSocket());

}
if (processor == null) {
// if not null - handled by http11
SocketState socketState = proto.npnHandler.process(socket, status);
SocketState socketState = getProtocol().npnHandler.process(socket, status);
// handled by npn protocol.
if (socketState == SocketState.CLOSED ||
socketState == SocketState.LONG) {
Expand All @@ -266,7 +252,7 @@ public SocketState process(SocketWrapperBase<Long> socket,

@Override
protected void initSsl(SocketWrapperBase<Long> socket, Processor processor) {
if (proto.isSSLEnabled()) {
if (getProtocol().isSSLEnabled()) {
AprSSLSupport sslSupport =
new AprSSLSupport(socket, processor.getClientCertProvider());
processor.setSslSupport(sslSupport);
Expand All @@ -283,7 +269,7 @@ protected void longPoll(SocketWrapperBase<Long> socket, Processor processor) {
socket.setAsync(true);
} else {
// Upgraded
Poller p = ((AprEndpoint) proto.getEndpoint()).getPoller();
Poller p = ((AprEndpoint) getProtocol().getEndpoint()).getPoller();
if (p == null) {
// Connector has been stopped
release(socket, processor, false);
Expand All @@ -292,24 +278,5 @@ protected void longPoll(SocketWrapperBase<Long> socket, Processor processor) {
}
}
}

@Override
protected Http11Processor createProcessor() {
Http11Processor processor = new Http11Processor(
proto.getMaxHttpHeaderSize(), proto.getEndpoint(),
proto.getMaxTrailerSize(), proto.getMaxExtensionSize(),
proto.getMaxSwallowSize());
proto.configureProcessor(processor);
register(processor);
return processor;
}

@Override
protected Processor createUpgradeProcessor(
SocketWrapperBase<?> socket, ByteBuffer leftoverInput,
HttpUpgradeHandler httpUpgradeHandler)
throws IOException {
return new UpgradeProcessor(socket, leftoverInput, httpUpgradeHandler);
}
}
}
58 changes: 13 additions & 45 deletions java/org/apache/coyote/http11/Http11Nio2Protocol.java
Expand Up @@ -16,16 +16,11 @@
*/
package org.apache.coyote.http11;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ReadPendingException;

import javax.net.ssl.SSLEngine;
import javax.servlet.http.HttpUpgradeHandler;

import org.apache.coyote.AbstractProtocol;
import org.apache.coyote.Processor;
import org.apache.coyote.http11.upgrade.UpgradeProcessor;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.net.Nio2Channel;
Expand Down Expand Up @@ -67,6 +62,7 @@ public void start() throws Exception {
}



// -------------------- Pool setup --------------------

public void setAcceptorThreadPriority(int threadPriority) {
Expand Down Expand Up @@ -103,15 +99,8 @@ protected static class Http11ConnectionHandler
extends AbstractHttp11ConnectionHandler<Nio2Channel>
implements Handler {

protected Http11Nio2Protocol proto;

Http11ConnectionHandler(Http11Nio2Protocol proto) {
this.proto = proto;
}

@Override
protected AbstractProtocol<Nio2Channel> getProtocol() {
return proto;
super(proto);
}

@Override
Expand All @@ -122,7 +111,7 @@ protected Log getLog() {

@Override
public SSLImplementation getSslImplementation() {
return proto.sslImplementation;
return ((Http11Nio2Protocol) getProtocol()).sslImplementation;
}

/**
Expand All @@ -141,8 +130,8 @@ public void release(SocketWrapperBase<Nio2Channel> socket) {
@Override
public SocketState process(SocketWrapperBase<Nio2Channel> socket,
SocketStatus status) {
if (proto.npnHandler != null) {
SocketState ss = proto.npnHandler.process(socket, status);
if (getProtocol().npnHandler != null) {
SocketState ss = getProtocol().npnHandler.process(socket, status);
if (ss != SocketState.OPEN) {
return ss;
}
Expand All @@ -157,7 +146,7 @@ public void release(SocketWrapperBase<Nio2Channel> socket,
processor.recycle();
recycledProcessors.push(processor);
if (socket.isAsync()) {
((Nio2Endpoint) proto.getEndpoint()).removeTimeout(socket);
((Nio2Endpoint) getProtocol().getEndpoint()).removeTimeout(socket);
}
if (addToPoller) {
((Nio2SocketWrapper) socket).awaitBytes();
Expand All @@ -167,13 +156,11 @@ public void release(SocketWrapperBase<Nio2Channel> socket,

@Override
protected void initSsl(SocketWrapperBase<Nio2Channel> socket, Processor processor) {
if (proto.isSSLEnabled() &&
(proto.sslImplementation != null)
if (getProtocol().isSSLEnabled() && getSslImplementation() != null
&& (socket.getSocket() instanceof SecureNio2Channel)) {
SecureNio2Channel ch = (SecureNio2Channel)socket.getSocket();
processor.setSslSupport(
proto.sslImplementation.getSSLSupport(
ch.getSslEngine().getSession()));
processor.setSslSupport(getSslImplementation().getSSLSupport(
ch.getSslEngine().getSession()));
} else {
processor.setSslSupport(null);
}
Expand All @@ -184,7 +171,7 @@ protected void initSsl(SocketWrapperBase<Nio2Channel> socket, Processor processo
protected void longPoll(SocketWrapperBase<Nio2Channel> socket, Processor processor) {
if (processor.isAsync()) {
socket.setAsync(true);
((Nio2Endpoint) proto.getEndpoint()).addTimeout(socket);
((Nio2Endpoint) getProtocol().getEndpoint()).addTimeout(socket);
} else if (processor.isUpgrade()) {
if (((Nio2SocketWrapper) socket).isUpgradeInit()) {
try {
Expand All @@ -205,36 +192,17 @@ protected void longPoll(SocketWrapperBase<Nio2Channel> socket, Processor process
}
}

@Override
public Http11Processor createProcessor() {
Http11Processor processor = new Http11Processor(
proto.getMaxHttpHeaderSize(), proto.getEndpoint(),
proto.getMaxTrailerSize(), proto.getMaxExtensionSize(),
proto.getMaxSwallowSize());
proto.configureProcessor(processor);
register(processor);
return processor;
}

@Override
protected Processor createUpgradeProcessor(
SocketWrapperBase<?> socket, ByteBuffer leftoverInput,
HttpUpgradeHandler httpUpgradeHandler)
throws IOException {
return new UpgradeProcessor(socket, leftoverInput, httpUpgradeHandler);
}

@Override
public void onCreateSSLEngine(SSLEngine engine) {
if (proto.npnHandler != null) {
proto.npnHandler.onCreateEngine(engine);
if (getProtocol().npnHandler != null) {
getProtocol().npnHandler.onCreateEngine(engine);
}
}

@Override
public void closeAll() {
for (Nio2Channel channel : connections.keySet()) {
((Nio2Endpoint) proto.getEndpoint()).closeSocket(channel.getSocket());
((Nio2Endpoint) getProtocol().getEndpoint()).closeSocket(channel.getSocket());
}
}
}
Expand Down

0 comments on commit 0757160

Please sign in to comment.