From 691a0a350761a4318da883609f91bbd55d175841 Mon Sep 17 00:00:00 2001 From: Kali Donovan Date: Fri, 7 Oct 2011 17:15:34 +0200 Subject: [PATCH] Initial functioning version --- .gitignore | 4 ++++ Gemfile | 4 ++++ Rakefile | 7 ++++++ lib/rack-referrals.rb | 45 +++++++++++++++++++++++++++++++++++ lib/rack-referrals/version.rb | 5 ++++ rack-referrals.gemspec | 27 +++++++++++++++++++++ test/test_referrals.rb | 39 ++++++++++++++++++++++++++++++ 7 files changed, 131 insertions(+) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Rakefile create mode 100644 lib/rack-referrals.rb create mode 100644 lib/rack-referrals/version.rb create mode 100644 rack-referrals.gemspec create mode 100644 test/test_referrals.rb diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4040c6c --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.gem +.bundle +Gemfile.lock +pkg/* diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..edd5a8c --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source "http://rubygems.org" + +# Specify your gem's dependencies in rack-referrals.gemspec +gemspec diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..4d33dc4 --- /dev/null +++ b/Rakefile @@ -0,0 +1,7 @@ +require "bundler/gem_tasks" +require 'rake/testtask' + +Rake::TestTask.new do |task| + task.test_files = FileList['test/test_*.rb'] +end + diff --git a/lib/rack-referrals.rb b/lib/rack-referrals.rb new file mode 100644 index 0000000..a40ba9e --- /dev/null +++ b/lib/rack-referrals.rb @@ -0,0 +1,45 @@ +require "rack-referrals/version" + +module Rack + class Referrals + + def initialize(app, options = {}) + @app, @options = app, options + + @engines = { + :google => [/^http:\/\/(www\.)?google.*/, 'q'], + :yahoo => [/^http:\/\/search\.yahoo.*/, 'p'], + :msn => [/^http:\/\/search\.msn.*/, 'q'], + :aol => [/^http:\/\/search\.aol.*/, 'userQuery'], + :altavista => [/^http:\/\/(www\.)?altavista.*/, 'q'], + :feedster => [/^http:\/\/(www\.)?feedster.*/, 'q'], + :lycos => [/^http:\/\/search\.lycos.*/, 'query'], + :alltheweb => [/^http:\/\/(www\.)?alltheweb.*/, 'q'] + } + + end + + def call(env) + request = Rack::Request.new(env) + from = request.env["HTTP_REFERER"] + + if from.to_s.length > 0 + if engine = @engines.detect {|name, data| from =~ data[0] } + env["referring.search_engine"] = engine[0].to_s + reg, param_name = engine[1] + + # Pull out the query string from the referring search engine + query_string = begin + URI.split(from)[7] + rescue URI::InvalidURIError; nil + end + + env["referring.search_phrase"] = query_string && Rack::Utils.parse_query(query_string)[param_name] + end + end + + @app.call(env) + end + + end +end diff --git a/lib/rack-referrals/version.rb b/lib/rack-referrals/version.rb new file mode 100644 index 0000000..77c7136 --- /dev/null +++ b/lib/rack-referrals/version.rb @@ -0,0 +1,5 @@ +module Rack + class Referrals + VERSION = "0.0.1" + end +end diff --git a/rack-referrals.gemspec b/rack-referrals.gemspec new file mode 100644 index 0000000..8e0c23d --- /dev/null +++ b/rack-referrals.gemspec @@ -0,0 +1,27 @@ +# -*- encoding: utf-8 -*- +$:.push File.expand_path("../lib", __FILE__) +require "rack-referrals/version" + +Gem::Specification.new do |s| + s.name = "rack-referrals" + s.version = Rack::Referrals::VERSION + s.authors = ["Kali Donovan"] + s.email = ["kali@deviantech.com"] + s.homepage = "" + s.summary = %q{TODO: Write a gem summary} + s.description = %q{TODO: Write a gem description} + + s.rubyforge_project = "rack-referrals" + + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } + s.require_paths = ["lib"] + + # specify any dependencies here; for example: + s.add_development_dependency "test-unit" + s.add_development_dependency "rack-test" + s.add_development_dependency "mocha" + s.add_development_dependency "rake" + # s.add_runtime_dependency "rest-client" +end diff --git a/test/test_referrals.rb b/test/test_referrals.rb new file mode 100644 index 0000000..98576c8 --- /dev/null +++ b/test/test_referrals.rb @@ -0,0 +1,39 @@ +require "test/unit" +require "rack/test" + +require File.expand_path(File.dirname(__FILE__) + '/../lib/rack-referrals') + +class ReferralTest < Test::Unit::TestCase + include Rack::Test::Methods + + def app + hello_world_app = lambda do |env| + [200, {}, "Hello World"] + end + + Rack::Referrals.new(hello_world_app) + end + + def test_parses_google + get '/', nil, 'HTTP_REFERER' => "http://www.google.com/search?q=ruby+on+rails&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a" + + assert_equal "google", last_request.env['referring.search_engine'] + assert_equal "ruby on rails", last_request.env['referring.search_phrase'] + end + + def test_handles_missing_params + get '/', nil, 'HTTP_REFERER' => "http://www.google.com/search?ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a" + + assert_equal "google", last_request.env['referring.search_engine'] + assert_equal nil, last_request.env['referring.search_phrase'] + end + + def test_handles_no_referer + get '/' + + assert_equal nil, last_request.env['referring.search_engine'] + assert_equal nil, last_request.env['referring.search_phrase'] + end + + +end