Umleitung: a tiny mochiweb/CouchDB app
Upcoming SlideShare
Loading in...5
×
 

Umleitung: a tiny mochiweb/CouchDB app

on

  • 5,527 views

The slides from erlounge Wellington 02-2009. Umleintung is a tiny HTTP redirect daemon based on mochiweb and CouchDB.

The slides from erlounge Wellington 02-2009. Umleintung is a tiny HTTP redirect daemon based on mochiweb and CouchDB.
It describes how to bootstrap a mochiweb application and integrate CouchDB.

Statistics

Views

Total Views
5,527
Views on SlideShare
5,494
Embed Views
33

Actions

Likes
3
Downloads
64
Comments
0

1 Embed 33

http://www.slideshare.net 33

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Umleitung: a tiny mochiweb/CouchDB app Umleitung: a tiny mochiweb/CouchDB app Presentation Transcript

  • umleitung an intro to mochiweb and CouchDB
  • mochiweb • get mochiweb • svn checkout http://mochiweb.googlecode.com/svn/ trunk/ mochiweb • create new application • mochiweb/scripts/new_mochiweb.erl umleitung
  • run mochiweb • make the project and run it • cd umleitung • make • ./start-dev.sh • go to http://localhost:8000
  • directory structure • we have our sources in /src • we have our compiled binaries in /ebin • the only file we need in the moment is: src/umleitung_web.erl • open it in your editor
  • act on GET/HEAD Method when Method =:= 'GET'; Method =:= 'HEAD' -> case lookup(Path) of {ok, Dest} -> Req:respond({200, [], Dest}); _ -> Req:respond({501, [], quot;errorquot;}) end;
  • the lookup/1 %% Internal API lookup(Path) -> io:format(quot;Path is: ~s~nquot;, [Path]), {ok, Path}. ...
  • testing • recompile and see that the running project is reloaded • to recompile just run make • request http://localhost:8000/test • look at the console output as well
  • CouchDB • get CouchDB from http:// couchdb.apache.org • best compile from source • http://wiki.apache.org/couchdb/ Installing_from_source • run couchdb (sudo couchdb) • start futon on http://localhost:5984/_utils
  • create DB • click on “create database” • name it “umleitung” • create a document: type: redir path: test destination: http://ideegeo.com
  • create view • select the view: Custom query... • in the map function add: function(doc) { if(doc.type == 'redir'){ emit(doc.path, doc.destination); } }
  • create view 2 • choose save as • name the design document: _design/redir • and the view: match
  • what we have • we have a mochiweb server interpreting our path • we have a couchdb that can save path:destination tuples • ... lets connect them
  • erlang_couchdb • based on mochiweb • slim library, small foot print • git clone git://github.com/ngerakines/ erlang_couchdb.git • cd erlang_couchdb • make dist-src • and link it to /deps (ext. dependencies)
  • the view request • erlang_couchdb:invoke_view({quot;HOSTquot;, PORT}, quot;DBquot;, quot;DESIGN DOCquot;, quot;VIEWquot;, [{quot;keyquot;, quot;quot;quot; ++ REQUEST KEY ++ quot;quot;quot;}]), • our request key is the “Path” variable that holds the path we want to match against • note the enclosing ‘quot;’
  • major tuple hacking • the erlang_couchdb lib is small, that means less comfort • the data structure is deep nested json tuples • the view request looks like this: {json,{struct, Props}} = erlang_couchdb:invoke_view( {quot;localhostquot;, 5984}, quot;umleitungquot;, quot;redirquot;, quot;matchquot;, [{quot;keyquot;, quot;quot;quot; ++ Path ++ quot;quot;quot;}]),
  • fiddle it together lookup(Path) -> io:format(quot;PATH: ~s~nquot;, [Path]), {json,{struct, Props}} = erlang_couchdb:invoke_view({quot;localhostquot;, 5984}, quot;umleitungquot;, quot;redirquot;, quot;matchquot;, [{quot;keyquot;, quot;quot;quot; ++ Path ++ quot;quot;quot;}]), try proplists:get_value(<<quot;rowsquot;>>, Props) of [{struct, Rows} | _] -> {ok, proplists:get_value(<<quot;valuequot;>>, Rows)}; _ -> {error, unknown} catch _:_ -> {error, unknown} end.
  • testing • recompile the project again • go to http://localhost:8000/test • then go to http://localhost:8000/bla • we have connected CouchDB to our mochiweb server • ... relax ...
  • do the redirect • the final step is doing the redirect now • change the response line to: Req:respond({302, [{quot;Locationquot;, Dest}], quot;quot;}); • recompile • reload the http://localhost:8000/test
  • cosmetics • getting rid of that ugly compile warning and serving a static file case lookup(Path) of {ok, Dest} -> Req:respond({302, [{quot;Locationquot;, Dest}], quot;quot;}); _ -> Req:serve_file(quot;404.htmlquot;, DocRoot) end; • add a 404.html to priv/www/
  • and now? • sources are on github • git clone git://github.com/norbu09/ umleitung.git • go out and play, extend, rewrite it • add a web interface (based on nitrogen?)
  • hope you enjoyed it lenz@ideegeo.com http://github.com/norbu09/umleitung/tree