summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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