package ecologylab.oodss.distributed.server.clientsessionmanager;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.channels.SelectionKey;
import ecologylab.collections.Scope;
import ecologylab.oodss.distributed.impl.NIOServerIOThread;
import ecologylab.oodss.distributed.server.NIOServerProcessor;
import ecologylab.oodss.messages.HttpRequest;
import ecologylab.oodss.messages.RequestMessage;
import ecologylab.oodss.messages.ResponseMessage;
import ecologylab.serialization.SIMPLTranslationException;
import ecologylab.serialization.SimplTypesScope;
import ecologylab.serialization.formatenums.StringFormat;
public class HTTPPostClientSessionManager extends HTTPClientSessionManager
{
static final String HTTP_RESPONSE_HEADERS = HTTP_VERSION + " 200" + "\r\n";
static final String HTTP_PREPEND = "POST /";
static final int HTTP_PREPEND_LENGTH = HTTP_PREPEND.length();
/**
* @param token
* @param server
* @param socketKey
* @param translationScope
* @param registry
*/
public HTTPPostClientSessionManager(String token, int maxPacketSize, NIOServerIOThread server,
NIOServerProcessor frontend, SelectionKey socketKey, SimplTypesScope translationScope,
Scope<?> registry)
{
super(token, maxPacketSize, server, frontend, socketKey, translationScope, registry);
this.initialized = true;
}
/**
* This method only handles HttpPostRequest messages; it will report an error for any
* non-HttpPostRequest. Otherwise, it will not add anything to the msgBufOutgoing
*
* @see ecologylab.oodss.distributed.server.clientsessionmanager.ClientSessionManager#translateResponseMessageToString(ecologylab.oodss.messages.RequestMessage,
* ecologylab.oodss.messages.ResponseMessage)
*/
@Override
protected void translateResponseMessageToStringBufferContents(RequestMessage requestMessage,
ResponseMessage responseMessage, StringBuilder outgoingMessageBuf)
throws SIMPLTranslationException
{
if (!(requestMessage instanceof HttpRequest))
{
debug("ERROR! HTTPPostContextManager only handles HttpRequests!");
}
else
{
try {
SimplTypesScope.serialize(responseMessage, outgoingMessageBuf, StringFormat.JSON);
} catch (SIMPLTranslationException e) {
e.printStackTrace();
}
}
}
/**
* @throws UnsupportedEncodingException
* @see ecologylab.oodss.distributed.server.clientsessionmanager.ClientSessionManager#translateStringToRequestMessage(java.lang.String)
*/
@Override
protected RequestMessage translateStringToRequestMessage(CharSequence incomingMessage)
throws SIMPLTranslationException, UnsupportedEncodingException
{
String messageString = incomingMessage.toString();
messageString = URLDecoder.decode(messageString, "UTF-8");
return super.translateStringToRequestMessage(messageString);
}
/**
* @see ecologylab.oodss.distributed.server.clientsessionmanager.ClientSessionManager#createHeader(java.lang.StringBuilder,
* java.lang.StringBuilder, RequestMessage, ResponseMessage)
*/
@Override
protected void createHeader(int messageSize, StringBuilder outgoingMessageHeaderBuf,
RequestMessage incomingRequest, ResponseMessage outgoingResponse, long uid)
{
boolean isOK = outgoingResponse.isOK();
if(isOK)
{
outgoingMessageHeaderBuf.append(HTTP_RESPONSE_HEADERS
+ HTTP_CONTENT_TYPE
+ "Content-Length: " + messageSize);
debugA("Server sending response!!!\n" + outgoingMessageHeaderBuf.toString());
}
}
/**
* Translates an incoming character sequence identified to be an OODSS request message (not a GET
* or POST request).
*
* @param messageCharSequence
* @param startLineString
* TODO
* @return The request message contained in the message.
* @throws SIMPLTranslationException
*/
@Override
protected RequestMessage translateOODSSRequest(CharSequence messageCharSequence,
String startLineString) throws SIMPLTranslationException
{
return (RequestMessage) translationScope.deserialize(messageCharSequence, StringFormat.JSON);
}
/**
* Translates an incoming character sequence identified to be a POST request.
*
* This implementation expects the POST request to contain a nested OODSS request.
*
* @param messageCharSequence
* @param startLineString
* TODO
* @return
* @throws SIMPLTranslationException
*/
@Override
protected RequestMessage translatePostRequest(CharSequence messageCharSequence,
String startLineString) throws SIMPLTranslationException
{
String messageString = messageCharSequence.toString();
return this.translateOODSSRequest(messageString, startLineString);
}
}