Module: Slinky::Server

Includes:
EM::HttpServer
Defined in:
lib/slinky/server.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.configObject



11
# File 'lib/slinky/server.rb', line 11

def self.config; @config || ConfigReader.empty; end

.config=(_config) ⇒ Object



10
# File 'lib/slinky/server.rb', line 10

def self.config= _config; @config = _config; end

.dirObject

Gets the root directory from which files should be served



8
# File 'lib/slinky/server.rb', line 8

def self.dir; @dir || "."; end

.dir=(_dir) ⇒ Object

Sets the root directory from which files should be served



6
# File 'lib/slinky/server.rb', line 6

def self.dir= _dir; @dir = _dir; end

.handle_file(resp, mf, compile = true) ⇒ Object

Takes a manifest file and produces a response for it



63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/slinky/server.rb', line 63

def self.handle_file resp, mf, compile = true
  begin
    if path = mf.process(nil, compile)
      serve_file resp, path.to_s
    else
      raise StandardError.new
    end
  rescue
    resp.status = 500
    resp.content = "Error compiling #{mf.source}\n"
  end
  resp
end

.manifestObject



14
# File 'lib/slinky/server.rb', line 14

def self.manifest; @manifest; end

.manifest=(_manifest) ⇒ Object



13
# File 'lib/slinky/server.rb', line 13

def self.manifest= _manifest; @manifest = _manifest; end

.not_found(resp) ⇒ Object

Returns the proper response for files that do not exist



98
99
100
101
# File 'lib/slinky/server.rb', line 98

def self.not_found resp
  resp.status = 404
  resp.content = "File not found\n"
end

.path_for_uri(uri) ⇒ Object

Splits a uri into its components, returning only the path sans initial forward slash.



18
19
20
21
# File 'lib/slinky/server.rb', line 18

def self.path_for_uri uri
  _, _, _, _, _, path, _, _  = URI.split uri
  path[1..-1] #get rid of the leading /
end

.process_path(resp, path, pushstate = false) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/slinky/server.rb', line 38

def self.process_path resp, path, pushstate = false
  file = manifest.find_by_path(path).first

  if file.is_a? ManifestDir
    file = manifest.find_by_path(path + "/index.html").first
    path += "/index.html"
  end

  resp.content_type MIME::Types.type_for(path).first.to_s

  if file
    # They're requesting the source file and we should not
    # compile it (but still process directives)
    compile = !(file.source.end_with?(path) && file.source)
    handle_file(resp, file, compile)
  elsif !pushstate && p = config.pushstate_for_path("/" + path)
    path = p[0] == "/" ? p[1..-1] : p
    self.process_path(resp, path, true)
  else
    not_found resp
  end
  resp
end

.serve_file(resp, path) ⇒ Object

Serves a file from the file system



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/slinky/server.rb', line 78

def self.serve_file resp, path
  if File.exists?(path) && !File.directory?(path)
    size = File.size(path)
    _, _, extension = path.match(EXTENSION_REGEX).to_a
    # File reading code from rack/file.rb
    File.open path do |file|
      resp.content = ""
      while size > 0
        part = file.read([8192, size].min)
        break unless part
        size -= part.length
        resp.content << part
      end
    end
  else
    not_found resp
  end
end

Instance Method Details

#process_http_requestObject

Method called for every HTTP request made



24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/slinky/server.rb', line 24

def process_http_request
  resp = EventMachine::DelegatedHttpResponse.new(self)

  begin
    path = Server.path_for_uri(@http_request_uri)
  rescue
    resp.status = 500
    resp.content = "Invalid request"
    return
  end

  Server.process_path(resp, path).send_response
end