<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/waves/ext/time.rb</filename>
    </added>
    <added>
      <filename>lib/waves/media/mime_types.rb</filename>
    </added>
    <added>
      <filename>lib/waves/request/accept.rb</filename>
    </added>
    <added>
      <filename>lib/waves/request/request.rb</filename>
    </added>
    <added>
      <filename>lib/waves/resources/file_mixin.rb</filename>
    </added>
    <added>
      <filename>lib/waves/response/client_errors.rb</filename>
    </added>
    <added>
      <filename>lib/waves/response/packaged.rb</filename>
    </added>
    <added>
      <filename>lib/waves/response/redirects.rb</filename>
    </added>
    <added>
      <filename>lib/waves/response/response.rb</filename>
    </added>
    <added>
      <filename>lib/waves/response/response_mixin.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -30,22 +30,25 @@ require 'waves/ext/tempfile'
 require 'waves/ext/module'
 require 'waves/ext/object'
 require 'waves/ext/kernel'
+require 'waves/ext/time'
 
 # waves Runtime
 require 'waves/servers/base'
 require 'waves/servers/webrick'
 require 'waves/servers/mongrel'
+require 'waves/request/accept'
+require 'waves/request/request'
+require 'waves/response/response'
+require 'waves/response/packaged'
+require 'waves/response/client_errors'
+require 'waves/response/response_mixin'
+require 'waves/response/redirects'
 require 'waves/dispatchers/base'
 require 'waves/dispatchers/default'
 require 'waves/runtime/logger'
-require 'waves/runtime/mime_types'
+require 'waves/media/mime_types'
 require 'waves/runtime/applications'
 require 'waves/runtime/runtime'
-require 'waves/runtime/accept'
-require 'waves/runtime/request'
-require 'waves/runtime/response'
-require 'waves/runtime/response_mixin'
-require 'waves/runtime/session'
 require 'waves/runtime/configuration'
 require 'waves/caches/simple'
 </diff>
      <filename>lib/waves.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,19 +2,6 @@ module Waves
 
   module Dispatchers
 
-    class NotFoundError &lt; RuntimeError ; end
-    class Unauthorized &lt; RuntimeError; end
-    class BadRequest &lt; RuntimeError; end
-
-    # Redirects are raised by applications and rescued by the Waves 
-    # dispatcher and used to set the response status and location.
-    class Redirect
-      attr_reader :path, :status
-      def initialize( path, status = '302' )
-        @path = path; @status = status
-      end
-    end
-
     #
     # Waves::Dispatchers::Base provides the basic request processing structure
     # for a Rack application. It creates a Waves request, determines whether
@@ -47,14 +34,17 @@ module Waves
         response = request.response
         t = Benchmark.realtime do
           begin
-            safe( request )
-          rescue Dispatchers::Redirect =&gt; redirect
-            response.status = redirect.status
-            response.location = redirect.path
+            response.write( safe( request ).to_s ) if response.body.empty?
+          rescue Waves::Response::Packaged =&gt; e
+            e.call( response ) if e.respond_to?( :call )
+          else
+            # safeish default
+            response.content_type ||=  Waves::MimeTypes[ request.ext ].first || 'text/html'
+            response.status ||= '200'
           end
         end
-        Waves::Logger.info &quot;#{request.method}: #{request.url} handled in #{(t*1000).round} ms.&quot;
-        return response.finish
+        Waves::Logger.info &quot;#{response.status}: #{request.method} #{request.url} handled in #{(t*1000).round} ms.&quot;
+        response.finish
       end
 
     end</diff>
      <filename>lib/waves/dispatchers/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,10 +9,7 @@ module Waves
       #
       
       def safe(request)
-        # safeish default
-        request.response.content_type =  Waves::MimeTypes[ request.ext ].first || 'text/html'
-        result = Waves.config.resource.new( request ).process
-        request.response.write( result.to_s ) if request.response.body.empty?
+        Waves.config.resource.new( request ).process
       end
 
     end</diff>
      <filename>lib/waves/dispatchers/default.rb</filename>
    </modified>
    <modified>
      <diff>@@ -32,7 +32,7 @@ module Waves
             auto_create_class true, :Default
             auto_load true, :directories =&gt; [ :resources ]
             auto_eval :Server do
-              handler( Waves::Dispatchers::NotFoundError ) do
+              handler( Waves::Response::ClientErrors::NotFound ) do
                 app::Views::Errors.new( request ).not_found_404
               end
             end</diff>
      <filename>lib/waves/foundations/classic.rb</filename>
    </modified>
    <modified>
      <diff>@@ -12,7 +12,7 @@ module Waves
                 Waves.debug? ? raise( e ) : Waves::Views::Errors.new( request ).server_error_500
               end
 
-              handler( Waves::Dispatchers::NotFoundError ) do |e|
+              handler( Waves::Response::ClientErrors::NotFound ) do |e|
                 Waves.debug? ? raise( e ) : Waves::Views::Errors.new( request ).not_found_404
               end
 </diff>
      <filename>lib/waves/foundations/compact.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 module Waves
   module Helpers
     module Basic
-
+      
       # Escape a string as HTML content.
       def escape_html(s); Rack::Utils.escape_html(s); end
 </diff>
      <filename>lib/waves/helpers/basic.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,7 +8,7 @@ module Waves
       def textile( content )
         raw ::RedCloth.new( content ).to_html
       end
-
+      
     end
   end
 end</diff>
      <filename>lib/waves/helpers/formatting.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,11 +2,6 @@ module Waves
 
   module Resources
 
-    StatusCodes = {
-      Waves::Dispatchers::NotFoundError =&gt; '404'
-    }
-
-
     module Mixin
 
       attr_reader :request
@@ -94,9 +89,8 @@ module Waves
           def process
             begin
               before ;  rval = send( request.method ) ; after
-            rescue =&gt; e
-              response.status = ( StatusCodes[ e.class ] || 500 )
-              response.content_type = 'text/html'
+            rescue Exception =&gt; e
+              e.call( response ) if e.respond_to?( :call )
               rval = handler( e )
             ensure
               always</diff>
      <filename>lib/waves/resources/mixin.rb</filename>
    </modified>
    <modified>
      <diff>@@ -60,6 +60,9 @@ module Waves
 
       # do you want to run a console thread (ex: LiveConsole)
       attribute( :console )
+      
+      # what dispatcher do you want to use
+      attribute( :dispatcher )
 
       # are there any gems we need to check for on startup?
       def self.dependencies( list )
@@ -89,10 +92,6 @@ module Waves
         application.use( middleware, options )
       end
       
-      def self.dispatcher( dispatcher )
-        application.run( dispatcher.new )
-      end
-
       # default options
       debug false
       log :level =&gt; :info, :output =&gt; $stderr
@@ -100,6 +99,7 @@ module Waves
       dependencies []
       server Waves::Servers::WEBrick
       application.use ::Rack::ShowExceptions
+      dispatcher Waves::Dispatchers::Default
 
     end
   end</diff>
      <filename>lib/waves/runtime/configuration.rb</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,12 @@ module Waves
 
     private
 
-    def application() ; @app ||= config.application.to_app ; end
+    def application()
+      @app ||= begin
+        config.application.run( config.dispatcher.new )
+        config.application.to_app
+      end
+    end
     def port() ; ( @port ||= options[:port] || config.port ) ; end
     def host() ; ( @host ||= options[:host] || config.host ) ; end
 </diff>
      <filename>lib/waves/runtime/server.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,7 +18,7 @@ class Cassy
     text_decoration text_indent text_shadow text_transform top unicode_bidi vertical_align visibility voice_family volume white_space widows width
     word_spacing z_index )
   
-  METHODS = %w( class include extend instance_eval send __send__ __id__ )
+  METHODS = %w( class include extend instance_eval send __send__ __id__ respond_to? )
   instance_methods.each { |m| undef_method( m ) unless METHODS.include? m }
   
   methods =  HTML_TAGS.each do |tag|</diff>
      <filename>lib/waves/views/cassy.rb</filename>
    </modified>
    <modified>
      <diff>@@ -44,13 +44,13 @@ describe &quot;Request Object&quot; do
   feature &quot;Initiate redirect using #redirect&quot; do
     lambda { 
       Waves::Request.new(  env( '/', :method =&gt; 'GET' ) ).redirect('/')
-    }.should.raise( Waves::Dispatchers::Redirect )
+    }.should.raise( Waves::Redirects::Found )
   end
   
-  feature &quot;Raise NotFoundError using #not_found&quot; do
+  feature &quot;Raise NotFound using #not_found&quot; do
     lambda { 
       Waves::Request.new(  env( '/', :method =&gt; 'GET' ) ).not_found
-    }.should.raise( Waves::Dispatchers::NotFoundError )
+    }.should.raise( Waves::Response::ClientErrors::NotFound )
   end
 
   feature &quot;Access to content_type, media_type, and content_length&quot; do</diff>
      <filename>test/process/request.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>lib/waves/runtime/accept.rb</filename>
    </removed>
    <removed>
      <filename>lib/waves/runtime/mime_types.rb</filename>
    </removed>
    <removed>
      <filename>lib/waves/runtime/monitor.rb</filename>
    </removed>
    <removed>
      <filename>lib/waves/runtime/request.rb</filename>
    </removed>
    <removed>
      <filename>lib/waves/runtime/response.rb</filename>
    </removed>
    <removed>
      <filename>lib/waves/runtime/response_mixin.rb</filename>
    </removed>
    <removed>
      <filename>lib/waves/runtime/session.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>92a0d24f8112d5f39b9169da0d3569b0315ce16f</id>
    </parent>
  </parents>
  <author>
    <name>Dan Yoder</name>
    <email>dan@zeraweb.com</email>
  </author>
  <url>http://github.com/waves/edge/commit/fda81bbf54dadf7e441f024f688f327bfac0ea09</url>
  <id>fda81bbf54dadf7e441f024f688f327bfac0ea09</id>
  <committed-date>2009-09-27T22:34:51-07:00</committed-date>
  <authored-date>2009-09-27T22:34:51-07:00</authored-date>
  <message>Added support for Last-Modified HTTP Caching validation. Enhanced HTTP responses via exception support. Reorganized some code.</message>
  <tree>39ce570a3b627af4014acc1082bd0f9e29bb85de</tree>
  <committer>
    <name>Dan Yoder</name>
    <email>dan@zeraweb.com</email>
  </committer>
</commit>
