lib/eeny-meeny/middleware.rb in eeny-meeny-2.0.0 vs lib/eeny-meeny/middleware.rb in eeny-meeny-2.1.0
- old
+ new
@@ -22,24 +22,35 @@
existing_set_cookie_header = env['Set-Cookie']
# Prepare for experiments.
@experiments.each do |experiment|
# Skip inactive experiments
next unless experiment.active?(now)
+ # Trigger experiment through query parmeters
+ cookie_name = EenyMeeny::Cookie.cookie_name(experiment)
+ has_experiment_trigger = EenyMeeny.config.query_parameters[:experiment] && request.params.has_key?(cookie_name)
# skip experiments that already have a cookie
- unless cookies.has_key?(EenyMeeny::Cookie.cookie_name(experiment))
- env['Set-Cookie'] = ''
- cookie = EenyMeeny::Cookie.create_for_experiment(experiment, @cookie_config)
+ if has_experiment_trigger || !cookies.has_key?(cookie_name)
+ cookie = if has_experiment_trigger
+ # Trigger experiment variation through query parameter.
+ EenyMeeny::Cookie.create_for_experiment_variation(experiment, request.params[cookie_name].to_sym, @cookie_config)
+ else
+ EenyMeeny::Cookie.create_for_experiment(experiment, @cookie_config)
+ end
# Set HTTP_COOKIE header to enable experiment on first pageview
- Rack::Utils.set_cookie_header!(env,
- cookie.name,
- cookie.to_h)
- env['HTTP_COOKIE'] = '' if env['HTTP_COOKIE'].nil?
- env['HTTP_COOKIE'] += '; ' unless env['HTTP_COOKIE'].empty?
- env['HTTP_COOKIE'] += env['Set-Cookie']
+ env = add_http_cookie(env, cookie, precede: has_experiment_trigger)
new_cookies[cookie.name] = cookie
end
end
+ # Prepare smoke tests (if enabled through query parameters)
+ if EenyMeeny.config.query_parameters[:smoke_test]
+ if request.params.has_key?('smoke_test_id') && (request.params['smoke_test_id'] =~ /[A-Za-z_]+/)
+ # Set HTTP_COOKIE header to enable smoke test on first pageview
+ cookie = EenyMeeny::Cookie.create_for_smoke_test(request.params['smoke_test_id'])
+ env = add_http_cookie(env, cookie, precede: true)
+ new_cookies[cookie.name] = cookie
+ end
+ end
# Clean up 'Set-Cookie' header.
if existing_set_cookie_header.nil?
env.delete('Set-Cookie')
else
env['Set-Cookie'] = existing_set_cookie_header
@@ -50,8 +61,25 @@
# Add new cookies to 'Set-Cookie' header
new_cookies.each do |key, value|
response.set_cookie(key,value.to_h)
end
response.finish
+ end
+
+ private
+ def add_http_cookie(env, cookie, precede: false)
+ env['Set-Cookie'] = ''
+ Rack::Utils.set_cookie_header!(env,
+ cookie.name,
+ cookie.to_h)
+ env['HTTP_COOKIE'] = '' if env['HTTP_COOKIE'].nil?
+ if precede
+ # Prepend cookie to the 'HTTP_COOKIE' header. This ensures it overwrites existing cookies when present.
+ env['HTTP_COOKIE'] = env['Set-Cookie'] + '; ' + env['HTTP_COOKIE']
+ else
+ env['HTTP_COOKIE'] += '; ' unless env['HTTP_COOKIE'].empty?
+ env['HTTP_COOKIE'] += env['Set-Cookie']
+ end
+ env
end
end
end