Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I register multiple handlers for a HttpServer, in Dart?

Tags:

dart

(I'm using the new lib v2 version of dart:io.)

I'd like to register multiple handlers for an HttpServer, specifically a WebSocketTransformer and other arbitrary handlers. Something like this:

// pseudo-code

var server = HttpServer;
server.register('/foo', someHandlerFunction);        // 1
server.register('/bar', someOtherHandlerFunction);   // 2
server.register('/ws', webSocketHandler);            // 3

If #1 matches, then #2 isn't tested, and so on. So, it's greedy.

I've seen samples with just one handler. How do I register many handlers? Thanks in advance!

like image 885
Seth Ladd Avatar asked Feb 27 '13 00:02

Seth Ladd


1 Answers

New answer: Use the route package: http://pub.dartlang.org/packages/route

Here's your example using route's serve() method:

HttpServer.bind('127.0.0.1', 8889).then((server) {
  var router = new Router(server)
    ..serve('/ws').transform(new WebSocketTransformer()).listen(handleWebSocket)
    ..serve('/foo').listen((req) {
      req.response..addString('foo')..close();
    });
});

Router automatically catches unhandled requests and sends a 404, though soon you'll be able to override that with a defaultStream you can listen to.

Router also supports filters, useful for logging, auth, compression, etc.:

HttpServer.bind('127.0.0.1', 8889).then((server) {
  var router = new Router(server)
    ..filter(new RegExp(r'/.*'), (req) {
      //log all requests
      _logger.info("request: $req");
      return new Future.immediate(true); // keep processing request
    })
    ..filter(new Regexp(r'/secure/.*'), (req) {
      // check authentication asynchronously
      return getUserFromRequest(req).then((user) {
        if (user == null) {
          sendRedirect('/login'); // sendRedirect coming soon
          return false; // stop processing request
        } else {
          return true; // keep processing
        }
      });
    })
    ..serve(/* ... */ );
});
like image 162
Justin Fagnani Avatar answered Nov 02 '22 17:11

Justin Fagnani