rack-diet 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8c85d657b218c47ee766698996d5dccb1daee722
4
+ data.tar.gz: e72a871bca6c0b3e88d6728702f13a18a34f7aa8
5
+ SHA512:
6
+ metadata.gz: 6fd057afb59c594bb69a332e1e1510091a3125758d5881f8fd637c655ff0c12c8ccb6ae0389af9bb139009138997cdca27a2f372b3f1216c29e852c614e7d03f
7
+ data.tar.gz: 9fb9d4541a33ecd64a4e462aca7247f18740b109bed585fdef9bdd88dfe721e6cc35cba33d77874e7909162bbe38f5dccb0eb47333f7a95a59325749ae93deb8
@@ -0,0 +1,44 @@
1
+ require "rack/diet/version"
2
+ require "nokogiri"
3
+ require "uri"
4
+
5
+ module Rack
6
+ class Diet
7
+ ALLOWED_HOSTS = %w(localhost 127.0.0.1)
8
+
9
+ def initialize(app, allowed_hosts: ALLOWED_HOSTS)
10
+ @app = app
11
+ @allowed_hosts = allowed_hosts + [nil]
12
+ end
13
+
14
+ def call(env)
15
+ status, headers, body = @app.call(env)
16
+
17
+ if headers.fetch("Content-Type", "").match /text\/html/
18
+ page = ::Nokogiri::HTML(body.enum_for(:each).to_a.join)
19
+ page.css('script[src]')
20
+ .select { |node| !@allowed_hosts.include?(URI(node["src"]).host) }
21
+ .each { |node| node.remove }
22
+ page.css('script:not([src])')
23
+ .select { |node| node.text.match /\.src\s*=/ }
24
+ .each { |node| node.remove }
25
+ page.css('noscript')
26
+ .each { |node| node.remove }
27
+ page.css('link[rel="stylesheet"]')
28
+ .select { |node| !@allowed_hosts.include?(URI(node["href"]).host) }
29
+ .each { |node| node.remove }
30
+ page.css('head')
31
+ .each { |node| node.add_child <<~EOS
32
+ <style>
33
+ * { animation-duration: 0s !important; }
34
+ </style>
35
+ EOS
36
+ }
37
+
38
+ Rack::Response.new(page.to_s, status, headers).to_a
39
+ else
40
+ Rack::Response.new(body, status, headers).to_a
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,5 @@
1
+ module Rack
2
+ class Diet
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-diet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Billetto
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email:
85
+ - development@billetto.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - lib/rack/diet.rb
91
+ - lib/rack/diet/version.rb
92
+ homepage: https://github.com/gfish/rack-diet
93
+ licenses:
94
+ - MIT
95
+ metadata: {}
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 2.6.14.4
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: Disable CSS3 animations and filter out external JavaScript downloads. Helpful
116
+ for reliable testing with Capybara.
117
+ test_files: []