screw-unit-server 0.3.0 → 0.5.3

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 (124) hide show
  1. data/CHANGES +23 -1
  2. data/README.markdown +10 -3
  3. data/Rakefile +27 -55
  4. data/VERSION.yml +4 -0
  5. data/bin/screw_unit_server +14 -4
  6. data/core/CHANGES +10 -0
  7. data/core/EXAMPLE.html +4 -4
  8. data/core/README.markdown +7 -7
  9. data/core/example/models/man.js +2 -2
  10. data/core/example/spec/suite.html +1 -1
  11. data/core/lib/jquery-1.3.2.js +4376 -0
  12. data/core/lib/jquery.fn.js +2 -1
  13. data/core/lib/jquery.print.js +13 -12
  14. data/core/lib/screw.behaviors.js +11 -9
  15. data/core/lib/screw.builder.js +26 -11
  16. data/core/lib/screw.css +2 -2
  17. data/core/lib/screw.events.js +11 -4
  18. data/core/lib/screw.matchers.js +192 -13
  19. data/core/spec/behaviors_spec.js +11 -1
  20. data/core/spec/matchers_spec.js +288 -9
  21. data/core/spec/print_spec.js +47 -8
  22. data/core/spec/suite.html +2 -1
  23. data/core/spec/with_screw_context_spec.js +9 -0
  24. data/lib/screw_unit.rb +13 -16
  25. data/lib/screw_unit/representations.rb +2 -0
  26. data/lib/screw_unit/representations/spec.html.rb +117 -0
  27. data/spec/functional/functional_spec.rb +14 -3
  28. data/spec/functional/functional_spec_helper.rb +22 -34
  29. data/spec/functional/functional_spec_server_starter.rb +68 -0
  30. data/spec/unit/js_test_core/specs/spec_file_spec.rb +45 -20
  31. data/spec/unit/unit_spec_helper.rb +24 -93
  32. data/vendor/js-test-core/CHANGES +19 -0
  33. data/vendor/js-test-core/Rakefile +2 -1
  34. data/vendor/js-test-core/lib/js_test_core.rb +26 -10
  35. data/vendor/js-test-core/lib/js_test_core/app.rb +12 -0
  36. data/vendor/js-test-core/lib/js_test_core/client.rb +97 -18
  37. data/vendor/js-test-core/lib/js_test_core/configuration.rb +35 -0
  38. data/vendor/js-test-core/lib/js_test_core/extensions.rb +3 -0
  39. data/vendor/js-test-core/lib/js_test_core/extensions/selenium/client/driver.rb +7 -0
  40. data/vendor/js-test-core/lib/js_test_core/extensions/time.rb +6 -0
  41. data/vendor/js-test-core/lib/js_test_core/models.rb +8 -0
  42. data/vendor/js-test-core/lib/js_test_core/models/selenium_session.rb +80 -0
  43. data/vendor/js-test-core/lib/js_test_core/representations.rb +11 -0
  44. data/vendor/js-test-core/lib/js_test_core/representations/dir.html.rb +24 -0
  45. data/vendor/js-test-core/lib/js_test_core/representations/not_found.html.rb +15 -0
  46. data/vendor/js-test-core/lib/js_test_core/representations/page.html.rb +41 -0
  47. data/vendor/js-test-core/lib/js_test_core/representations/spec.html.rb +24 -0
  48. data/vendor/js-test-core/lib/js_test_core/resources.rb +13 -8
  49. data/vendor/js-test-core/lib/js_test_core/resources/core_file.rb +19 -0
  50. data/vendor/js-test-core/lib/js_test_core/resources/file.rb +44 -14
  51. data/vendor/js-test-core/lib/js_test_core/resources/implementations_deprecation.rb +12 -0
  52. data/vendor/js-test-core/lib/js_test_core/resources/not_found.rb +35 -0
  53. data/vendor/js-test-core/lib/js_test_core/resources/resource.rb +16 -0
  54. data/vendor/js-test-core/lib/js_test_core/resources/selenium_session.rb +104 -0
  55. data/vendor/js-test-core/lib/js_test_core/resources/spec_file.rb +63 -0
  56. data/vendor/js-test-core/lib/js_test_core/resources/web_root.rb +5 -56
  57. data/vendor/js-test-core/lib/js_test_core/selenium_server_configuration.rb +48 -0
  58. data/vendor/js-test-core/spec/example_core/subdir/SubDirFile.js +0 -0
  59. data/vendor/js-test-core/spec/example_public/javascripts/large_file.js +59 -0
  60. data/vendor/js-test-core/spec/example_public/javascripts/subdir/bar.js +1 -0
  61. data/vendor/js-test-core/spec/example_specs/custom_dir_and_suite/passing_spec.js +6 -0
  62. data/vendor/js-test-core/spec/example_specs/custom_suite.html +8 -0
  63. data/vendor/js-test-core/spec/example_specs/foo/failing_spec.js +1 -1
  64. data/vendor/js-test-core/spec/example_specs/foo/passing_spec.js +1 -1
  65. data/vendor/js-test-core/spec/spec_helpers/be_http.rb +32 -0
  66. data/vendor/js-test-core/spec/spec_helpers/example_group.rb +36 -0
  67. data/vendor/js-test-core/spec/spec_helpers/fake_selenium_driver.rb +27 -0
  68. data/vendor/js-test-core/spec/spec_helpers/show_test_exceptions.rb +22 -0
  69. data/vendor/js-test-core/spec/unit/js_test_core/client_spec.rb +140 -85
  70. data/vendor/js-test-core/spec/unit/js_test_core/configuration_spec.rb +44 -0
  71. data/vendor/js-test-core/spec/unit/js_test_core/models/selenium_session_spec.rb +85 -0
  72. data/vendor/js-test-core/spec/unit/js_test_core/resources/core_file_spec.rb +60 -0
  73. data/vendor/js-test-core/spec/unit/js_test_core/resources/file_spec.rb +61 -68
  74. data/vendor/js-test-core/spec/unit/js_test_core/resources/implementations_deprecation_spec.rb +18 -0
  75. data/vendor/js-test-core/spec/unit/js_test_core/resources/not_found_spec.rb +51 -0
  76. data/vendor/js-test-core/spec/unit/js_test_core/resources/selenium_session_spec.rb +362 -0
  77. data/vendor/js-test-core/spec/unit/js_test_core/resources/spec_file_spec.rb +120 -0
  78. data/vendor/js-test-core/spec/unit/js_test_core/resources/web_root_spec.rb +14 -89
  79. data/vendor/js-test-core/spec/unit/js_test_core/selenium_server_configuration_spec.rb +49 -0
  80. data/vendor/js-test-core/spec/unit/unit_spec_helper.rb +16 -113
  81. data/vendor/js-test-core/vendor/lucky-luciano/README.markdown +7 -0
  82. data/vendor/js-test-core/vendor/lucky-luciano/lib/lucky_luciano.rb +4 -0
  83. data/vendor/js-test-core/vendor/lucky-luciano/lib/lucky_luciano/resource.rb +135 -0
  84. data/vendor/js-test-core/vendor/lucky-luciano/lib/lucky_luciano/rspec.rb +4 -0
  85. data/vendor/js-test-core/vendor/lucky-luciano/lib/lucky_luciano/rspec/be_http.rb +32 -0
  86. data/vendor/js-test-core/vendor/lucky-luciano/spec/lucky_luciano/resource_spec.rb +231 -0
  87. data/vendor/js-test-core/vendor/lucky-luciano/spec/spec_helper.rb +48 -0
  88. data/vendor/js-test-core/vendor/lucky-luciano/spec/spec_suite.rb +4 -0
  89. metadata +143 -129
  90. data/core/TODO +0 -2
  91. data/core/lib/jquery-1.2.3.js +0 -3408
  92. data/core/lib/screw.assets.js +0 -36
  93. data/core/lib/screw.server.js +0 -21
  94. data/lib/screw_unit/resources.rb +0 -2
  95. data/lib/screw_unit/resources/spec.rb +0 -37
  96. data/spec/unit/js_test_core/specs/spec_dir_spec.rb +0 -43
  97. data/vendor/js-test-core/lib/js_test_core/rack.rb +0 -2
  98. data/vendor/js-test-core/lib/js_test_core/rack/commonlogger.rb +0 -5
  99. data/vendor/js-test-core/lib/js_test_core/rails_server.rb +0 -22
  100. data/vendor/js-test-core/lib/js_test_core/resources/dir.rb +0 -52
  101. data/vendor/js-test-core/lib/js_test_core/resources/file_not_found.rb +0 -15
  102. data/vendor/js-test-core/lib/js_test_core/resources/runners.rb +0 -15
  103. data/vendor/js-test-core/lib/js_test_core/resources/runners/firefox_runner.rb +0 -75
  104. data/vendor/js-test-core/lib/js_test_core/resources/specs/spec_dir.rb +0 -50
  105. data/vendor/js-test-core/lib/js_test_core/resources/specs/spec_file.rb +0 -17
  106. data/vendor/js-test-core/lib/js_test_core/resources/suite.rb +0 -24
  107. data/vendor/js-test-core/lib/js_test_core/resources/suite_finish.rb +0 -19
  108. data/vendor/js-test-core/lib/js_test_core/selenium.rb +0 -2
  109. data/vendor/js-test-core/lib/js_test_core/selenium/selenium_driver.rb +0 -5
  110. data/vendor/js-test-core/lib/js_test_core/server.rb +0 -111
  111. data/vendor/js-test-core/lib/js_test_core/thin.rb +0 -3
  112. data/vendor/js-test-core/lib/js_test_core/thin/backends/js_test_core_server.rb +0 -9
  113. data/vendor/js-test-core/lib/js_test_core/thin/js_test_core_connection.rb +0 -42
  114. data/vendor/js-test-core/spec/unit/js_test_core/rails_server_spec.rb +0 -45
  115. data/vendor/js-test-core/spec/unit/js_test_core/resources/dir_spec.rb +0 -42
  116. data/vendor/js-test-core/spec/unit/js_test_core/resources/file_not_found_spec.rb +0 -26
  117. data/vendor/js-test-core/spec/unit/js_test_core/resources/runner_spec.rb +0 -24
  118. data/vendor/js-test-core/spec/unit/js_test_core/resources/runners/firefox_runner_spec.rb +0 -197
  119. data/vendor/js-test-core/spec/unit/js_test_core/resources/specs/spec_dir_spec.rb +0 -79
  120. data/vendor/js-test-core/spec/unit/js_test_core/resources/specs/spec_file_spec.rb +0 -42
  121. data/vendor/js-test-core/spec/unit/js_test_core/resources/suite_finish_spec.rb +0 -94
  122. data/vendor/js-test-core/spec/unit/js_test_core/resources/suite_spec.rb +0 -44
  123. data/vendor/js-test-core/spec/unit/js_test_core/server_spec.rb +0 -131
  124. data/vendor/js-test-core/spec/unit/thin/js_test_core_connection_spec.rb +0 -92
@@ -1,36 +0,0 @@
1
- (function() {
2
- Screw.Assets = {};
3
- Screw.Assets.use_cache_buster = false; // TODO: NS/CTI - make this configurable from the UI.
4
- var required_paths = [];
5
- var included_stylesheets = {};
6
- var cache_buster = parseInt(new Date().getTime()/(1*1000));
7
-
8
- Screw.Assets.require = function(javascript_path, onload) {
9
- if(!required_paths[javascript_path]) {
10
- var full_path = javascript_path + ".js";
11
- if (Screw.Assets.use_cache_buster) {
12
- full_path += '?' + cache_buster;
13
- }
14
- document.write("<script src='" + full_path + "' type='text/javascript'></script>");
15
- if(onload) {
16
- var scripts = document.getElementsByTagName('script');
17
- scripts[scripts.length-1].onload = onload;
18
- }
19
- required_paths[javascript_path] = true;
20
- }
21
- };
22
-
23
- Screw.Assets.stylesheet = function(stylesheet_path) {
24
- if(!included_stylesheets[stylesheet_path]) {
25
- var full_path = stylesheet_path + ".css";
26
- if(Screw.Assets.use_cache_buster) {
27
- full_path += '?' + cache_buster;
28
- }
29
- document.write("<link rel='stylesheet' type='text/css' href='" + full_path + "' />");
30
- included_stylesheets[stylesheet_path] = true;
31
- }
32
- };
33
-
34
- window.require = Screw.Assets.require;
35
- window.stylesheet = Screw.Assets.stylesheet;
36
- })();
@@ -1,21 +0,0 @@
1
- (function($) {
2
- var ajax = $.ajax;
3
- $(Screw).bind('after', function() {
4
- var error_text = $(".error").map(function(i, element) {
5
- return element.innerHTML;
6
- }).get().join("\n");
7
-
8
- var suite_id;
9
- if(top.runOptions) {
10
- suite_id = top.runOptions.getSessionId();
11
- } else {
12
- suite_id = 'user';
13
- }
14
-
15
- ajax({
16
- type: "POST",
17
- url: '/suites/' + suite_id + '/finish',
18
- data: {"text": error_text}
19
- });
20
- });
21
- })(jQuery);
@@ -1,2 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/resources/spec"
@@ -1,37 +0,0 @@
1
- module ScrewUnit
2
- module Resources
3
- module Spec
4
- def get(request, response)
5
- html = <<-HTML
6
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
7
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko">
8
- <head>
9
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
10
- <title>ScrewUnit results</title>
11
- <script src="/core/jquery-1.2.3.js"></script>
12
- <script src="/core/jquery.fn.js"></script>
13
- <script src="/core/jquery.print.js"></script>
14
- <script src="/core/screw.builder.js"></script>
15
- <script src="/core/screw.matchers.js"></script>
16
- <script src="/core/screw.events.js"></script>
17
- <script src="/core/screw.behaviors.js"></script>
18
- <script src="/core/screw.assets.js"></script>
19
- <script src="/core/screw.server.js"></script>
20
- <link rel="stylesheet" href="/core/screw.css">
21
- HTML
22
- spec_files.each do |file|
23
- html << %{<script type="text/javascript" src="#{file.relative_path}"></script>\n}
24
- end
25
-
26
- html << <<-HTML
27
- </head>
28
- <body>
29
- <div id="screw_unit_content"></div>
30
- </body>
31
- </html>
32
- HTML
33
- response.body = html.gsub(/^ /, "")
34
- end
35
- end
36
- end
37
- end
@@ -1,43 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../../unit_spec_helper")
2
-
3
- module JsTestCore
4
- module Resources
5
- module Specs
6
- describe SpecDir do
7
- attr_reader :dir
8
-
9
- before do
10
- stub(EventMachine).send_data
11
- stub(EventMachine).close_connection
12
- @dir = SpecDir.new(spec_root_path, '/specs')
13
- end
14
-
15
- describe "#get" do
16
- attr_reader :html, :doc
17
- before do
18
- request = request('get', '/specs')
19
- response = Rack::Response.new
20
- dir.get(request, response)
21
- @html = response.body
22
- @doc = Hpricot(html)
23
- end
24
-
25
- it "returns script tags for each test javascript file" do
26
- doc.at("script[@src='/specs/failing_spec.js']").should exist
27
- doc.at("script[@src='/specs/foo/failing_spec.js']").should exist
28
- doc.at("script[@src='/specs/foo/passing_spec.js']").should exist
29
- end
30
-
31
- it "returns the screw unit template" do
32
- doc.at("link[@href='/core/screw.css']").should exist
33
- doc.at("script[@src='/core/screw.builder.js']").should exist
34
- doc.at("script[@src='/core/screw.events.js']").should exist
35
- doc.at("script[@src='/core/screw.behaviors.js']").should exist
36
- doc.at("script[@src='/core/screw.assets.js']").should exist
37
- doc.at("body/#screw_unit_content").should_not be_nil
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,2 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/rack/commonlogger"
@@ -1,5 +0,0 @@
1
- Rack::CommonLogger.class_eval do
2
- def empty?
3
- @body.empty?
4
- end
5
- end
@@ -1,22 +0,0 @@
1
- module JsTestCore
2
- class RailsServer < Server
3
- class << self
4
- def run(rails_root, server_options = {})
5
- server_options[:Host] ||= DEFAULT_HOST
6
- server_options[:Port] ||= DEFAULT_PORT
7
- Server.instance = new(rails_root, server_options[:Host], server_options[:Port])
8
- Server.instance.run server_options
9
- end
10
- end
11
-
12
- def initialize(rails_root, host=DEFAULT_HOST, port=DEFAULT_PORT)
13
- super(
14
- "#{rails_root}/spec/javascripts",
15
- "#{rails_root}/public/javascripts",
16
- "#{rails_root}/public",
17
- host,
18
- port
19
- )
20
- end
21
- end
22
- end
@@ -1,52 +0,0 @@
1
- module JsTestCore
2
- module Resources
3
- class Dir < File
4
- def locate(name)
5
- if file = file(name)
6
- file
7
- elsif subdir = subdir(name)
8
- subdir
9
- else
10
- raise "No file or directory found at #{relative_path}/#{name}."
11
- end
12
- end
13
-
14
- def get(request, response)
15
-
16
- end
17
-
18
- def glob(pattern)
19
- expanded_pattern = absolute_path + pattern
20
- ::Dir.glob(expanded_pattern).map do |absolute_globbed_path|
21
- relative_globbed_path = absolute_globbed_path.gsub(absolute_path, relative_path)
22
- File.new(absolute_globbed_path, relative_globbed_path)
23
- end
24
- end
25
-
26
- protected
27
- def determine_child_paths(name)
28
- absolute_child_path = "#{absolute_path}/#{name}"
29
- relative_child_path = "#{relative_path}/#{name}"
30
- [absolute_child_path, relative_child_path]
31
- end
32
-
33
- def file(name)
34
- absolute_file_path, relative_file_path = determine_child_paths(name)
35
- if ::File.exists?(absolute_file_path) && !::File.directory?(absolute_file_path)
36
- Resources::File.new(absolute_file_path, relative_file_path)
37
- else
38
- nil
39
- end
40
- end
41
-
42
- def subdir(name)
43
- absolute_dir_path, relative_dir_path = determine_child_paths(name)
44
- if ::File.directory?(absolute_dir_path)
45
- Resources::Dir.new(absolute_dir_path, relative_dir_path)
46
- else
47
- nil
48
- end
49
- end
50
- end
51
- end
52
- end
@@ -1,15 +0,0 @@
1
- module JsTestCore
2
- module Resources
3
- class FileNotFound
4
- attr_reader :name
5
- def initialize(name)
6
- @name = name
7
- end
8
-
9
- def get(request, response)
10
- response.status = 404
11
- response.body = "Path #{name} not found. You may want to try the /#{WebRoot.dispatch_strategy} directory."
12
- end
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
-
3
- module JsTestCore
4
- module Resources
5
- class Runners
6
- def locate(name)
7
- if name == 'firefox'
8
- FirefoxRunner.new
9
- else
10
- raise "Invalid path #{name}"
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,75 +0,0 @@
1
- module JsTestCore
2
- module Resources
3
- class Runners
4
- class FirefoxRunner
5
- class << self
6
- def resume(suite_id, text)
7
- if instances[suite_id]
8
- runner = instances.delete(suite_id)
9
- runner.finalize(text)
10
- end
11
- end
12
-
13
- def register_instance(runner)
14
- instances[runner.suite_id] = runner
15
- end
16
-
17
- protected
18
- def instances
19
- @instances ||= {}
20
- end
21
- end
22
-
23
- include FileUtils
24
- attr_reader :profile_dir, :connection, :driver, :response
25
-
26
- def initialize
27
- profile_base = "#{::Dir.tmpdir}/js_test_core/firefox"
28
- mkdir_p profile_base
29
- @profile_dir = "#{profile_base}/#{Time.now.to_i}"
30
- @connection = Server.connection
31
- end
32
-
33
- def post(request, response)
34
- @response = response
35
-
36
- spec_url = (request && request['spec_url']) ? request['spec_url'] : spec_suite_url
37
- parsed_spec_url = URI.parse(spec_url)
38
- selenium_port = (request['selenium_port'] || 4444).to_i
39
- @driver = Selenium::SeleniumDriver.new(
40
- request['selenium_host'] || 'localhost',
41
- selenium_port,
42
- '*firefox',
43
- "#{parsed_spec_url.scheme}://#{parsed_spec_url.host}:#{parsed_spec_url.port}"
44
- )
45
- begin
46
- driver.start
47
- rescue Errno::ECONNREFUSED => e
48
- raise Errno::ECONNREFUSED, "Cannot connect to Selenium Server on port #{selenium_port}. To start the selenium server, run `selenium`."
49
- end
50
- Thread.start do
51
- driver.open(spec_url)
52
- end
53
- response.status = 200
54
- FirefoxRunner.register_instance self
55
- end
56
-
57
- def finalize(text)
58
- driver.stop
59
- response.body = text
60
- connection.send_body(response)
61
- end
62
-
63
- def suite_id
64
- driver.session_id
65
- end
66
-
67
- protected
68
-
69
- def spec_suite_url
70
- "#{Server.root_url}/specs"
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,50 +0,0 @@
1
- module JsTestCore
2
- module Resources
3
- module Specs
4
- class SpecDirSuperclass < ::JsTestCore::Resources::Dir
5
- def get(request, response)
6
- raise NotImplementedError, "#{self.class}#get needs to be implemented"
7
- end
8
- end
9
-
10
- class SpecDir < SpecDirSuperclass
11
- def spec_files
12
- glob("/**/*_spec.js")
13
- end
14
-
15
- def locate(name)
16
- if file = file(name)
17
- file
18
- elsif subdir = subdir(name)
19
- subdir
20
- elsif spec_file = spec_file(name)
21
- spec_file
22
- else
23
- base_path = "#{relative_path}/#{name}"
24
- raise "No file or directory found at #{base_path} or spec found at #{base_path}.js."
25
- end
26
- end
27
-
28
- protected
29
-
30
- def subdir(name)
31
- absolute_dir_path, relative_dir_path = determine_child_paths(name)
32
- if ::File.directory?(absolute_dir_path)
33
- SpecDir.new(absolute_dir_path, relative_dir_path)
34
- else
35
- nil
36
- end
37
- end
38
-
39
- def spec_file(name)
40
- absolute_file_path, relative_file_path = determine_child_paths("#{name}.js")
41
- if ::File.exists?(absolute_file_path) && !::File.directory?(absolute_file_path)
42
- SpecFile.new(absolute_file_path, relative_file_path)
43
- else
44
- nil
45
- end
46
- end
47
- end
48
- end
49
- end
50
- end
@@ -1,17 +0,0 @@
1
- module JsTestCore
2
- module Resources
3
- module Specs
4
- class SpecFileSuperclass < ::JsTestCore::Resources::File
5
- def get(request, response)
6
- raise NotImplementedError, "#{self.class}#get needs to be implemented"
7
- end
8
- end
9
-
10
- class SpecFile < SpecFileSuperclass
11
- def spec_files
12
- [self]
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,24 +0,0 @@
1
- module JsTestCore
2
- module Resources
3
- class Suite
4
- class << self
5
- def locate(id)
6
- new id
7
- end
8
- end
9
-
10
- attr_reader :id
11
- def initialize(id)
12
- @id = id
13
- end
14
-
15
- def locate(name)
16
- if name == 'finish'
17
- SuiteFinish.new self
18
- else
19
- raise ArgumentError, "Invalid path: #{name}"
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,19 +0,0 @@
1
- module JsTestCore
2
- module Resources
3
- class SuiteFinish
4
- attr_reader :suite
5
- def initialize(suite)
6
- @suite = suite
7
- end
8
-
9
- def post(request, response)
10
- if suite.id == 'user'
11
- STDOUT.puts request['text']
12
- else
13
- Runners::FirefoxRunner.resume(suite.id, request['text'])
14
- end
15
- response.headers['Content-Length'] = "0"
16
- end
17
- end
18
- end
19
- end