breezy_pdf_lite 0.0.7 → 0.1.0
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -3
- data/breezy_pdf_lite.gemspec +2 -1
- data/lib/breezy_pdf_lite/intercept/base.rb +3 -33
- data/lib/breezy_pdf_lite/intercept/html.rb +17 -45
- data/lib/breezy_pdf_lite/interceptor.rb +32 -15
- data/lib/breezy_pdf_lite/middleware.rb +19 -1
- data/lib/breezy_pdf_lite/render_request.rb +7 -6
- data/lib/breezy_pdf_lite/version.rb +1 -1
- metadata +21 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0d0a2c4ac70b3568da6aa15a499409ca7c4de9b602b6e9f7233fd640eca7d91
|
4
|
+
data.tar.gz: e2f46ce4a20952f4e5357a348e4689b2eddf427b6eb613cdb70002e00554342c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26b62d5f98e2bb19b80aee67ca53fa4408a2616c9522a0320bd88743a1807f5419a49c9b331039198c034ca3a2ca3db1c6756e58f83239242415620165b196e1
|
7
|
+
data.tar.gz: c51834be66ab1e37422d3c8e9652b2a2c987d80608e743d6f9d271fa357665f50d27a2008d7f6ff27a3073dfaaba570a3454ffe145485ac473bc37700486ffe6
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
breezy_pdf_lite (0.0.
|
4
|
+
breezy_pdf_lite (0.0.7)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -9,10 +9,11 @@ GEM
|
|
9
9
|
ast (2.4.0)
|
10
10
|
jaro_winkler (1.5.4)
|
11
11
|
minitest (5.14.0)
|
12
|
-
|
12
|
+
mocha (1.11.0)
|
13
13
|
parallel (1.19.1)
|
14
14
|
parser (2.7.0.2)
|
15
15
|
ast (~> 2.4.0)
|
16
|
+
rack (2.1.1)
|
16
17
|
rainbow (3.0.0)
|
17
18
|
rake (13.0.1)
|
18
19
|
rubocop (0.79.0)
|
@@ -32,7 +33,8 @@ DEPENDENCIES
|
|
32
33
|
breezy_pdf_lite!
|
33
34
|
bundler (~> 2.0)
|
34
35
|
minitest (~> 5.0)
|
35
|
-
|
36
|
+
mocha (= 1.11)
|
37
|
+
rack (~> 2.0)
|
36
38
|
rake (~> 13.0)
|
37
39
|
rubocop (= 0.79.0)
|
38
40
|
|
data/breezy_pdf_lite.gemspec
CHANGED
@@ -20,9 +20,10 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
+
spec.add_development_dependency "rack", "~> 2.0"
|
23
24
|
spec.add_development_dependency "bundler", "~> 2.0"
|
24
25
|
spec.add_development_dependency "minitest", "~> 5.0"
|
25
|
-
spec.add_development_dependency "
|
26
|
+
spec.add_development_dependency "mocha", "1.11"
|
26
27
|
spec.add_development_dependency "rake", "~> 13.0"
|
27
28
|
spec.add_development_dependency "rubocop", "0.79.0"
|
28
29
|
end
|
@@ -3,40 +3,10 @@
|
|
3
3
|
module BreezyPDFLite::Intercept
|
4
4
|
# :nodoc
|
5
5
|
class Base
|
6
|
-
attr_reader :
|
6
|
+
attr_reader :body
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
@
|
10
|
-
@env = env
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def rendered_url
|
16
|
-
"#{base_url}#{path}#{query_string}"
|
17
|
-
end
|
18
|
-
|
19
|
-
def requested_url
|
20
|
-
"#{env['rack.url_scheme']}://#{env['SERVER_NAME']}#{port}" \
|
21
|
-
"#{env['PATH_INFO']}#{query_string}"
|
22
|
-
end
|
23
|
-
|
24
|
-
def base_url
|
25
|
-
"#{env['rack.url_scheme']}://#{env['SERVER_NAME']}#{port}"
|
26
|
-
end
|
27
|
-
|
28
|
-
def port
|
29
|
-
":#{env['SERVER_PORT']}" unless [80, 443].include?(env["SERVER_PORT"].to_i)
|
30
|
-
end
|
31
|
-
|
32
|
-
def path
|
33
|
-
env["PATH_INFO"].gsub(/\.pdf/, "")
|
34
|
-
end
|
35
|
-
|
36
|
-
def query_string
|
37
|
-
return "" if env["QUERY_STRING"].nil?
|
38
|
-
|
39
|
-
env["QUERY_STRING"] == "" ? "" : "?#{env['QUERY_STRING']}"
|
8
|
+
def initialize(body)
|
9
|
+
@body = body
|
40
10
|
end
|
41
11
|
end
|
42
12
|
end
|
@@ -1,62 +1,34 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "rack/request"
|
4
|
+
require "rack/file"
|
5
|
+
|
3
6
|
module BreezyPDFLite::Intercept
|
4
|
-
#
|
7
|
+
# Takes the App's response body, and submits it to the breezypdf lite endpoint
|
8
|
+
# resulting in a file. File is then served with Rack::File
|
5
9
|
class HTML < Base
|
6
10
|
def call
|
7
|
-
|
8
|
-
|
9
|
-
render_request = BreezyPDFLite::RenderRequest.new(body).submit
|
11
|
+
request = Rack::Request.new({})
|
12
|
+
path = render_request_file.path
|
10
13
|
|
11
|
-
|
12
|
-
raise BreezyPDFLite::RenderError, "Status: #{render_request.status} body: #{render_request.body}"
|
13
|
-
end
|
14
|
-
|
15
|
-
[
|
16
|
-
201,
|
17
|
-
{
|
18
|
-
"Content-Type" => "application/pdf",
|
19
|
-
"Content-Length" => render_request.header["Content-Length"],
|
20
|
-
"Content-Disposition" => render_request.header["Content-Disposition"]
|
21
|
-
},
|
22
|
-
[render_request.body]
|
23
|
-
]
|
24
|
-
rescue BreezyPDFLite::Intercept::UnRenderable
|
25
|
-
response
|
14
|
+
Rack::File.new(path, response_headers).serving(request, path)
|
26
15
|
end
|
27
16
|
|
28
17
|
private
|
29
18
|
|
30
|
-
def
|
31
|
-
@
|
32
|
-
end
|
33
|
-
|
34
|
-
def headers
|
35
|
-
@headers ||= response[1]
|
36
|
-
end
|
37
|
-
|
38
|
-
def body
|
39
|
-
if response[2].respond_to?(:join)
|
40
|
-
response[2].join
|
41
|
-
elsif response[2].respond_to?(:each)
|
42
|
-
content = []
|
43
|
-
response[2].each { |part| content << part }
|
44
|
-
|
45
|
-
content.join
|
46
|
-
else
|
47
|
-
response[2]
|
48
|
-
end
|
19
|
+
def render_request
|
20
|
+
@render_request ||= BreezyPDFLite::RenderRequest.new(body)
|
49
21
|
end
|
50
22
|
|
51
|
-
def
|
52
|
-
@
|
23
|
+
def render_request_file
|
24
|
+
@render_request_file ||= render_request.to_file
|
53
25
|
end
|
54
26
|
|
55
|
-
def
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
27
|
+
def response_headers
|
28
|
+
@response_headers ||= {
|
29
|
+
"Content-Type" => "application/pdf",
|
30
|
+
"Content-Disposition" => render_request.response.header["Content-Disposition"]
|
31
|
+
}
|
60
32
|
end
|
61
33
|
end
|
62
34
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module BreezyPDFLite
|
4
|
-
# Intercept a Rack request
|
4
|
+
# Intercept a Rack request, determining if the app's response should
|
5
|
+
# be intercepted or simply returned
|
5
6
|
class Interceptor
|
6
7
|
attr_reader :app, :env
|
7
8
|
|
@@ -10,34 +11,50 @@ module BreezyPDFLite
|
|
10
11
|
@env = env
|
11
12
|
end
|
12
13
|
|
13
|
-
def
|
14
|
-
if
|
15
|
-
|
14
|
+
def call
|
15
|
+
if (200..299).cover?(app_response_status) # Did the app respond well?
|
16
|
+
Intercept::HTML.new(app_response_body).call # Try to return a PDF
|
16
17
|
else
|
17
|
-
app
|
18
|
+
app_response # Bad app response, just send respond with that
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
22
|
private
|
22
23
|
|
23
|
-
def
|
24
|
-
|
24
|
+
def app_response
|
25
|
+
@app_response ||= app.call(doctored_env)
|
25
26
|
end
|
26
27
|
|
27
|
-
def
|
28
|
-
|
28
|
+
def app_response_status
|
29
|
+
@app_response_status ||= app_response[0].to_i
|
29
30
|
end
|
30
31
|
|
31
|
-
def
|
32
|
-
|
32
|
+
def app_response_headers
|
33
|
+
@app_response_headers ||= app_response[1]
|
33
34
|
end
|
34
35
|
|
35
|
-
def
|
36
|
-
|
36
|
+
def app_response_body
|
37
|
+
if app_response[2].respond_to?(:join)
|
38
|
+
app_response[2].join
|
39
|
+
elsif app_response[2].respond_to?(:each)
|
40
|
+
content = []
|
41
|
+
app_response[2].each { |part| content << part }
|
42
|
+
|
43
|
+
content.join
|
44
|
+
else
|
45
|
+
app_response[2]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def doctored_env
|
50
|
+
env.dup.tap do |hash|
|
51
|
+
hash["HTTP_ACCEPT"] = "text/html"
|
52
|
+
hash["PATH_INFO"] = path
|
53
|
+
end
|
37
54
|
end
|
38
55
|
|
39
|
-
def
|
40
|
-
|
56
|
+
def path
|
57
|
+
env["PATH_INFO"].gsub(/\.pdf/, "")
|
41
58
|
end
|
42
59
|
end
|
43
60
|
end
|
@@ -2,13 +2,31 @@
|
|
2
2
|
|
3
3
|
module BreezyPDFLite
|
4
4
|
# Rack Middleware for BreezyPDFLite
|
5
|
+
# Determines if the request should be intercepted or not
|
5
6
|
class Middleware
|
6
7
|
def initialize(app, _options = {})
|
7
8
|
@app = app
|
8
9
|
end
|
9
10
|
|
10
11
|
def call(env)
|
11
|
-
|
12
|
+
if intercept?(env)
|
13
|
+
Interceptor.new(@app, env).call
|
14
|
+
else
|
15
|
+
@app.call(env)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
# Is this request applicable?
|
22
|
+
def intercept?(env)
|
23
|
+
env["REQUEST_METHOD"].match?(/get/i) && matching_uri?(env)
|
24
|
+
end
|
25
|
+
|
26
|
+
def matching_uri?(env)
|
27
|
+
BreezyPDFLite.middleware_path_matchers.any? do |regex|
|
28
|
+
env["REQUEST_URI"].match?(regex)
|
29
|
+
end
|
12
30
|
end
|
13
31
|
end
|
14
32
|
end
|
@@ -2,18 +2,19 @@
|
|
2
2
|
|
3
3
|
module BreezyPDFLite
|
4
4
|
# Request conversion of a HTML string to PDF
|
5
|
+
# If the response isn't a 201, raise an error
|
5
6
|
class RenderRequest
|
6
7
|
def initialize(body)
|
7
8
|
@body = body
|
8
9
|
end
|
9
10
|
|
10
|
-
def
|
11
|
-
|
11
|
+
def response
|
12
|
+
@response ||= submit.tap do |resp|
|
13
|
+
raise RenderError, "#{resp.code}: #{resp.body}" if resp.code != "201"
|
14
|
+
end
|
12
15
|
end
|
13
16
|
|
14
17
|
def to_file
|
15
|
-
raise RenderError, "#{response.code}: #{response.body}" if response.code != "201"
|
16
|
-
|
17
18
|
@to_file ||= Tempfile.new(%w[response .pdf]).tap do |file|
|
18
19
|
file.binmode
|
19
20
|
file.write response.body
|
@@ -24,8 +25,8 @@ module BreezyPDFLite
|
|
24
25
|
|
25
26
|
private
|
26
27
|
|
27
|
-
def
|
28
|
-
@
|
28
|
+
def submit
|
29
|
+
client.post("/render/html", @body)
|
29
30
|
end
|
30
31
|
|
31
32
|
def client
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: breezy_pdf_lite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Westendorf
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-01-
|
11
|
+
date: 2020-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,19 +53,19 @@ dependencies:
|
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '5.0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
56
|
+
name: mocha
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- -
|
59
|
+
- - '='
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
61
|
+
version: '1.11'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - '='
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
68
|
+
version: '1.11'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rake
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|