Difference between revisions of "UrlDisp"

From HaskellWiki
Jump to navigation Jump to search
(initial writing)
 
m (fixed a typo)
Line 4: Line 4:
 
=== Problem statement ===
 
=== Problem statement ===
   
URLs are everywhere on the web. Most of them, however, are hard to remember, because they are meaningless for humans. This is wrong, however: URLs are a part of user interface, and therefore should be kept simple, meaningful and memorizeable.
+
URLs are everywhere on the web. Most of them, however, are hard to remember, because they are meaningless for humans. This is wrong: URLs are a part of user interface, and therefore should be kept simple, meaningful and memorizeable.
   
 
=== Solution ===
 
=== Solution ===

Revision as of 05:58, 2 February 2009

What is UrlDisp

Problem statement

URLs are everywhere on the web. Most of them, however, are hard to remember, because they are meaningless for humans. This is wrong: URLs are a part of user interface, and therefore should be kept simple, meaningful and memorizeable.

Solution

UrlDisp provides (Fast)CGI programs a minimalistic domain-specific parser for URLs.

Hierarchical part of the URL is tokenized and matched against rules defined using UrlDisp combinators. Every rule consists of, basically, a predicate and a CGI action. Once a predicate is true, an action is performed; otherwise, alternatives are tried in order. The matching algorithm is backtracking.

Usage examples

A regular CGI action looks like this:

output "hello, world!"

Adding a predicate:

-- if URL matches /hello, then output "hello, world!" h |/ "hello" *> output "hello, world!"

More examples:

-- if URL contains /hello, output "woot, it works!", otherwise check for -- /foo (h |/ "hello" *> output "woot, it works!") <|> (h |/ "foo" *> output "foo")

As you can see, the |/ combinator matches current token against it's right operand. h is a special predicate that matches anything, it is used to begin a string of combinators.

One can also match against

  • URL parameters,
  • HTTP methods,
  • and also convert token into a variable which is an instance of Read

There's also an API which is believed to be more human-readable.