From e2f3e29a341945bb6a2ee3a9dc31cce71de3a58b Mon Sep 17 00:00:00 2001 From: Gibheer Date: Fri, 26 Jul 2013 14:46:33 +0200 Subject: [PATCH] extend server with protocol information This extends the server class with the information, if it is serving http or https. This can then be used to generate a root uri to the web application. --- lib/zero/request/server.rb | 47 +++++++++++++++++++ .../unit/zero/request/server/hostname_spec.rb | 1 - spec/unit/zero/request/server/is_http_spec.rb | 20 ++++++++ .../unit/zero/request/server/is_https_spec.rb | 20 ++++++++ spec/unit/zero/request/server/uri_spec.rb | 23 +++++++++ 5 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 spec/unit/zero/request/server/is_http_spec.rb create mode 100644 spec/unit/zero/request/server/is_https_spec.rb create mode 100644 spec/unit/zero/request/server/uri_spec.rb diff --git a/lib/zero/request/server.rb b/lib/zero/request/server.rb index 0aa82c8..8cf5092 100644 --- a/lib/zero/request/server.rb +++ b/lib/zero/request/server.rb @@ -14,6 +14,30 @@ module Zero # the key for the server software # @api private KEY_SERVER_SOFTWARE = 'SERVER_SOFTWARE' + # the key for https + # @api private + KEY_HTTPS = 'HTTPS' + # the https on switch + # @api private + KEY_HTTPS_ON_SWITCH = ['on', 'yes', '1'] + # the string for http + # @api private + HTTP = 'http' + # the string for https + # @api private + HTTPS = 'https' + # protocol seperator + # @api private + URI_SEP_PROTOCOL = '://' + # port separator + # @api private + URI_SEP_PORT = ':' + # default http port + # @api private + DEFAULT_PORT_HTTP = 80 + # default https port + # @api private + DEFAULT_PORT_HTTPS = 443 # This creates a new server instance extracting all server related # information from the environment. @@ -22,6 +46,12 @@ module Zero @port = environment[KEY_SERVER_PORT].to_i @protocol = environment[KEY_SERVER_PROTOCOL] @software = environment[KEY_SERVER_SOFTWARE] + p environment[KEY_HTTPS] + if KEY_HTTPS_ON_SWITCH.include?(environment[KEY_HTTPS]) + @is_https = true + else + @is_https = false + end end # get the port @@ -36,6 +66,23 @@ module Zero # get the server software # @return [String] the server software name attr_reader :software + # get if the request is served through https + # @return [Boolean] true if server got the request through https + def is_https?; @is_https; end + # get if the request is served through http + # @return [Boolean] true if server got the request though http + def is_http?; !@is_https; end + + # return the uri to the server + # @return [String] the root uri to the server + def uri + uri = (is_https? ? HTTPS : HTTP) + URI_SEP_PROTOCOL + hostname + if (port == DEFAULT_PORT_HTTP && is_http?) || + (port == DEFAULT_PORT_HTTPS && is_https?) + return uri + end + uri + URI_SEP_PORT + port.to_s + end end end end diff --git a/spec/unit/zero/request/server/hostname_spec.rb b/spec/unit/zero/request/server/hostname_spec.rb index b2275b4..2f9af13 100644 --- a/spec/unit/zero/request/server/hostname_spec.rb +++ b/spec/unit/zero/request/server/hostname_spec.rb @@ -6,4 +6,3 @@ describe Zero::Request::Server, '#hostname' do let(:env) { EnvGenerator.get('/foo', {'SERVER_NAME' => hostname}) } its(:hostname) { should be(hostname) } end - diff --git a/spec/unit/zero/request/server/is_http_spec.rb b/spec/unit/zero/request/server/is_http_spec.rb new file mode 100644 index 0000000..6e41393 --- /dev/null +++ b/spec/unit/zero/request/server/is_http_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe Zero::Request::Server, '#is_http?' do + subject { Zero::Request::Server.new(env) } + let(:hostname) { 'FooName' } + + context 'with http' do + let(:env) { EnvGenerator.get('/foo', {'SERVER_NAME' => hostname}) } + its(:is_http?) { should be(true) } + end + + context 'with https' do + let(:env) { EnvGenerator.get('/foo', { + 'SERVER_NAME' => hostname, + 'HTTPS' => 'on' + }) } + its(:is_http?) { should be(false) } + end +end + diff --git a/spec/unit/zero/request/server/is_https_spec.rb b/spec/unit/zero/request/server/is_https_spec.rb new file mode 100644 index 0000000..340e489 --- /dev/null +++ b/spec/unit/zero/request/server/is_https_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe Zero::Request::Server, '#is_https?' do + subject { Zero::Request::Server.new(env) } + let(:hostname) { 'FooName' } + + context 'with http' do + let(:env) { EnvGenerator.get('/foo', {'SERVER_NAME' => hostname}) } + its(:is_https?) { should be(false) } + end + + context 'with https' do + let(:env) { EnvGenerator.get('/foo', { + 'SERVER_NAME' => hostname, + 'HTTPS' => 'on' + }) } + its(:is_https?) { should be(true) } + end +end + diff --git a/spec/unit/zero/request/server/uri_spec.rb b/spec/unit/zero/request/server/uri_spec.rb new file mode 100644 index 0000000..c9bd9ec --- /dev/null +++ b/spec/unit/zero/request/server/uri_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe Zero::Request::Server, '#uri' do + subject { Zero::Request::Server.new(env) } + let(:hostname) { 'FooName' } + let(:port) { '80' } + let(:protocol) { 'http' } + let(:env) { EnvGenerator.get('/foo', { + 'SERVER_NAME' => hostname, + 'SERVER_PORT' => port + }) } + + context 'with standard port' do + let(:result) { "#{protocol}://#{hostname}" } + its(:uri) { should eq(result) } + end + + context 'with different port' do + let(:port) { '9292' } + let(:result) { "#{protocol}://#{hostname}:#{port}" } + its(:uri) { should eq(result) } + end +end