# core require 'uri' require 'stringio' require 'json' require 'cgi' require 'digest' require 'forwardable' # gems require 'rack' require 'mustache' require 'tilt' module RocketIO extend self ENVIRONMENTS = { 'development' => 'development'.freeze, 'testing' => 'testing'.freeze, 'stage' => 'stage'.freeze, 'production' => 'production'.freeze, }.freeze environment = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENVIRONMENTS.values[0] unless ENVIRONMENT = ENVIRONMENTS[environment] raise(StandardError, '%s environment not supported. Use one of %s' % [environment.inspect, ENVIRONMENTS.keys*', ']) end def environment ENVIRONMENT end ENVIRONMENTS.each_value do |env| define_method(env + '?') {ENVIRONMENT == env} end GET = 'GET'.freeze POST = 'POST'.freeze PUT = 'PUT'.freeze DELETE = 'DELETE'.freeze HEAD = 'HEAD'.freeze REQUEST_METHODS = { GET => :get, POST => :post, PUT => :put, DELETE => :delete, HEAD => :head }.freeze INDEX_METHOD = :index EMPTY_STRING = ''.freeze EMPTY_STRING_PROC = proc {RocketIO::EMPTY_STRING} EMPTY_ARRAY = [].freeze EMPTY_HASH = {}.freeze SLASH = '/'.freeze QUERY_PREFIX = '?'.freeze PATH_SPLITTER = /[^\/]+/.freeze CONTENT_TYPE = 'Content-Type'.freeze DEFAULT_CONTENT_TYPE = 'text/html'.freeze CONTENT_LENGTH = 'Content-Length'.freeze CONTENT_DISPOSITION = 'Content-Disposition'.freeze APPLICATION_OCTET_STREAM = 'application/octet-stream'.freeze APPLICATION_JSON = 'application/json'.freeze APPLICATION_JSON_REGEXP = /application\/json/i DEFAULT_AUTH_REALM = 'AccessRestricted'.freeze DEFAULT_TOKEN_AUTH_REALM = 'Application'.freeze REQUEST_METHOD = 'REQUEST_METHOD'.freeze PATH_INFO = 'PATH_INFO'.freeze HTTP_ACCEPT = 'HTTP_ACCEPT'.freeze REMOTE_USER = 'REMOTE_USER'.freeze HTTP_CONTENT_TYPE = 'CONTENT_TYPE'.freeze HTTP_CONNECTION = 'HTTP_CONNECTION'.freeze HTTP_AUTHORIZATION_KEYS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION'].map(&:freeze).freeze HTTP_AUTHORIZATION_MOCKS = { basic: 'Basic Og=='.freeze, digest: 'Digest opaque="", qop="auth", uri="%s"'.freeze }.freeze HTTP_UPGRADE = 'HTTP_UPGRADE'.freeze UPGRADE = 'upgrade'.freeze WEBSOCKET = 'websocket'.freeze HTTP_1_1 = 'HTTP/1.1'.freeze HTTP_VERSION = 'HTTP_VERSION'.freeze HTTP_X_FORWARDED_HOST = 'HTTP_X_FORWARDED_HOST'.freeze HTTP_IF_MATCH = 'HTTP_IF_MATCH'.freeze HTTP_IF_NONE_MATCH = 'HTTP_IF_NONE_MATCH'.freeze HTTP_IF_MODIFIED_SINCE = 'HTTP_IF_MODIFIED_SINCE'.freeze HTTP_IF_UNMODIFIED_SINCE = 'HTTP_IF_UNMODIFIED_SINCE'.freeze HTTP_X_REQUESTED_WITH = 'HTTP_X_REQUESTED_WITH'.freeze XML_HTTP_REQUEST = 'XMLHttpRequest'.freeze LOCATION = 'Location'.freeze CACHE_CONTROL = 'Cache-Control'.freeze EXPIRES = 'Expires'.freeze LAST_MODIFIED = 'Last-Modified'.freeze ETAG = 'ETag'.freeze ETAG_KINDS = [:strong, :weak].freeze RACK_INPUT = 'rack.input'.freeze DROP_BODY_RESPONSES = {204 => true, 205 => true, 304 => true}.freeze ERROR_TEMPLATES = begin path = File.expand_path('../rocketio/error_templates/', __FILE__) templates = {layout: Class.new(Mustache) {self.template = File.read(path + '/layout.html').freeze}} Dir[path + '/*.html'].each_with_object(templates) do |file,templates| next if file =~ /layout\.html\z/ template = File.basename(file, File.extname(file)).to_i templates[template] = Class.new(Mustache) {self.template = File.read(file).freeze} end end.freeze BEFORE_FORMAT = 'before_%s'.freeze AROUND_FORMAT = 'around_%s'.freeze AFTER_FORMAT = 'after_%s'.freeze ROUTE_INSPECT_FORMAT = '#'.freeze ENGINE_CONST_FORMAT = '%sTemplate'.freeze TEMPLATE_PATH_FORMAT = '%s/%s.%s'.freeze FOUND_TEMPLATES = {} READ_TEMPLATES = {} COMPILED_TEMPLATES = {} DEFAULT_ENGINE = [Tilt::ERBTemplate, [].freeze].freeze def controllers @controllers ||= [] end end require 'rocketio/util' require 'rocketio/exceptions' require 'rocketio/controller' require 'rocketio/router' require 'rocketio/application' RocketIO::Controller.map(RocketIO::SLASH)