Sha256: cbaa87c9b11a69559f4da9d50b7de01ec78ce6ca9fb5a1ca4a900574adea53e3

Contents?: true

Size: 913 Bytes

Versions: 1

Compression:

Stored size: 913 Bytes

Contents

require 'geoip_city'
require 'json'

module Rack::Geoip
  # Implements Rack's middleware interface and provides the geoip
  # lookup service
  class Lookup
    DEFAULT =  {:path => '/geoip/lookup', :db => 'GeoLiteCity.dat'}

    def initialize(app, options={})
      @app, @options = app, DEFAULT.merge(options)
      @db = GeoIPCity::Database.new(@options[:db])
    end
    
    def call(env)
      dup._call(env)
    end
    
    def _call(env)
      if env['PATH_INFO'] == @options[:path]
        request = Rack::Request.new(env)
        if request.params['ip'] && result=@db.look_up(request.params['ip'])
          [200, {'Content-Type' => 'application/json'}, result.to_json]
        else
          [404, {'Content-Type' => 'text/plain'}, "Example usage: #{env['rack.url_scheme']}://#{env['HTTP_HOST']}#{env['PATH_INFO']}?ip=8.8.8.8"]
        end
      else
        @app.call(env)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rack-geoip-0.1.1 lib/rack/geoip/lookup.rb