| // Copyright 2012 Citrix Systems, Inc. Licensed under the |
| // Apache License, Version 2.0 (the "License"); you may not use this |
| // file except in compliance with the License. Citrix Systems, Inc. |
| // reserves all rights not expressly granted by 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. |
| // |
| // Automatically generated by addcopyright.py at 04/03/2012 |
| package com.cloud.cluster;
|
| |
| import java.io.ByteArrayInputStream; |
| import java.io.IOException; |
| import java.net.URLDecoder; |
| |
| import org.apache.commons.httpclient.HttpStatus; |
| import org.apache.http.HttpEntityEnclosingRequest; |
| import org.apache.http.HttpException; |
| import org.apache.http.HttpRequest; |
| import org.apache.http.HttpResponse; |
| import org.apache.http.entity.BasicHttpEntity; |
| import org.apache.http.protocol.HttpContext; |
| import org.apache.http.protocol.HttpRequestHandler; |
| import org.apache.http.util.EntityUtils; |
| import org.apache.log4j.Logger; |
| |
| public class ClusterServiceServletHttpHandler implements HttpRequestHandler {
|
| private static final Logger s_logger = Logger.getLogger(ClusterServiceServletHttpHandler.class);
|
|
|
| private final ClusterManager manager;
|
|
|
| public ClusterServiceServletHttpHandler(ClusterManager manager) {
|
| this.manager = manager;
|
| }
|
|
|
| @Override
|
| public void handle(HttpRequest request, HttpResponse response, HttpContext context)
|
| throws HttpException, IOException {
|
|
|
| try {
|
| if(s_logger.isTraceEnabled()) { |
| s_logger.trace("Start Handling cluster HTTP request"); |
| }
|
|
|
| parseRequest(request);
|
| handleRequest(request, response);
|
|
|
| if(s_logger.isTraceEnabled()) { |
| s_logger.trace("Handle cluster HTTP request done"); |
| }
|
|
|
| } catch(Throwable e) {
|
| if(s_logger.isDebugEnabled()) { |
| s_logger.debug("Exception " + e.toString()); |
| }
|
| |
| try {
|
| writeResponse(response, HttpStatus.SC_INTERNAL_SERVER_ERROR, null); |
| } catch(Throwable e2) { |
| if(s_logger.isDebugEnabled()) { |
| s_logger.debug("Exception " + e2.toString()); |
| } |
| }
|
| }
|
| }
|
|
|
| @SuppressWarnings("deprecation")
|
| private void parseRequest(HttpRequest request) throws IOException {
|
| if(request instanceof HttpEntityEnclosingRequest) {
|
| HttpEntityEnclosingRequest entityRequest = (HttpEntityEnclosingRequest)request;
|
|
|
| String body = EntityUtils.toString(entityRequest.getEntity());
|
| if(body != null) {
|
| String[] paramArray = body.split("&");
|
| if(paramArray != null) {
|
| for (String paramEntry : paramArray) {
|
| String[] paramValue = paramEntry.split("=");
|
| if (paramValue.length != 2) { |
| continue; |
| }
|
|
|
| String name = URLDecoder.decode(paramValue[0]);
|
| String value = URLDecoder.decode(paramValue[1]);
|
|
|
| if(s_logger.isTraceEnabled()) { |
| s_logger.trace("Parsed request parameter " + name + "=" + value); |
| }
|
| request.getParams().setParameter(name, value);
|
| }
|
| }
|
| }
|
| }
|
| }
|
|
|
| private void writeResponse(HttpResponse response, int statusCode, String content) {
|
| if(content == null) { |
| content = ""; |
| }
|
| response.setStatusCode(statusCode);
|
| BasicHttpEntity body = new BasicHttpEntity();
|
| body.setContentType("text/html; charset=UTF-8");
|
|
|
| byte[] bodyData = content.getBytes();
|
| body.setContent(new ByteArrayInputStream(bodyData));
|
| body.setContentLength(bodyData.length);
|
| response.setEntity(body);
|
| }
|
|
|
| protected void handleRequest(HttpRequest req, HttpResponse response) {
|
| String method = (String)req.getParams().getParameter("method");
|
|
|
| int nMethod = RemoteMethodConstants.METHOD_UNKNOWN;
|
| String responseContent = null;
|
| try {
|
| if(method != null) { |
| nMethod = Integer.parseInt(method); |
| }
|
|
|
| switch(nMethod) {
|
| case RemoteMethodConstants.METHOD_DELIVER_PDU : |
| responseContent = handleDeliverPduMethodCall(req); |
| break; |
|
|
| case RemoteMethodConstants.METHOD_PING :
|
| responseContent = handlePingMethodCall(req);
|
| break;
|
|
|
| case RemoteMethodConstants.METHOD_UNKNOWN :
|
| default :
|
| assert(false);
|
| s_logger.error("unrecognized method " + nMethod);
|
| break;
|
| }
|
| } catch(Throwable e) {
|
| s_logger.error("Unexpected exception when processing cluster service request : ", e);
|
| }
|
|
|
| if(responseContent != null) { |
| if(s_logger.isTraceEnabled()) |
| s_logger.trace("Write reponse with HTTP OK " + responseContent); |
|
|
| writeResponse(response, HttpStatus.SC_OK, responseContent);
|
| } else { |
| if(s_logger.isTraceEnabled()) |
| s_logger.trace("Write reponse with HTTP Bad request"); |
|
|
| writeResponse(response, HttpStatus.SC_BAD_REQUEST, null);
|
| }
|
| }
|
| |
| private String handleDeliverPduMethodCall(HttpRequest req) { |
| |
| String pduSeq = (String)req.getParams().getParameter("pduSeq"); |
| String pduAckSeq = (String)req.getParams().getParameter("pduAckSeq"); |
| String sourcePeer = (String)req.getParams().getParameter("sourcePeer"); |
| String destPeer = (String)req.getParams().getParameter("destPeer"); |
| String agentId = (String)req.getParams().getParameter("agentId"); |
| String gsonPackage = (String)req.getParams().getParameter("gsonPackage"); |
| String stopOnError = (String)req.getParams().getParameter("stopOnError"); |
| String pduType = (String)req.getParams().getParameter("pduType"); |
| |
| ClusterServicePdu pdu = new ClusterServicePdu(); |
| pdu.setSourcePeer(sourcePeer); |
| pdu.setDestPeer(destPeer); |
| pdu.setAgentId(Long.parseLong(agentId)); |
| pdu.setSequenceId(Long.parseLong(pduSeq)); |
| pdu.setAckSequenceId(Long.parseLong(pduAckSeq)); |
| pdu.setJsonPackage(gsonPackage); |
| pdu.setStopOnError("1".equals(stopOnError)); |
| pdu.setPduType(Integer.parseInt(pduType)); |
| |
| manager.OnReceiveClusterServicePdu(pdu); |
| return "true"; |
| } |
|
|
| private String handlePingMethodCall(HttpRequest req) {
|
| String callingPeer = (String)req.getParams().getParameter("callingPeer");
|
|
|
| if(s_logger.isDebugEnabled()) { |
| s_logger.debug("Handle ping request from " + callingPeer); |
| }
|
|
|
| return "true";
|
| }
|
| }
|