title: Websockets with Glassfish 3.1.2 and Grizzly - Unexpected response code: 405
body: <p>I'm trying to use websockets within my local Glassfish 3.1.2 server installation. I'm using Grizzly 2.2 in my Maven project :</p>
  
  <pre class="lang-xml prettyprint-override"><code>&lt;dependency&gt;
    &lt;groupId&gt;org.glassfish.grizzly&lt;/groupId&gt;
    &lt;artifactId&gt;grizzly-websockets&lt;/artifactId&gt;
    &lt;version&gt;2.2&lt;/version&gt;
  &lt;/dependency&gt;
  </code></pre>
  
  <p>WebSocketsServlet.java</p>
  
  <pre class="lang-java prettyprint-override"><code>import org.glassfish.grizzly.Grizzly;
  import java.util.logging.Logger;
  import org.glassfish.grizzly.websockets.WebSocketEngine;
  
  import javax.servlet.ServletConfig;
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServlet;
  
  public class WebSocketsServlet extends HttpServlet {
  
      private static final Logger logger = Grizzly.logger(WebSocketsServlet.class);
      private final VideoSharingApplication app = new VideoSharingApplication();
  
      @Override
      public void init(ServletConfig config) throws ServletException {
          logger.log(Level.SEVERE, "registering");
          WebSocketEngine.getEngine().register(config.getServletContext().getContextPath() + "/videosharing", app);
      }
  
      @Override
      public void destroy() {
          WebSocketEngine.getEngine().unregister(app);
      }
  }
  </code></pre>
  
  <p>VideoSharingWebSocket.java</p>
  
  <pre class="lang-java prettyprint-override"><code>import java.util.logging.Logger;
  import org.glassfish.grizzly.websockets.DefaultWebSocket;
  import org.glassfish.grizzly.websockets.ProtocolHandler;
  import org.glassfish.grizzly.websockets.WebSocketListener;
  import org.glassfish.grizzly.Grizzly;
  
  public class VideoSharingWebSocket extends DefaultWebSocket {
  
      private static final Logger logger = Grizzly.logger(VideoSharingWebSocket.class);
  
      public VideoSharingWebSocket(ProtocolHandler handler, WebSocketListener... listeners) {
          super(handler, listeners);
      }
  
  }
  </code></pre>
  
  <p>VideoSharingApplication.java</p>
  
  <pre class="lang-java prettyprint-override"><code>import java.util.logging.Level;
  import java.util.logging.Logger;
  import org.glassfish.grizzly.Grizzly;
  import org.glassfish.grizzly.websockets.ProtocolHandler;
  import org.glassfish.grizzly.websockets.WebSocket;
  import org.glassfish.grizzly.websockets.WebSocketApplication;
  import org.glassfish.grizzly.websockets.WebSocketListener;
  
  import org.glassfish.grizzly.http.HttpRequestPacket;
  
  public class VideoSharingApplication extends WebSocketApplication {
  
      private static final Logger logger = Grizzly.logger(VideoSharingApplication.class);
  
      @Override
      public WebSocket createSocket(ProtocolHandler handler, WebSocketListener... listeners) {
          logger.log(Level.SEVERE, "createSocket");
          return new VideoSharingWebSocket(handler, listeners);
      }
  
      @Override
      public boolean isApplicationRequest(HttpRequestPacket request) {
          logger.log(Level.SEVERE, "isApplicationRequest");
          return "/videosharing".equals(request.getRequestURI());
      }
  
      @Override
      public void onMessage(WebSocket socket, String data) {
          logger.log(Level.SEVERE, "onMessage");
          for (WebSocket webSocket : getWebSockets()) {
              if (socket != webSocket) {
                  webSocket.send(data);
              }
          }
      }
  }
  </code></pre>
  
  <p>I enabled websockets support in Glassfish with this command :</p>
  
  <pre><code>asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.websockets-support-enabled=true
  </code></pre>
  
  <p>Client code, app.js :</p>
  
  <pre class="lang-js prettyprint-override"><code>var network = function () {
      return {
          initialize: function() {
              var url = 'ws://localhost:8080/monApp/videosharing';
              var websocket = new WebSocket(url);
              websocket.name = APP.id;
              websocket.onopen = function(evt) {
                  alert('onopen');
              };
              websocket.onerror = function(evt) {
                  alert('onerror');
              };
              websocket.onmessage = function (evt) {
                  alert('onmessage');
                  var command = JSON.parse(evt.data);
                  if (command.type == "pause") {
                      APP.pauseVideo();
                  } else if (command.type == "play") {
                      APP.playVideo();
                  } else if (command.type == "seeked") {
                      APP.seekVideo(command.currentTime);
                  } else {
                      alert("Unknown command " + command);
                  }
              };
              websocket.onclose = function()
              {
                  alert('onclose');
              };
          },
          send: function(command) {
              websocket.send(command);
          }
      }
  };
  
  var APP = {
      id: Math.floor(Math.random() * 10000),
  
      network: network(),
  
      // Cannot use 'this' here after updating window.onload (see below)
      initialize: function () {
          APP.network.initialize();
          var video = APP.getVideo();
          video.addEventListener('play', 
              function (event) {
                  alert('play');
                  var command = { type: "play" };
                  APP.network.send(JSON.stringify(command));
              },
              false);
          video.addEventListener('pause',
              function (event) {
                  alert('pause');
                  var command = { type: "pause" };
                  APP.network.send(JSON.stringify(command));
              },
              false);
          video.addEventListener('seeked',
              function (event) {
                  alert('seeked');
                  var command = { type: "seeked",
                                  currentTime: APP.getVideo().currentTime };
                  APP.network.send(JSON.stringify(command));
              },
              false);
      },
  
      getVideo: function () {
          return document.getElementsByTagName("video")[0];
      },
  
      pauseVideo: function () {
          var video = this.getVideo();
          video.pause();
      },
  
      playVideo: function () {
          var video = this.getVideo();
          video.play();
      },
  
      seekVideo: function (currentTime) {
          var video = this.getVideo();
          video.currentTime = currentTime;
      }
  
  };
  
  window.onload = APP.initialize;
  </code></pre>
  
  <p>I'm testing this in Chrome 18.0.1025.165 in a Mac. At page loading I get this error :</p>
  
  <pre><code>Unexpected response code: 405
  </code></pre>
  
  <p>In the server logs there is no error and only my "registering" (WebSocketsServlet) log is displayed.</p>
  
  <p>Do you have any suggestion ?</p>
  
  <p>Thank you in advance.</p>
  
  <p>Best regards.</p>