in core/src/main/java/flex/messaging/endpoints/amf/SerializationFilter.java [104:238]
public void invoke(final ActionContext context) throws IOException {
boolean success = false;
// Additional AMF packet tracing is enabled only at the debug logging level
// and only if there's a target listening for it.
AmfTrace debugTrace = Log.isDebug() && logger.hasTarget() ? new AmfTrace() : null;
// Create an empty ActionMessage object to hold our response
context.setResponseMessage(new ActionMessage());
SerializationContext sc = SerializationContext.getSerializationContext();
try {
// Deserialize the input stream into an "ActionMessage" object.
MessageDeserializer deserializer = sc.newMessageDeserializer();
// Set up the deserialization context
HttpServletRequest req = FlexContext.getHttpRequest();
InputStream in = req.getInputStream();
// Determine whether the request is coming from a Javascript client.
// If so, convert stream from UTF-8 to raw hex before AMF deserialization.
String contentType = req.getContentType();
boolean jsClient = (contentType != null && contentType.startsWith(MessageIOConstants.CONTENT_TYPE_PLAIN));
if (jsClient) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in, UTF8_CHARSET));
int currentByte = -1;
while ((currentByte = reader.read()) != -1) {
if (currentByte == 256)
currentByte = 0;
outputStream.write(currentByte);
}
if (outputStream.size() > 0)
in = new ByteArrayInputStream(outputStream.toByteArray());
}
deserializer.initialize(sc, in, debugTrace);
// record the length of the input stream for performance metrics
int reqLen = FlexContext.getHttpRequest().getContentLength();
context.setDeserializedBytes(reqLen);
// set up the incoming MPI info if it is enabled
if (context.isMPIenabled()) {
MessagePerformanceInfo mpi = new MessagePerformanceInfo();
mpi.recordMessageSizes = context.isRecordMessageSizes();
mpi.recordMessageTimes = context.isRecordMessageTimes();
if (context.isRecordMessageTimes())
mpi.receiveTime = System.currentTimeMillis();
if (context.isRecordMessageSizes())
mpi.messageSize = reqLen;
context.setMPII(mpi);
}
ActionMessage m = new ActionMessage();
context.setRequestMessage(m);
deserializer.readMessage(m, context);
success = true;
} catch (Throwable t) {
handleDeserializationException(context, t, logger);
} finally {
// Use the same ActionMessage version for the response
ActionMessage respMsg = context.getResponseMessage();
respMsg.setVersion(context.getVersion());
if (debugTrace != null)
logger.debug(debugTrace.toString());
}
try {
if (success) {
next.invoke(context);
}
} catch (Throwable t) {
unhandledError(context, t);
} finally {
// serialize output
if (context.getStatus() != MessageIOConstants.STATUS_NOTAMF) {
ByteArrayOutputStream outBuffer = new ByteArrayOutputStream();
ActionMessage respMesg = context.getResponseMessage();
// Additional AMF packet tracing is enabled only at the debug logging level
// and only if there's a target listening for it.
debugTrace = Log.isDebug() && logger.hasTarget() ? new AmfTrace() : null;
try {
// overhead calculation is only necessary when MPI is enabled
long serializationOverhead = 0;
if (context.isRecordMessageTimes()) {
// set server send time
context.getMPIO().sendTime = System.currentTimeMillis();
if (context.isRecordMessageSizes())
serializationOverhead = System.currentTimeMillis();
}
MessageSerializer serializer = sc.newMessageSerializer();
serializer.initialize(sc, outBuffer, debugTrace);
serializer.writeMessage(respMesg);
// keep track of serializes bytes for performance metrics
context.setSerializedBytes(outBuffer.size());
// serialized message again after adding info if mpio with sizing is enabled
if (context.isRecordMessageSizes()) {
try {
context.getMPIO().messageSize = outBuffer.size();
// reset server send time
if (context.isRecordMessageTimes()) {
serializationOverhead = System.currentTimeMillis() - serializationOverhead;
context.getMPIO().addToOverhead(serializationOverhead);
context.getMPIO().sendTime = System.currentTimeMillis();
}
// reserialize the message now that info has been added
outBuffer = new ByteArrayOutputStream();
respMesg = context.getResponseMessage();
serializer.initialize(sc, outBuffer, debugTrace);
serializer.writeMessage(respMesg);
} catch (Exception e) {
if (Log.isDebug())
logger.debug("MPI set up error: " + e.toString());
}
}
context.setResponseOutput(outBuffer);
} catch (Exception e) {
handleSerializationException(sc, context, e, logger);
} finally {
if (debugTrace != null)
logger.debug(debugTrace.toString());
}
}
}
}