aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGibheer <gibheer@gmail.com>2013-07-26 14:46:33 +0200
committerGibheer <gibheer@gmail.com>2013-07-26 14:46:33 +0200
commite2f3e29a341945bb6a2ee3a9dc31cce71de3a58b (patch)
tree46e265d6f790a7630b6ce06dd04665cac4065665
parent89e2efeffaf46874c9ead2c63a49bdf3684626fe (diff)
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.
-rw-r--r--lib/zero/request/server.rb47
-rw-r--r--spec/unit/zero/request/server/hostname_spec.rb1
-rw-r--r--spec/unit/zero/request/server/is_http_spec.rb20
-rw-r--r--spec/unit/zero/request/server/is_https_spec.rb20
-rw-r--r--spec/unit/zero/request/server/uri_spec.rb23
5 files changed, 110 insertions, 1 deletions
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