Sha256: 5d3492b8c804cd628a59f6ae766cc1e3968f0ea8fe1ae917cc4ec266a33b655f

Contents?: true

Size: 1.99 KB

Versions: 4

Compression:

Stored size: 1.99 KB

Contents

%w{
active_record
rack
}.each { |m| require m }

module Murlsh

  # Build responses for HTTP requests.
  class UrlServer

    def initialize(config, db)
      @config, @db = config, db
      ActiveRecord::Base.default_timezone = :utc

      Dir['plugins/*.rb'].each { |p| load p }
    end

    # Respond to a GET request. Return a page of urls based on the query
    # string parameters.
    def get(req)
      resp = Murlsh::XhtmlResponse.new

      resp.set_content_type(req.env['HTTP_ACCEPT'], req.env['HTTP_USER_AGENT'])

      last_db_update = File::Stat.new(@config['db_file']).mtime
      resp['Cache-Control'] = 'must-revalidate, max-age=0'
      resp['ETag'] = "W/\"#{last_db_update.to_i}#{req.params.sort}\""
      resp['Last-Modified'] = last_db_update.httpdate

      resp.body = Murlsh::UrlBody.new(@config, @db, req)

      resp
    end

    # Respond to a POST request. Add the new url and return json.
    def post(req)
      unless req.params['url'].empty?
        auth = req.params['auth']
        if user = auth.empty? ? nil : Murlsh::Auth.new(
          @config.fetch('auth_file')).auth(auth)
          ActiveRecord::Base.establish_connection(:adapter => 'sqlite3',
            :database => @config.fetch('db_file'))

          mu = Murlsh::Url.new do |u|
            u.time = Time.now.gmtime
            u.url = req.params['url']
            u.email = user[:email]
            u.name = user[:name]
            u.via = req.params['via'] unless (req.params['via'] || []).empty?
          end

          Murlsh::Plugin.hooks('add_pre') { |p| p.run(mu, @config) }

          mu.save

          Murlsh::Plugin.hooks('add_post') { |p| p.run(@config) }

          resp = Rack::Response.new([mu].to_json, 200, {
            'Content-Type' => 'application/json' })

          resp
        else
          Rack::Response.new('Permission denied', 403, {
            'Content-Type' => 'text/plain' })
        end
      else
        Rack::Response.new('No url', 500, { 'Content-Type' => 'text/plain' })
      end
    end

  end

end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
murlsh-0.10.0 lib/murlsh/url_server.rb
murlsh-0.9.0 lib/murlsh/url_server.rb
murlsh-0.8.1 lib/murlsh/url_server.rb
murlsh-0.8.0 lib/murlsh/url_server.rb