ronin-web 0.3.0.rc1 → 1.0.0.beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +31 -0
  4. data/.gitignore +13 -0
  5. data/.mailmap +1 -0
  6. data/.ruby-version +1 -0
  7. data/COPYING.txt +3 -3
  8. data/ChangeLog.md +115 -70
  9. data/Gemfile +42 -37
  10. data/README.md +160 -145
  11. data/Rakefile +12 -3
  12. data/bin/ronin-web +9 -17
  13. data/data/new/nokogiri.rb.erb +12 -0
  14. data/data/new/server.rb.erb +22 -0
  15. data/data/new/spider.rb.erb +26 -0
  16. data/data/new/webapp/.gitignore +15 -0
  17. data/data/new/webapp/.ruby-version.erb +1 -0
  18. data/data/new/webapp/Dockerfile.erb +11 -0
  19. data/data/new/webapp/Gemfile +6 -0
  20. data/data/new/webapp/app.rb.erb +15 -0
  21. data/data/new/webapp/config.ru +4 -0
  22. data/data/new/webapp/docker-compose.yml.erb +9 -0
  23. data/gemspec.yml +38 -16
  24. data/lib/ronin/web/cli/command.rb +36 -0
  25. data/lib/ronin/web/cli/commands/diff.rb +106 -0
  26. data/lib/ronin/web/cli/commands/html.rb +174 -0
  27. data/lib/ronin/web/cli/commands/irb.rb +56 -0
  28. data/lib/ronin/web/cli/commands/new/nokogiri.rb +85 -0
  29. data/lib/ronin/web/cli/commands/new/server.rb +96 -0
  30. data/lib/ronin/web/cli/commands/new/spider.rb +315 -0
  31. data/lib/ronin/web/cli/commands/new/webapp.rb +123 -0
  32. data/lib/ronin/web/cli/commands/new.rb +64 -0
  33. data/lib/ronin/web/cli/commands/reverse_proxy.rb +215 -0
  34. data/lib/ronin/web/cli/commands/server.rb +155 -0
  35. data/lib/ronin/web/cli/commands/spider.rb +822 -0
  36. data/lib/ronin/web/cli/ruby_shell.rb +50 -0
  37. data/lib/ronin/web/cli.rb +49 -0
  38. data/lib/ronin/web/html.rb +85 -0
  39. data/lib/ronin/web/mechanize.rb +34 -36
  40. data/lib/ronin/web/root.rb +27 -0
  41. data/lib/ronin/web/version.rb +7 -10
  42. data/lib/ronin/web/xml.rb +85 -0
  43. data/lib/ronin/web.rb +372 -13
  44. data/man/ronin-web-diff.1 +41 -0
  45. data/man/ronin-web-diff.1.md +30 -0
  46. data/man/ronin-web-html.1 +89 -0
  47. data/man/ronin-web-html.1.md +66 -0
  48. data/man/ronin-web-irb.1 +31 -0
  49. data/man/ronin-web-irb.1.md +22 -0
  50. data/man/ronin-web-new-nokogiri.1 +41 -0
  51. data/man/ronin-web-new-nokogiri.1.md +30 -0
  52. data/man/ronin-web-new-server.1 +45 -0
  53. data/man/ronin-web-new-server.1.md +33 -0
  54. data/man/ronin-web-new-spider.1 +173 -0
  55. data/man/ronin-web-new-spider.1.md +129 -0
  56. data/man/ronin-web-new-webapp.1 +53 -0
  57. data/man/ronin-web-new-webapp.1.md +39 -0
  58. data/man/ronin-web-new.1 +59 -0
  59. data/man/ronin-web-new.1.md +44 -0
  60. data/man/ronin-web-reverse-proxy.1 +63 -0
  61. data/man/ronin-web-reverse-proxy.1.md +47 -0
  62. data/man/ronin-web-server.1 +59 -0
  63. data/man/ronin-web-server.1.md +43 -0
  64. data/man/ronin-web-spider.1 +225 -0
  65. data/man/ronin-web-spider.1.md +168 -0
  66. data/man/ronin-web.1 +41 -0
  67. data/man/ronin-web.1.md +30 -0
  68. data/ronin-web.gemspec +39 -109
  69. data/spec/cli/ruby_shell_spec.rb +14 -0
  70. data/spec/html_spec.rb +43 -0
  71. data/spec/mechanize_spec.rb +72 -0
  72. data/spec/spec_helper.rb +5 -3
  73. data/spec/web_spec.rb +97 -0
  74. data/spec/xml_spec.rb +42 -0
  75. metadata +236 -224
  76. data/.gemtest +0 -0
  77. data/data/ronin/web/user_agents.yml +0 -247
  78. data/lib/ronin/network/mixins/web.rb +0 -258
  79. data/lib/ronin/web/config.rb +0 -34
  80. data/lib/ronin/web/extensions/nokogiri/xml/attr.rb +0 -47
  81. data/lib/ronin/web/extensions/nokogiri/xml/document.rb +0 -48
  82. data/lib/ronin/web/extensions/nokogiri/xml/element.rb +0 -57
  83. data/lib/ronin/web/extensions/nokogiri/xml/node.rb +0 -86
  84. data/lib/ronin/web/extensions/nokogiri/xml/text.rb +0 -47
  85. data/lib/ronin/web/extensions/nokogiri/xml.rb +0 -27
  86. data/lib/ronin/web/extensions/nokogiri.rb +0 -23
  87. data/lib/ronin/web/extensions.rb +0 -23
  88. data/lib/ronin/web/middleware/base.rb +0 -144
  89. data/lib/ronin/web/middleware/directories.rb +0 -179
  90. data/lib/ronin/web/middleware/files.rb +0 -144
  91. data/lib/ronin/web/middleware/filters/campaign_filter.rb +0 -77
  92. data/lib/ronin/web/middleware/filters/ip_filter.rb +0 -73
  93. data/lib/ronin/web/middleware/filters/path_filter.rb +0 -73
  94. data/lib/ronin/web/middleware/filters/referer_filter.rb +0 -71
  95. data/lib/ronin/web/middleware/filters/user_agent_filter.rb +0 -71
  96. data/lib/ronin/web/middleware/filters/vhost_filter.rb +0 -71
  97. data/lib/ronin/web/middleware/filters.rb +0 -28
  98. data/lib/ronin/web/middleware/helpers.rb +0 -145
  99. data/lib/ronin/web/middleware/proxy.rb +0 -265
  100. data/lib/ronin/web/middleware/proxy_request.rb +0 -262
  101. data/lib/ronin/web/middleware/request.rb +0 -79
  102. data/lib/ronin/web/middleware/response.rb +0 -33
  103. data/lib/ronin/web/middleware/router.rb +0 -167
  104. data/lib/ronin/web/middleware/rule.rb +0 -103
  105. data/lib/ronin/web/middleware.rb +0 -27
  106. data/lib/ronin/web/proxy/app.rb +0 -32
  107. data/lib/ronin/web/proxy/base.rb +0 -46
  108. data/lib/ronin/web/proxy/web.rb +0 -46
  109. data/lib/ronin/web/proxy.rb +0 -25
  110. data/lib/ronin/web/server/app.rb +0 -32
  111. data/lib/ronin/web/server/base.rb +0 -461
  112. data/lib/ronin/web/server/web.rb +0 -66
  113. data/lib/ronin/web/server.rb +0 -25
  114. data/lib/ronin/web/spider.rb +0 -120
  115. data/lib/ronin/web/user_agents.rb +0 -196
  116. data/lib/ronin/web/web.rb +0 -560
  117. data/spec/helpers/output.rb +0 -3
  118. data/spec/web/extensions/nokogiri_spec.rb +0 -38
  119. data/spec/web/helpers/rack_app.rb +0 -24
  120. data/spec/web/helpers/root/test1/index.html +0 -1
  121. data/spec/web/helpers/root/test1/test1.txt +0 -1
  122. data/spec/web/helpers/root/test1.txt +0 -1
  123. data/spec/web/helpers/root/test2/test2.txt +0 -1
  124. data/spec/web/helpers/root/test2.txt +0 -1
  125. data/spec/web/helpers/root/test3/test3.txt +0 -1
  126. data/spec/web/helpers/root/test3.txt +0 -1
  127. data/spec/web/helpers/root.rb +0 -15
  128. data/spec/web/mechanize_spec.rb +0 -62
  129. data/spec/web/middleware/directories_spec.rb +0 -86
  130. data/spec/web/middleware/files_spec.rb +0 -57
  131. data/spec/web/middleware/filters/campaign_filter_spec.rb +0 -30
  132. data/spec/web/middleware/filters/ip_filter_spec.rb +0 -25
  133. data/spec/web/middleware/filters/path_filter_spec.rb +0 -29
  134. data/spec/web/middleware/filters/referer_filter_spec.rb +0 -25
  135. data/spec/web/middleware/filters/user_agent_filter_spec.rb +0 -25
  136. data/spec/web/middleware/filters/vhost_filter_spec.rb +0 -23
  137. data/spec/web/middleware/proxy_spec.rb +0 -67
  138. data/spec/web/middleware/response_spec.rb +0 -20
  139. data/spec/web/middleware/router_spec.rb +0 -65
  140. data/spec/web/middleware/rule_spec.rb +0 -37
  141. data/spec/web/proxy/base_spec.rb +0 -8
  142. data/spec/web/server/base_spec.rb +0 -77
  143. data/spec/web/server/classes/public1/static1.txt +0 -1
  144. data/spec/web/server/classes/public2/static2.txt +0 -1
  145. data/spec/web/server/classes/sub_app.rb +0 -13
  146. data/spec/web/server/classes/test_app.rb +0 -20
  147. data/spec/web/user_agents_spec.rb +0 -56
  148. data/spec/web/web_spec.rb +0 -101
@@ -1,57 +0,0 @@
1
- #
2
- # Ronin Web - A Ruby library for Ronin that provides support for web
3
- # scraping and spidering functionality.
4
- #
5
- # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This file is part of Ronin Web.
8
- #
9
- # Ronin is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # Ronin is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU General Public License
20
- # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
21
- #
22
-
23
- require 'nokogiri'
24
-
25
- module Nokogiri
26
- module XML
27
- class Element < Node
28
-
29
- #
30
- # Determines if the element is similar to another element.
31
- #
32
- # @param [Nokogiri::XML::Element] other
33
- # The other element.
34
- #
35
- # @return [Boolean]
36
- # Specifies whether the element is equal, in identity or value, to
37
- # another element.
38
- #
39
- # @api public
40
- #
41
- def ==(other)
42
- return false unless super(other)
43
- return false unless attribute_nodes.length == other.attribute_nodes.length
44
-
45
- (0...attribute_nodes.length).each do |index|
46
- attr1 = attribute_nodes[index]
47
- attr2 = other.attribute_nodes[index]
48
-
49
- return false unless attr1.similar?(attr2)
50
- end
51
-
52
- return true
53
- end
54
-
55
- end
56
- end
57
- end
@@ -1,86 +0,0 @@
1
- #
2
- # Ronin Web - A Ruby library for Ronin that provides support for web
3
- # scraping and spidering functionality.
4
- #
5
- # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This file is part of Ronin Web.
8
- #
9
- # Ronin is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # Ronin is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU General Public License
20
- # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
21
- #
22
-
23
- require 'nokogiri'
24
-
25
- module Nokogiri
26
- module XML
27
- class Node
28
-
29
- #
30
- # Calculates the sum of all children of the node.
31
- #
32
- # @return [Integer]
33
- # The total number of children of the node.
34
- #
35
- # @api public
36
- #
37
- def total_children
38
- count = 0
39
-
40
- traverse { |node| count += 1 }
41
-
42
- return count - 1
43
- end
44
-
45
- #
46
- # Traverses all text nodes which are children of the node.
47
- #
48
- # @yield [node]
49
- # A block will be passed each text node.
50
- #
51
- # @yieldparam [Nokogiri::XML::Text] node
52
- # A text node.
53
- #
54
- # @return [Enumerator]
55
- # If no block is given, an Enumerator object will be returned.
56
- #
57
- # @api public
58
- #
59
- def traverse_text
60
- return enum_for(:traverse_text) unless block_given?
61
-
62
- yield self if text?
63
-
64
- traverse do |node|
65
- yield node if node.text?
66
- end
67
- end
68
-
69
- #
70
- # Determines if the node is similar to another node.
71
- #
72
- # @return [Boolean]
73
- # Specifies whether the node is equal, in identity or value, to
74
- # another node.
75
- #
76
- # @api public
77
- #
78
- def ==(other)
79
- return false unless other
80
-
81
- (self.type == other.type) && (self.name == other.name)
82
- end
83
-
84
- end
85
- end
86
- end
@@ -1,47 +0,0 @@
1
- #
2
- # Ronin Web - A Ruby library for Ronin that provides support for web
3
- # scraping and spidering functionality.
4
- #
5
- # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This file is part of Ronin Web.
8
- #
9
- # Ronin is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # Ronin is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU General Public License
20
- # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
21
- #
22
-
23
- require 'nokogiri'
24
-
25
- module Nokogiri
26
- module XML
27
- class Text < CharacterData
28
-
29
- #
30
- # Determines if the text node is similar to another text node.
31
- #
32
- # @param [Nokogiri::XML::Text] other
33
- # The other text node.
34
- #
35
- # @return [Boolean]
36
- # Specifies if the text node is similar, in indentity or value,
37
- # to the other text node.
38
- #
39
- # @api public
40
- #
41
- def ==(other)
42
- super(other) && (self.content == other.content)
43
- end
44
-
45
- end
46
- end
47
- end
@@ -1,27 +0,0 @@
1
- #
2
- # Ronin Web - A Ruby library for Ronin that provides support for web
3
- # scraping and spidering functionality.
4
- #
5
- # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This file is part of Ronin Web.
8
- #
9
- # Ronin is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # Ronin is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU General Public License
20
- # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
21
- #
22
-
23
- require 'ronin/web/extensions/nokogiri/xml/node'
24
- require 'ronin/web/extensions/nokogiri/xml/text'
25
- require 'ronin/web/extensions/nokogiri/xml/attr'
26
- require 'ronin/web/extensions/nokogiri/xml/element'
27
- require 'ronin/web/extensions/nokogiri/xml/document'
@@ -1,23 +0,0 @@
1
- #
2
- # Ronin Web - A Ruby library for Ronin that provides support for web
3
- # scraping and spidering functionality.
4
- #
5
- # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This file is part of Ronin Web.
8
- #
9
- # Ronin is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # Ronin is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU General Public License
20
- # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
21
- #
22
-
23
- require 'ronin/web/extensions/nokogiri/xml'
@@ -1,23 +0,0 @@
1
- #
2
- # Ronin Web - A Ruby library for Ronin that provides support for web
3
- # scraping and spidering functionality.
4
- #
5
- # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This file is part of Ronin Web.
8
- #
9
- # Ronin is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # Ronin is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU General Public License
20
- # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
21
- #
22
-
23
- require 'ronin/web/extensions/nokogiri'
@@ -1,144 +0,0 @@
1
- #
2
- # Ronin Web - A Ruby library for Ronin that provides support for web
3
- # scraping and spidering functionality.
4
- #
5
- # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This file is part of Ronin Web.
8
- #
9
- # Ronin is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # Ronin is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU General Public License
20
- # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
21
- #
22
-
23
- require 'ronin/web/middleware/helpers'
24
- require 'ronin/ui/output/helpers'
25
-
26
- module Ronin
27
- module Web
28
- module Middleware
29
- #
30
- # Baase-class for all Ronin Web Middleware.
31
- #
32
- class Base
33
-
34
- include Helpers
35
- include UI::Output::Helpers
36
-
37
- # The default status code to return
38
- DEFAULT_STATUS = 200
39
-
40
- # The status code to return
41
- attr_accessor :default_status
42
-
43
- # The default headers to return
44
- attr_reader :default_headers
45
-
46
- #
47
- # Creates a new middleware object.
48
- #
49
- # @param [#call] app
50
- # The application the middleware will sit in front of.
51
- #
52
- # @param [Hash] options
53
- # Additional options.
54
- #
55
- # @option options [Integer] :default_status (DEFAULT_STATUS)
56
- # The status code to return.
57
- #
58
- # @option options [Hash] :default_headers
59
- # The headers to return.
60
- #
61
- # @yield [middleware]
62
- # If a block is given, it will be passed the new middleware.
63
- #
64
- # @yieldparam [Base] middleware
65
- # The new middleware object.
66
- #
67
- # @since 0.3.0
68
- #
69
- # @api semipublic
70
- #
71
- def initialize(app,options={})
72
- @app = app
73
-
74
- @default_status = (options[:default_status] || DEFAULT_STATUS)
75
- @default_headers = {}
76
-
77
- if options.has_key?(:default_headers)
78
- @default_headers.merge!(options[:default_headers])
79
- end
80
-
81
- yield self if block_given?
82
- end
83
-
84
- #
85
- # Passes the request to the application.
86
- #
87
- # @param [Hash, Rack::Request] env
88
- # The request.
89
- #
90
- # @return [Rack::Response]
91
- # The response.
92
- #
93
- # @since 0.3.0
94
- #
95
- # @api semipublic
96
- #
97
- def call(env)
98
- @app.call(env)
99
- end
100
-
101
- protected
102
-
103
- #
104
- # Creates a new response.
105
- #
106
- # @param [String, Array, IO] body
107
- # The body for the response.
108
- #
109
- # @param [Hash] headers
110
- # Additional headers for the response.
111
- #
112
- # @param [Integer] status
113
- # The HTTP Status Code for the response.
114
- #
115
- # @yield [response]
116
- # If a block is given, it will be passed the new response.
117
- #
118
- # @yieldparam [Response] response
119
- # The new response.
120
- #
121
- # @return [Array]
122
- # The new response.
123
- #
124
- # @example Create a response.
125
- # response ['Hello'], {'Content-Type' => 'text/txt'}, 200
126
- #
127
- # @example Create a response with just a String.
128
- # response 'Hello'
129
- #
130
- # @since 0.3.0
131
- #
132
- # @api semipublic
133
- #
134
- def response(body=[],headers={},status=nil)
135
- status ||= @default_status
136
- headers = @default_headers.merge(headers)
137
-
138
- return super(body,headers,status)
139
- end
140
-
141
- end
142
- end
143
- end
144
- end
@@ -1,179 +0,0 @@
1
- #
2
- # Ronin Web - A Ruby library for Ronin that provides support for web
3
- # scraping and spidering functionality.
4
- #
5
- # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
6
- #
7
- # This file is part of Ronin Web.
8
- #
9
- # Ronin is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # Ronin is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU General Public License
20
- # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
21
- #
22
-
23
- require 'ronin/web/middleware/base'
24
-
25
- require 'set'
26
-
27
- module Ronin
28
- module Web
29
- module Middleware
30
- #
31
- # A Rack middleware to host local directories at specific remote
32
- # paths.
33
- #
34
- # use Ronin::Web::Middleware::Directories do |dirs|
35
- # dirs.map '/downloads', '/tmp/ronin_downloads'
36
- # end
37
- #
38
- class Directories < Base
39
-
40
- # The predefined index file names
41
- INDEX_NAMES = %w[index.html index.xhtml index.htm]
42
-
43
- # The mapping of remote paths to local directories
44
- attr_reader :paths
45
-
46
- #
47
- # Creates a new {Directories} middleware.
48
- #
49
- # @param [#call] app
50
- # The application the middleware sits in front of.
51
- #
52
- # @param [Hash] options
53
- # Additional options.
54
- #
55
- # @option options [Hash{String => String}] :paths
56
- # The mapping of remote paths to local directories.
57
- #
58
- # @yield [directories]
59
- # If a block is given, it will be passed the new directories
60
- # middleware.
61
- #
62
- # @yieldparam [Directories] directories
63
- # The new directories middleware object.
64
- #
65
- # @since 0.3.0
66
- #
67
- # @api public
68
- #
69
- def initialize(app,options={},&block)
70
- @paths = {}
71
- @paths_order = []
72
-
73
- if options.has_key?(:paths)
74
- options[:paths].each do |remote_path,local_dir|
75
- map(remote_path,local_dir)
76
- end
77
- end
78
-
79
- super(app,&block)
80
- end
81
-
82
- #
83
- # The names of index files.
84
- #
85
- # @return [Set]
86
- # The set of index file names.
87
- #
88
- # @since 0.3.0
89
- #
90
- # @api public
91
- #
92
- def Directories.index_names
93
- @@directories_index_names ||= Set.new(INDEX_NAMES)
94
- end
95
-
96
- #
97
- # Maps a remote path to a local directory.
98
- #
99
- # @param [String] remote_path
100
- # The remote path to map.
101
- #
102
- # @param [String] local_dir
103
- # The local directory that the remote path will map to.
104
- #
105
- # @return [true]
106
- #
107
- # @since 0.3.0
108
- #
109
- # @api public
110
- #
111
- def map(remote_path,local_dir)
112
- @paths[remote_path] = local_dir
113
-
114
- # sort paths by number of sub-directories
115
- @paths_order = @paths.keys.sort_by do |path|
116
- -(path.split('/').length)
117
- end
118
-
119
- return true
120
- end
121
-
122
- #
123
- # Returns a file from a local directory, if the directory
124
- # was mapped to a remote path.
125
- #
126
- # @param [Hash, Rack::Request] env
127
- # The request.
128
- #
129
- # @return [Array, Response]
130
- # The response.
131
- #
132
- # @since 0.3.0
133
- #
134
- # @api public
135
- #
136
- def call(env)
137
- path = sanitize_path(env['PATH_INFO'])
138
-
139
- # finds the remote directory that the paths starts with or is
140
- # equal to.
141
- remote_path = @paths_order.find do |remote_path|
142
- if remote_path == '/'
143
- true
144
- elsif path[0,remote_path.length] == remote_path
145
- (path[remote_path.length] == '/') ||
146
- (path.length == remote_path.length)
147
- end
148
- end
149
-
150
- if remote_path
151
- local_dir = @paths[remote_path]
152
- sub_path = path[remote_path.length..-1]
153
-
154
- return_file = proc { |local_path|
155
- if File.file?(local_path)
156
- request = Request.new(env)
157
-
158
- print_info "Returning file #{local_path.dump} for #{request.address}"
159
- return response_for(local_path)
160
- end
161
- }
162
-
163
- if sub_path.empty?
164
- # attempt to find an index file in the directory
165
- Directories.index_names.each do |index|
166
- return_file.call(File.join(local_dir,index))
167
- end
168
- else
169
- return_file.call(File.join(local_dir,sub_path))
170
- end
171
- end
172
-
173
- super(env)
174
- end
175
-
176
- end
177
- end
178
- end
179
- end