Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[jetty-users] Jetty websocket almost works with Flash-based websocket clients

I'm trying to get jetty websockets to talk to this Flash-based web-socket-js library (which retrofits old browsers with websocket support):
http://github.com/gimite/web-socket-js

I can't get it to work, because the Flash client is sending a socket-policy-request that the server doesn't understand (HttpException 400 thrown at HttpParser.java:352). In the ruby-based sample websocket server that ships with the flash client, and also in this code from a nodejs websocket server [1], the Flash policy-file-request is detected and served automatically. Are there any plans for Jetty to support automatic flash policy file serving so that Flash-based clients can seamlessly connect?

The alternative is to set up a Flash policy file server on port 843. There are perl scripts in the wild that do this pretty easily, but I was hoping to not have to manage a separate process for such a simple thing. I suppose I could add a servlet that opens up its own rogue socket listener on port 843, but it seems like a reasonable thing to support by default through the standard http port, since Flash is likely to be the bridge to websockets for a while yet...


[1] from http://github.com/Guille/node.websocket.js/blob/master/websocket.js#L170
Basically, a special case for handling

  if (headers.length && headers[0].match(/<policy-file-request.*>/)) {
    // allows Flash based WebSocket implementation to connect.
    this.log('Flash policy file request');
    this._serveFlashPolicy();
    return false;
  }
...
Connection.prototype._serveFlashPolicy = function(){
  var origins = this.server.options.origins;
  if (!tools.isArray(origins)) {
    origins = [origins];
  }
  this.socket.send('<?xml version="1.0"?>\n');
  this.socket.send('<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">\n');
  this.socket.send('<cross-domain-policy>\n');
  for (var i = 0, l = origins.length; i < l; i++){
    this.socket.send(' <allow-access-from domain="' + origins[i] + '" to-ports="' + this.server.options.port + '"/>\n');
  }
  this.socket.send('</cross-domain-policy>\n');
  this.socket.close();
};



Back to the top