blob: b17771983404cc0f6a2992f4cc6b19768e158f79 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.synapse.transport.passthru;
import org.apache.http.nio.NHttpConnection;
import org.apache.synapse.transport.passthru.config.SourceConfiguration;
import org.apache.synapse.transport.passthru.util.ControlledByteBuffer;
/**
* This class represents the information about a TCP Connection at a given point in time.
* In a Single TCP Connection there can be multiple HTTP Requests.
*/
public class SourceContext {
public static final String CONNECTION_INFORMATION = "CONNECTION_INFORMATION";
private SourceConfiguration sourceConfiguration;
private ProtocolState state = ProtocolState.REQUEST_READY;
private SourceRequest request;
private SourceResponse response;
/** Mark the connection to be shut down after the current request-response is completed. */
private boolean shutDown = false;
private Pipe reader;
private Pipe writer;
public SourceContext(SourceConfiguration sourceConfiguration) {
this.sourceConfiguration = sourceConfiguration;
}
public ProtocolState getState() {
return state;
}
public void setState(ProtocolState state) {
this.state = state;
}
public SourceRequest getRequest() {
return request;
}
public void setRequest(SourceRequest request) {
this.request = request;
}
public SourceResponse getResponse() {
return response;
}
public void setResponse(SourceResponse response) {
this.response = response;
}
/**
* Reset the resources associated with this context
*/
public void reset() {
reset(false);
}
/**
* Reset the resources associated with this context
*
* @param isError whether an error is causing this shutdown of the connection.
* It is very important to set this flag correctly.
* When an error causing the shutdown of the connections we should not
* release associated writer buffer to the pool as it might lead into
* situations like same buffer is getting released to both source and target
* buffer factories
*/
public void reset(boolean isError) {
this.request = null;
this.response = null;
if (this.state != ProtocolState.CLOSED) {
// if the connection is not closed yet, prepare to receive a new request
// on it
this.state = ProtocolState.REQUEST_READY;
}
if (writer != null && !isError) { // If there is an error we do not release the buffer to the factory
ControlledByteBuffer buffer = writer.getBuffer();
buffer.clear();
sourceConfiguration.getBufferFactory().release(buffer);
}
this.reader = null;
this.writer = null;
}
public boolean isShutDown() {
return shutDown;
}
public void setShutDown(boolean shutDown) {
this.shutDown = shutDown;
}
public Pipe getReader() {
return reader;
}
public void setReader(Pipe reader) {
this.reader = reader;
}
public Pipe getWriter() {
return writer;
}
public void setWriter(Pipe writer) {
this.writer = writer;
}
public static void create(NHttpConnection conn, ProtocolState state,
SourceConfiguration configuration) {
SourceContext info = new SourceContext(configuration);
conn.getContext().setAttribute(CONNECTION_INFORMATION, info);
info.setState(state);
}
public static void updateState(NHttpConnection conn, ProtocolState state) {
SourceContext info = (SourceContext)
conn.getContext().getAttribute(CONNECTION_INFORMATION);
if (info != null) {
info.setState(state);
} else {
throw new IllegalStateException("Connection information should be present");
}
}
public static boolean assertState(NHttpConnection conn, ProtocolState state) {
SourceContext info = (SourceContext)
conn.getContext().getAttribute(CONNECTION_INFORMATION);
return info != null && info.getState() == state;
}
public static ProtocolState getState(NHttpConnection conn) {
SourceContext info = (SourceContext)
conn.getContext().getAttribute(CONNECTION_INFORMATION);
return info != null ? info.getState() : null;
}
public static void setRequest(NHttpConnection conn, SourceRequest request) {
SourceContext info = (SourceContext)
conn.getContext().getAttribute(CONNECTION_INFORMATION);
if (info != null) {
info.setRequest(request);
} else {
throw new IllegalStateException("Connection information should be present");
}
}
public static void setResponse(NHttpConnection conn, SourceResponse response) {
SourceContext info = (SourceContext)
conn.getContext().getAttribute(CONNECTION_INFORMATION);
if (info != null) {
info.setResponse(response);
} else {
throw new IllegalStateException("Connection information should be present");
}
}
public static SourceRequest getRequest(NHttpConnection conn) {
SourceContext info = (SourceContext)
conn.getContext().getAttribute(CONNECTION_INFORMATION);
return info != null ? info.getRequest() : null;
}
public static SourceResponse getResponse(NHttpConnection conn) {
SourceContext info = (SourceContext)
conn.getContext().getAttribute(CONNECTION_INFORMATION);
return info != null ? info.getResponse() : null;
}
public static SourceContext get(NHttpConnection conn) {
return (SourceContext) conn.getContext().getAttribute(CONNECTION_INFORMATION);
}
}