Class: Mihari::App

Inherits:
Object
  • Object
show all
Defined in:
lib/mihari/web/app.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeApp

Returns a new instance of App.



19
20
21
22
23
24
25
26
# File 'lib/mihari/web/app.rb', line 19

def initialize
  @filenames = ["", ".html", "index.html", "/index.html"]
  @rack_static = ::Rack::Static.new(
    -> { [404, {}, []] },
    root: File.expand_path("./public", __dir__),
    urls: ["/"]
  )
end

Class Method Details

.instanceObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/mihari/web/app.rb', line 29

def instance
  @instance ||= Rack::Builder.new do
    use Rack::Cors do
      allow do
        origins "*"
        resource "*", headers: :any, methods: [:get, :post, :put, :delete, :options]
      end
    end

    use Middleware::ConnectionAdapter
    use Middleware::ErrorNotificationAdapter

    run App.new
  end.to_app
end

.run!(port: 9292, host: "localhost", threads: "1:1", verbose: false) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/mihari/web/app.rb', line 45

def run!(port: 9292, host: "localhost", threads: "1:1", verbose: false)
  url = "http://#{host}:#{port}"

  # set maximum number of threads to use as PARALLEL_PROCESSOR_COUNT (if it is not set)
  # ref. https://github.com/grosser/parallel#tips
  # TODO: is this the best way?
  _min_thread, max_thread = threads.split(":")
  ENV["PARALLEL_PROCESSOR_COUNT"] = max_thread if ENV["PARALLEL_PROCESSOR_COUNT"].nil?

  Rack::Handler::Puma.run(instance, Port: port, Host: host, Threads: threads, Verbose: verbose) do |_launcher|
    Launchy.open(url) if ENV["RACK_ENV"] != "development"
  rescue Launchy::CommandNotFoundError
    # ref. https://github.com/ninoseki/mihari/issues/477
    # do nothing
  end
end

Instance Method Details

#call(env) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/mihari/web/app.rb', line 63

def call(env)
  # api
  api_response = API.call(env)

  # Check if the App wants us to pass the response along to others
  if api_response[1]["X-Cascade"] == "pass"
    # static files
    request_path = env["PATH_INFO"]
    @filenames.each do |path|
      response = @rack_static.call(env.merge("PATH_INFO" => request_path + path))
      return response if response[0] != 404
    end
  end

  api_response
end