in core/src/main/java/flex/messaging/endpoints/BaseStreamingHTTPEndpoint.java [930:1030]
protected void serviceStreamingRequest(HttpServletRequest req, HttpServletResponse res) {
// If this is a request for a streaming connection, make sure it's for a valid FlexClient
// and that the FlexSession doesn't already have a streaming connection open.
// Streaming requests are POSTs (to help prevent the possibility of caching) that carry the
// following parameters:
// command - Indicating a custom command for the endpoint; currently 'open' to request a new
// streaming connection be opened, and 'close' to request the streaming connection
// to close.
// version - Indicates the streaming connection 'version' to use; it's here for backward comp. support
// if we need to change how commands are handled in a future product release.
// DSId - The FlexClient id value that uniquely identifies the swf making the request.
String command = req.getParameter(COMMAND_PARAM_NAME);
// Only HTTP 1.1 is supported, disallow HTTP 1.0.
if (req.getProtocol().equals(HTTP_1_0)) {
if (Log.isError())
log.error("Endpoint with id '" + getId() + "' cannot service the streaming request made with " +
" HTTP 1.0. Only HTTP 1.1 is supported.");
try {
// Return an HTTP status code 400 to indicate that the client's request was syntactically invalid (bad command).
res.sendError(HttpServletResponse.SC_BAD_REQUEST);
} catch (IOException ignore) {
}
return; // Abort further server processing.
}
if (!(command.equals(OPEN_COMMAND) || command.equals(CLOSE_COMMAND))) {
if (Log.isError())
log.error("Endpoint with id '" + getId() + "' cannot service the streaming request as the supplied command '"
+ command + "' is invalid.");
try {
// Return an HTTP status code 400 to indicate that the client's request was syntactically invalid (bad command).
res.sendError(HttpServletResponse.SC_BAD_REQUEST);
} catch (IOException ignore) {
}
return; // Abort further server processing.
}
String flexClientId = req.getParameter(Message.FLEX_CLIENT_ID_HEADER);
if (flexClientId == null) {
if (Log.isError())
log.error("Endpoint with id '" + getId() + "' cannot service the streaming request as no FlexClient id"
+ " has been supplied in the request.");
try {
// Return an HTTP status code 400 to indicate that the client's request was syntactically invalid (missing id).
res.sendError(HttpServletResponse.SC_BAD_REQUEST);
} catch (IOException ignore) {
}
return; // Abort further server processing.
}
// Validate that the provided FlexClient id exists and is associated with the current session.
// We don't do this validation with CLOSE_COMMAND because CLOSE_COMMAND can come in on a
// different session. For example, when the session expires due to timeout, the streaming client
// using that session sends a CLOSE_COMMAND on a new session to let the server know to clean client's
// corresponding server constructs. In that case, server already knows that session has expired so
// we can simply omit this validation.
FlexClient flexClient = null;
List<FlexClient> flexClients = FlexContext.getFlexSession().getFlexClients();
boolean validFlexClientId = false;
for (Iterator<FlexClient> iter = flexClients.iterator(); iter.hasNext(); ) {
flexClient = iter.next();
if (flexClient.getId().equals(flexClientId) && flexClient.isValid()) {
validFlexClientId = true;
break;
}
}
if (!command.equals(CLOSE_COMMAND) && !validFlexClientId) {
if (Log.isError())
log.error("Endpoint with id '" + getId() + "' cannot service the streaming request as either the supplied"
+ " FlexClient id '" + flexClientId + " is not valid, or the FlexClient with that id is not valid.");
try {
// Return an HTTP status code 400 to indicate that the client's request was syntactically invalid (invalid id).
res.sendError(HttpServletResponse.SC_BAD_REQUEST);
} catch (IOException ignore) {
}
return; // Abort further server processing.
}
// If a close command is received and we don't have any flex clients registered simply invalidate
// the Flex Session. This will take care of the Flex Session that got created when the MB servlet
// was processing the CLOSE request.
if (command.equals(CLOSE_COMMAND) && flexClients.size() == 0) {
FlexSession flexSession = FlexContext.getFlexSession();
if (flexSession instanceof HttpFlexSession) {
((HttpFlexSession) flexSession).invalidate(false);
}
return;
}
if (flexClient != null) {
if (command.equals(OPEN_COMMAND))
handleFlexClientStreamingOpenRequest(req, res, flexClient);
else if (command.equals(CLOSE_COMMAND))
handleFlexClientStreamingCloseRequest(req, res, flexClient, req.getParameter(STREAM_ID_PARAM_NAME));
}
}