Sha256: 36aed9e2869e1acb307130b0c8349a69f52020d2f83f1f1a3732d8767d0b2dbb

Contents?: true

Size: 1.43 KB

Versions: 1

Compression:

Stored size: 1.43 KB

Contents

require "sinatra/base"
require "uri"
require "resolv"

module Sinatra
  module Subdomain
    class << self
      attr_accessor :app, :subdomain
    end

    module Helpers
      def subdomain
        uri = URI.parse("http://#{request.env["HTTP_HOST"]}")
        return if Sinatra::Subdomain.ip_address?(uri.host)
        parts = uri.host.split(".")
        parts.pop(settings.tld_size + 1)

        parts.empty? ? nil : parts.join(".")
      end
    end

    def subdomain(expected_subdomain = true, &block)
      ::Sinatra::Subdomain.tap do |mod|
        mod.app = self
        mod.subdomain = expected_subdomain
      end

      yield

      ::Sinatra::Subdomain.tap do |mod|
        mod.app = nil
        mod.subdomain = nil
      end
    end

    def self.ip_address?(host)
      host =~ Resolv::IPv4::Regex || host =~ Resolv::IPv6::Regex
    end

    def self.route_added(verb, path, block)
      return unless subdomain && app

      routes = app.instance_variable_get("@routes")
      last_route = routes[verb].last
      expected = subdomain

      condition = app.instance_eval do
        generate_method :subdomain do
          if expected == true
            subdomain != nil
          else
            subdomain.to_s == expected.to_s
          end
        end
      end

      last_route[2] << condition
    end

    def self.registered(app)
      app.helpers Sinatra::Subdomain::Helpers
      app.set :tld_size, 1
    end
  end

  register Subdomain
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sinatra-subdomain-0.2.0 lib/sinatra/subdomain.rb