Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source
   * Copyright 2010 Red Hat Inc. and/or its affiliates and other
   * contributors as indicated by the @author tags. All rights reserved.
   * See the copyright.txt in the distribution for a full listing of
   * individual contributors.
   *
   * This is free software; you can redistribute it and/or modify it
   * under the terms of the GNU Lesser General Public License as
  * published by the Free Software Foundation; either version 2.1 of
  * the License, or (at your option) any later version.
  *
  * This software is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
 package org.infinispan.server.websocket;
 
 import static org.jboss.netty.handler.codec.http.HttpHeaders.*;
 import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.*;
 import static org.jboss.netty.handler.codec.http.HttpHeaders.Values.*;
 import static org.jboss.netty.handler.codec.http.HttpMethod.*;
 import static org.jboss.netty.handler.codec.http.HttpResponseStatus.*;
 import static org.jboss.netty.handler.codec.http.HttpVersion.*;
 
 import java.util.Map;
 
 import  org.json.JSONException;
 import  org.json.JSONObject;

Web Socket Server Handler (Netty).

Websocket specific code lifted from Netty WebSocket Server example.

 
 
    private static final String INFINISPAN_WS_JS_FILENAME = "infinispan-ws.js";
    private CacheContainer cacheContainer;
    private Map<StringOpHandleroperationHandlers;
    private boolean connectionUpgraded;
    private Map<StringCachestartedCaches;
 
    public WebSocketServerHandler(CacheContainer cacheContainerMap<StringOpHandleroperationHandlersMap<StringCachestartedCaches) {
       this. = cacheContainer;
       this. = operationHandlers;
       this. = startedCaches;
    }
 
    @Override
    public void messageReceived(ChannelHandlerContext ctxMessageEvent ethrows Exception {
       Object msg = e.getMessage();
       if (msg instanceof HttpRequest) {
          handleHttpRequest(ctx, (HttpRequestmsg);
       } else if (msg instanceof WebSocketFrame) {
          handleWebSocketFrame(ctx, (WebSocketFramemsg);
       }
    }
 
    private void handleHttpRequest(ChannelHandlerContext ctxHttpRequest reqthrows Exception {
       // Allow only GET methods.
       if (req.getMethod() != ) {
          sendHttpResponse(ctxreqnew DefaultHttpResponse());
          return;
       }
 
       if (! && req.getUri().equalsIgnoreCase("/" + )) {
          DefaultHttpResponse res = new DefaultHttpResponse();
          loadScriptToResponse(reqres);
         sendHttpResponse(ctxreqres);
         return;
      } else if (..equalsIgnoreCase(req.getHeader()) &&
            .equalsIgnoreCase(req.getHeader(.))) {
         // Serve the WebSocket handshake request.
         // Create the WebSocket handshake response.
         HttpResponse res = new DefaultHttpResponse(new HttpResponseStatus(101, "Web Socket Protocol Handshake"));
         res.addHeader(..);
         res.addHeader(..);
         // Fill in the headers and contents depending on handshake method.
         if (req.containsHeader(.) &&
            req.containsHeader(.)) {
            // New handshake method with a challenge:
            res.addHeader(.req.getHeader(.));
            res.addHeader(.getWebSocketLocation(req));
            String protocol = req.getHeader(.);
            if (protocol != null) {
               res.addHeader(.protocol);
            }
            // Calculate the answer of the challenge.
            String key1 = req.getHeader(.);
            String key2 = req.getHeader(.);
            int a = (int) (Long.parseLong(key1.replaceAll("[^0-9]""")) / key1.replaceAll("[^ ]""").length());
            int b = (int) (Long.parseLong(key2.replaceAll("[^0-9]""")) / key2.replaceAll("[^ ]""").length());
            long c = req.getContent().readLong();
            ChannelBuffer input = ChannelBuffers.buffer(16);
            input.writeInt(a);
            input.writeInt(b);
            input.writeLong(c);
            ChannelBuffer output = ChannelBuffers.wrappedBuffer(
                    MessageDigest.getInstance("MD5").digest(input.array()));
            res.setContent(output);
         } else {
            // Old handshake method with no challenge:
            res.addHeader(.req.getHeader(.));
            res.addHeader(.getWebSocketLocation(req));
            String protocol = req.getHeader(.);
            if (protocol != null) {
               res.addHeader(.protocol);
            }
         }
         // Upgrade the connection and send the handshake response.
         ChannelPipeline p = ctx.getChannel().getPipeline();
         p.remove("aggregator");
         p.replace("decoder""wsdecoder"new WebSocketFrameDecoder());
         ctx.getChannel().write(res);
         p.replace("encoder""wsencoder"new WebSocketFrameEncoder());
         return;
      }
      // Send an error page otherwise.
      sendHttpResponse(ctxreqnew DefaultHttpResponse());
   }
   private void handleWebSocketFrame(ChannelHandlerContext ctxWebSocketFrame frame) {
      try {
         JSONObject payload = new JSONObject(frame.getTextData());
         String opCode = (Stringpayload.get(.);
         String cacheName = (Stringpayload.opt(.);
         Cache<ObjectObjectcache = getCache(cacheName);
         OpHandler handler = .get(opCode);
         if (handler != null) {
            handler.handleOp(payloadcachectx);
         }
      } catch (JSONException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
   private Cache<ObjectObjectgetCache(final String cacheName) {
      String key = cacheName;
      Cache<ObjectObjectcache;
      if (key == null) {
         key = "";
      }
      cache = .get(key);
      if (cache == null) {
         synchronized () {
            cache = .get(key);
            if (cache == null) {
               if (cacheName != null) {
                  cache = .getCache(key);
               } else {
                  cache = .getCache();
               }
               .put(keycache);
               cache.start();
            }
         }
      }
      return cache;
   }
   private void sendHttpResponse(ChannelHandlerContext ctxHttpRequest reqHttpResponse res) {
      // Generate an error page if response status code is not OK (200).
      if (res.getStatus().getCode() != 200) {
         res.setContent(ChannelBuffers.copiedBuffer(res.getStatus().toString(), .));
         HttpHeaders.setContentLength(resres.getContent().readableBytes());
      }
      // Send the response and close the connection if necessary.
      ChannelFuture f = ctx.getChannel().write(res);
      if (!isKeepAlive(req) || res.getStatus().getCode() != 200) {
      }
   }
   private void loadScriptToResponse(HttpRequest reqDefaultHttpResponse res) {
      String wsAddress = getWebSocketLocation(req);
      StringWriter writer = new StringWriter();
      writer.write("var defaultWSAddress = '" + wsAddress + "';");
      writer.write(WebSocketServer.getJavascript());
      ChannelBuffer content = ChannelBuffers.copiedBuffer(writer.toString(), .);
      res.setHeader("text/javascript; charset=UTF-8");
      setContentLength(rescontent.readableBytes());
      res.setContent(content);
   }
   public void exceptionCaught(ChannelHandlerContext ctxExceptionEvent ethrows Exception {
      e.getCause().printStackTrace();
      e.getChannel().close();
   }
   private String getWebSocketLocation(HttpRequest req) {
      return "ws://" + req.getHeader(..) + "/";
   }
New to GrepCode? Check out our FAQ X