httpthumbnailer 0.3.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +10 -11
- data/Gemfile.lock +75 -51
- data/README.md +184 -54
- data/VERSION +1 -1
- data/bin/httpthumbnailer +76 -133
- data/features/httpthumbnailer.feature +11 -260
- data/features/step_definitions/httpthumbnailer_steps.rb +89 -44
- data/features/support/env.rb +22 -9
- data/features/support/test-large.jpg +0 -0
- data/features/thumbnail.feature +241 -0
- data/features/thumbnails.feature +142 -0
- data/httpthumbnailer.gemspec +39 -40
- data/lib/httpthumbnailer/error_reporter.rb +38 -0
- data/lib/httpthumbnailer/plugin/thumbnailer.rb +396 -0
- data/lib/httpthumbnailer/thumbnail_specs.rb +50 -47
- data/lib/httpthumbnailer/thumbnailer.rb +52 -229
- data/load_test/load_test-cd9679c.csv +10 -0
- data/load_test/load_test-v0.3.1.csv +10 -0
- data/load_test/load_test.jmx +49 -34
- data/load_test/soak_test-ac0c6bcbe5e-broken-libjpeg-tatoos.csv +11 -0
- data/load_test/soak_test-cd9679c.csv +10 -0
- data/load_test/soak_test-f98334a-tatoos.csv +11 -0
- data/load_test/soak_test.jmx +697 -0
- data/spec/image_processing_spec.rb +148 -0
- data/spec/spec_helper.rb +4 -1
- data/spec/thumbnail_specs_spec.rb +18 -5
- metadata +101 -71
- data/lib/httpthumbnailer/multipart_response.rb +0 -45
- data/spec/multipart_response_spec.rb +0 -95
- data/spec/thumbnailer_spec.rb +0 -33
@@ -1,247 +1,70 @@
|
|
1
|
-
require '
|
1
|
+
require 'httpthumbnailer/plugin/thumbnailer'
|
2
|
+
require 'httpthumbnailer/thumbnail_specs'
|
2
3
|
|
3
|
-
class
|
4
|
-
|
5
|
-
Thumbnailer::ImageHandler.new do
|
6
|
-
self
|
7
|
-
end.use do |image|
|
8
|
-
Magick::Image.new(image.columns, image.rows) {
|
9
|
-
self.background_color = background_color
|
10
|
-
}.composite!(image, Magick::CenterGravity, Magick::OverCompositeOp)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class Thumbnailer
|
16
|
-
class UnsupportedMethodError < ArgumentError
|
17
|
-
def initialize(method)
|
18
|
-
super("Thumbnail method '#{method}' is not supported")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
class UnsupportedMediaTypeError < ArgumentError
|
23
|
-
def initialize(e)
|
24
|
-
super("#{e.class.name}: #{e}")
|
25
|
-
end
|
26
|
-
end
|
4
|
+
class Thumbnailer < Controler
|
5
|
+
self.plugin Plugin::Thumbnailer
|
27
6
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
class ImageHandler
|
35
|
-
class ImageDestroyedError < RuntimeError
|
36
|
-
def initialize
|
37
|
-
super("image was already used")
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def initialize
|
42
|
-
@image = yield
|
43
|
-
end
|
44
|
-
|
45
|
-
def get
|
46
|
-
raise ImageDestroyedError unless @image
|
47
|
-
begin
|
48
|
-
yield @image
|
49
|
-
rescue
|
50
|
-
@image.destroy!
|
51
|
-
@image = nil
|
52
|
-
raise
|
53
|
-
end
|
54
|
-
end
|
7
|
+
self.define do
|
8
|
+
on put, 'thumbnail', /(.*)/ do |spec|
|
9
|
+
spec = ThumbnailSpec.from_uri(spec)
|
10
|
+
log.info "thumbnailing image to single spec: #{spec}"
|
55
11
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
ensure
|
61
|
-
@image.destroy!
|
62
|
-
@image = nil
|
12
|
+
opts = {}
|
13
|
+
if settings[:optimization]
|
14
|
+
opts['max-width'] = spec.width if spec.width.is_a? Integer
|
15
|
+
opts['max-height'] = spec.height if spec.height.is_a? Integer
|
63
16
|
end
|
64
|
-
|
65
|
-
|
66
|
-
def destroy!
|
67
|
-
return unless @image
|
68
|
-
@image.destroy!
|
69
|
-
@image = nil
|
70
|
-
end
|
71
|
-
end
|
17
|
+
opts[:limit_memory] = memory_limit
|
72
18
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
@logger = (options[:logger] or Logger.new('/dev/null'))
|
19
|
+
thumbnailer.load(req.body, opts).use do |input_image|
|
20
|
+
log.info "original image loaded: #{input_image.mime_type}"
|
21
|
+
res["X-Input-Image-Content-Type"] = input_image.mime_type
|
77
22
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
mw = mw.to_i
|
82
|
-
mh = mh.to_i
|
83
|
-
@logger.info "Using max size hint of: #{mw}x#{mh}"
|
84
|
-
end
|
85
|
-
|
86
|
-
begin
|
87
|
-
@image = Magick::Image.from_blob(io.read) do |info|
|
88
|
-
if mw and mh
|
89
|
-
define('jpeg', 'size', "#{mw*2}x#{mh*2}")
|
90
|
-
define('jbig', 'size', "#{mw*2}x#{mh*2}")
|
91
|
-
end
|
92
|
-
end.first.strip!
|
93
|
-
@logger.info "Loaded image: #{@image.inspect}"
|
94
|
-
|
95
|
-
if mw and mh
|
96
|
-
f = find_prescale_factor(mw, mh)
|
97
|
-
if f > 1
|
98
|
-
prescale(f)
|
99
|
-
@logger.info "Prescaled image by factor of #{f}: #{@image.inspect}"
|
100
|
-
end
|
23
|
+
log.info "generating thumbnail: #{spec}"
|
24
|
+
input_image.thumbnail(spec) do |image|
|
25
|
+
write 200, image.mime_type, image.data
|
101
26
|
end
|
102
|
-
rescue Magick::ImageMagickError => e
|
103
|
-
raise ImageTooLargeError, e if e.message =~ /cache resources exhausted/
|
104
|
-
raise UnsupportedMediaTypeError, e
|
105
27
|
end
|
106
|
-
|
107
|
-
@methods = methods
|
108
|
-
end
|
109
|
-
|
110
|
-
def prescale(f)
|
111
|
-
@image.sample!(@image.columns / f, @image.rows / f)
|
112
28
|
end
|
113
29
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
width = spec.width == :input ? @image.columns : spec.width
|
118
|
-
height = spec.height == :input ? @image.rows : spec.height
|
30
|
+
on put, 'thumbnails', /(.*)/ do |specs|
|
31
|
+
thumbnail_specs = ThumbnailSpecs.from_uri(specs)
|
32
|
+
log.info "thumbnailing image to multiple specs: #{thumbnail_specs.join(', ')}"
|
119
33
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
yield Thumbnail.new(image, format, spec.options)
|
125
|
-
end
|
126
|
-
rescue Magick::ImageMagickError => e
|
127
|
-
raise ImageTooLargeError, e if e.message =~ /cache resources exhausted/
|
128
|
-
raise
|
34
|
+
opts = {}
|
35
|
+
if settings[:optimization]
|
36
|
+
opts['max-width'] = thumbnail_specs.max_width
|
37
|
+
opts['max-height'] = thumbnail_specs.max_height
|
129
38
|
end
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
impl.call(copy, width, height, options)
|
156
|
-
rescue
|
157
|
-
copy.destroy!
|
158
|
-
raise
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
class Thumbnail
|
164
|
-
def initialize(image, format, options = {})
|
165
|
-
@image = image
|
166
|
-
@format = format
|
167
|
-
@quality = (options['quality'] or default_quality(format))
|
168
|
-
@quality &&= @quality.to_i
|
169
|
-
end
|
170
|
-
|
171
|
-
def data
|
172
|
-
format = @format
|
173
|
-
quality = @quality
|
174
|
-
@image.to_blob do
|
175
|
-
self.format = format
|
176
|
-
self.quality = quality if quality
|
39
|
+
opts[:limit_memory] = memory_limit
|
40
|
+
|
41
|
+
thumbnailer.load(req.body, opts).use do |input_image|
|
42
|
+
log.info "original image loaded: #{input_image.mime_type}"
|
43
|
+
write_preamble 200, "X-Input-Image-Content-Type" => input_image.mime_type
|
44
|
+
|
45
|
+
thumbnail_specs.each do |spec|
|
46
|
+
log.info "generating thumbnail: #{spec}"
|
47
|
+
begin
|
48
|
+
input_image.thumbnail(spec) do |image|
|
49
|
+
write_part image.mime_type, image.data
|
50
|
+
end
|
51
|
+
rescue => error
|
52
|
+
case error
|
53
|
+
when Plugin::Thumbnailer::ImageTooLargeError
|
54
|
+
write_error_part 413, error
|
55
|
+
when Plugin::Thumbnailer::UnsupportedMethodError
|
56
|
+
write_error_part 400, error
|
57
|
+
when Plugin::Thumbnailer::ZeroSizedImageError
|
58
|
+
write_error_part 400, error
|
59
|
+
else
|
60
|
+
log.error "unhandled error while generating multipart response for thumbnail spec: #{spec}", error
|
61
|
+
write_error_part 500, error
|
62
|
+
end
|
63
|
+
end
|
177
64
|
end
|
178
|
-
|
179
|
-
|
180
|
-
def mime_type
|
181
|
-
#@image.mime_type cannot be used since it is raw loaded image
|
182
|
-
#TODO: how do I do it better?
|
183
|
-
mime = case @format
|
184
|
-
when 'JPG' then 'jpeg'
|
185
|
-
else @format.downcase
|
65
|
+
write_epilogue
|
186
66
|
end
|
187
|
-
"image/#{mime}"
|
188
67
|
end
|
189
|
-
|
190
|
-
private
|
191
|
-
|
192
|
-
def default_quality(format)
|
193
|
-
case format
|
194
|
-
when /png/i
|
195
|
-
95 # max zlib compression, adaptive filtering (photo)
|
196
|
-
when /jpeg|jpg/i
|
197
|
-
85
|
198
|
-
else
|
199
|
-
nil
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def initialize(options = {})
|
205
|
-
@methods = {}
|
206
|
-
@options = options
|
207
|
-
@logger = (options[:logger] or Logger.new('/dev/null'))
|
208
|
-
|
209
|
-
@logger.info "Initializing thumbniler"
|
210
|
-
|
211
|
-
set_limit(:area, options[:limit_area]) if options.member?(:limit_area)
|
212
|
-
set_limit(:memory, options[:limit_memory]) if options.member?(:limit_memory)
|
213
|
-
set_limit(:map, options[:limit_map]) if options.member?(:limit_map)
|
214
|
-
set_limit(:disk, options[:limit_disk]) if options.member?(:limit_disk)
|
215
|
-
|
216
|
-
@images = 0
|
217
|
-
Magick.trace_proc = lambda do |which, description, id, method|
|
218
|
-
case which
|
219
|
-
when :c
|
220
|
-
@images += 1
|
221
|
-
when :d
|
222
|
-
@images -= 1
|
223
|
-
end
|
224
|
-
@logger.debug "Image event: #{which}, #{description}, #{id}, #{method}: loaded images: #{images}"
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
def load(io, options = {})
|
229
|
-
ImageHandler.new do
|
230
|
-
InputImage.new(io, @methods, @options.merge(options))
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
def images
|
235
|
-
@images
|
236
|
-
end
|
237
|
-
|
238
|
-
def method(method, &impl)
|
239
|
-
@methods[method] = impl
|
240
|
-
end
|
241
|
-
|
242
|
-
def set_limit(limit, value)
|
243
|
-
old = Magick.limit_resource(limit, value)
|
244
|
-
@logger.info "Changed limit of #{limit} from #{old} to #{value}"
|
245
68
|
end
|
246
69
|
end
|
247
70
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
sampler_label,aggregate_report_count,average,aggregate_report_median,aggregate_report_90%_line,aggregate_report_min,aggregate_report_max,aggregate_report_error%,aggregate_report_rate,aggregate_report_bandwidth
|
2
|
+
tiny,103,82,80,96,71,103,0.0,0.717800047388741,15.11025177882002
|
3
|
+
small,103,65,66,76,55,87,0.0,0.717760031219077,21.124855293828656
|
4
|
+
medium,102,75,73,86,67,105,0.0,0.7177993117571305,22.47959582884709
|
5
|
+
large,102,89,87,102,79,123,0.0,0.717713449387129,36.01533749683362
|
6
|
+
extra large,102,346,344,366,327,381,0.0,0.7165034631000717,15.041674752209218
|
7
|
+
extra large w prescale,102,328,324,349,306,455,0.0,0.716594070535338,17.247243615638613
|
8
|
+
large PNG,102,241,237,257,227,314,0.0,0.7170877799805965,31.675812062365548
|
9
|
+
large PNG w prescale,102,165,162,182,152,214,0.0,0.7173802959545378,36.088292173345806
|
10
|
+
TOTAL,818,174,119,341,55,455,0.0,5.697092950369823,193.23852724401388
|
@@ -0,0 +1,10 @@
|
|
1
|
+
sampler_label,aggregate_report_count,average,aggregate_report_median,aggregate_report_90%_line,aggregate_report_min,aggregate_report_max,aggregate_report_error%,aggregate_report_rate,aggregate_report_bandwidth
|
2
|
+
tiny,70,40,37,40,34,235,0.0,0.6569130716316782,50.04022492820879
|
3
|
+
small,70,46,47,50,43,53,0.0,0.6580864725624946,54.222726428752736
|
4
|
+
medium,70,64,65,68,60,72,0.0,0.6579689438658495,57.46240691501861
|
5
|
+
large,70,108,107,115,96,121,0.0,0.6577834576857298,68.1197722366047
|
6
|
+
extra large,70,390,394,405,66,423,0.014285714285714285,0.65809265944645,35.05713213795502
|
7
|
+
extra large w prescale,69,364,364,370,353,389,0.0,0.6564176719053236,37.55362936838826
|
8
|
+
large PNG,69,304,304,316,273,332,0.0,0.6568863586599518,64.13366268885483
|
9
|
+
large PNG w prescale,69,195,196,202,187,204,0.0,0.6574183467357749,68.18789317070963
|
10
|
+
TOTAL,557,188,118,387,34,423,0.0017953321364452424,5.212768944250512,430.79905008223915
|
data/load_test/load_test.jmx
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<jmeterTestPlan version="1.2" properties="2.
|
2
|
+
<jmeterTestPlan version="1.2" properties="2.4" jmeter="2.9 r1437961">
|
3
3
|
<hashTree>
|
4
4
|
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Plan testów" enabled="true">
|
5
5
|
<stringProp name="TestPlan.comments"></stringProp>
|
@@ -9,7 +9,7 @@
|
|
9
9
|
<collectionProp name="Arguments.arguments">
|
10
10
|
<elementProp name="media" elementType="Argument">
|
11
11
|
<stringProp name="Argument.name">media</stringProp>
|
12
|
-
<stringProp name="Argument.value">/
|
12
|
+
<stringProp name="Argument.value">/home/kazuya/Documents/httpthumbnailer/load_test</stringProp>
|
13
13
|
<stringProp name="Argument.metadata">=</stringProp>
|
14
14
|
</elementProp>
|
15
15
|
</collectionProp>
|
@@ -17,6 +17,21 @@
|
|
17
17
|
<stringProp name="TestPlan.user_define_classpath"></stringProp>
|
18
18
|
</TestPlan>
|
19
19
|
<hashTree>
|
20
|
+
<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
|
21
|
+
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
|
22
|
+
<collectionProp name="Arguments.arguments"/>
|
23
|
+
</elementProp>
|
24
|
+
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
25
|
+
<stringProp name="HTTPSampler.port">3100</stringProp>
|
26
|
+
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
|
27
|
+
<stringProp name="HTTPSampler.response_timeout"></stringProp>
|
28
|
+
<stringProp name="HTTPSampler.protocol"></stringProp>
|
29
|
+
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
30
|
+
<stringProp name="HTTPSampler.path"></stringProp>
|
31
|
+
<stringProp name="HTTPSampler.implementation">Java</stringProp>
|
32
|
+
<stringProp name="HTTPSampler.concurrentPool">4</stringProp>
|
33
|
+
</ConfigTestElement>
|
34
|
+
<hashTree/>
|
20
35
|
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Grupa wątków" enabled="true">
|
21
36
|
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
22
37
|
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
|
@@ -36,13 +51,13 @@
|
|
36
51
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
37
52
|
<collectionProp name="Arguments.arguments"/>
|
38
53
|
</elementProp>
|
39
|
-
<stringProp name="HTTPSampler.domain"
|
40
|
-
<stringProp name="HTTPSampler.port"
|
54
|
+
<stringProp name="HTTPSampler.domain"></stringProp>
|
55
|
+
<stringProp name="HTTPSampler.port"></stringProp>
|
41
56
|
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
42
57
|
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
43
58
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
44
59
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
45
|
-
<stringProp name="HTTPSampler.path">/
|
60
|
+
<stringProp name="HTTPSampler.path">/thumbnails/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
|
46
61
|
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
47
62
|
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
48
63
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
@@ -72,7 +87,7 @@
|
|
72
87
|
<hashTree/>
|
73
88
|
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
74
89
|
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
75
|
-
<stringProp name="SizeAssertion.size">
|
90
|
+
<stringProp name="SizeAssertion.size">20000</stringProp>
|
76
91
|
<intProp name="SizeAssertion.operator">5</intProp>
|
77
92
|
</SizeAssertion>
|
78
93
|
<hashTree/>
|
@@ -113,13 +128,13 @@
|
|
113
128
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
114
129
|
<collectionProp name="Arguments.arguments"/>
|
115
130
|
</elementProp>
|
116
|
-
<stringProp name="HTTPSampler.domain"
|
117
|
-
<stringProp name="HTTPSampler.port"
|
131
|
+
<stringProp name="HTTPSampler.domain"></stringProp>
|
132
|
+
<stringProp name="HTTPSampler.port"></stringProp>
|
118
133
|
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
119
134
|
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
120
135
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
121
136
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
122
|
-
<stringProp name="HTTPSampler.path">/
|
137
|
+
<stringProp name="HTTPSampler.path">/thumbnails/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
|
123
138
|
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
124
139
|
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
125
140
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
@@ -149,7 +164,7 @@
|
|
149
164
|
<hashTree/>
|
150
165
|
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
151
166
|
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
152
|
-
<stringProp name="SizeAssertion.size">
|
167
|
+
<stringProp name="SizeAssertion.size">20000</stringProp>
|
153
168
|
<intProp name="SizeAssertion.operator">5</intProp>
|
154
169
|
</SizeAssertion>
|
155
170
|
<hashTree/>
|
@@ -190,13 +205,13 @@
|
|
190
205
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
191
206
|
<collectionProp name="Arguments.arguments"/>
|
192
207
|
</elementProp>
|
193
|
-
<stringProp name="HTTPSampler.domain"
|
194
|
-
<stringProp name="HTTPSampler.port"
|
208
|
+
<stringProp name="HTTPSampler.domain"></stringProp>
|
209
|
+
<stringProp name="HTTPSampler.port"></stringProp>
|
195
210
|
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
196
211
|
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
197
212
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
198
213
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
199
|
-
<stringProp name="HTTPSampler.path">/
|
214
|
+
<stringProp name="HTTPSampler.path">/thumbnails/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
|
200
215
|
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
201
216
|
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
202
217
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
@@ -226,7 +241,7 @@
|
|
226
241
|
<hashTree/>
|
227
242
|
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
228
243
|
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
229
|
-
<stringProp name="SizeAssertion.size">
|
244
|
+
<stringProp name="SizeAssertion.size">20000</stringProp>
|
230
245
|
<intProp name="SizeAssertion.operator">5</intProp>
|
231
246
|
</SizeAssertion>
|
232
247
|
<hashTree/>
|
@@ -267,13 +282,13 @@
|
|
267
282
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
268
283
|
<collectionProp name="Arguments.arguments"/>
|
269
284
|
</elementProp>
|
270
|
-
<stringProp name="HTTPSampler.domain"
|
271
|
-
<stringProp name="HTTPSampler.port"
|
285
|
+
<stringProp name="HTTPSampler.domain"></stringProp>
|
286
|
+
<stringProp name="HTTPSampler.port"></stringProp>
|
272
287
|
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
273
288
|
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
274
289
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
275
290
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
276
|
-
<stringProp name="HTTPSampler.path">/
|
291
|
+
<stringProp name="HTTPSampler.path">/thumbnails/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
|
277
292
|
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
278
293
|
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
279
294
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
@@ -303,7 +318,7 @@
|
|
303
318
|
<hashTree/>
|
304
319
|
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
305
320
|
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
306
|
-
<stringProp name="SizeAssertion.size">
|
321
|
+
<stringProp name="SizeAssertion.size">20000</stringProp>
|
307
322
|
<intProp name="SizeAssertion.operator">5</intProp>
|
308
323
|
</SizeAssertion>
|
309
324
|
<hashTree/>
|
@@ -344,13 +359,13 @@
|
|
344
359
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
345
360
|
<collectionProp name="Arguments.arguments"/>
|
346
361
|
</elementProp>
|
347
|
-
<stringProp name="HTTPSampler.domain"
|
348
|
-
<stringProp name="HTTPSampler.port"
|
362
|
+
<stringProp name="HTTPSampler.domain"></stringProp>
|
363
|
+
<stringProp name="HTTPSampler.port"></stringProp>
|
349
364
|
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
350
365
|
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
351
366
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
352
367
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
353
|
-
<stringProp name="HTTPSampler.path">/
|
368
|
+
<stringProp name="HTTPSampler.path">/thumbnails/crop,200,50,PNG/pad,64,64,JPEG/fit,60,60,JPEG</stringProp>
|
354
369
|
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
355
370
|
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
356
371
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
@@ -380,7 +395,7 @@
|
|
380
395
|
<hashTree/>
|
381
396
|
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
382
397
|
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
383
|
-
<stringProp name="SizeAssertion.size">
|
398
|
+
<stringProp name="SizeAssertion.size">20000</stringProp>
|
384
399
|
<intProp name="SizeAssertion.operator">5</intProp>
|
385
400
|
</SizeAssertion>
|
386
401
|
<hashTree/>
|
@@ -421,13 +436,13 @@
|
|
421
436
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
422
437
|
<collectionProp name="Arguments.arguments"/>
|
423
438
|
</elementProp>
|
424
|
-
<stringProp name="HTTPSampler.domain"
|
425
|
-
<stringProp name="HTTPSampler.port"
|
439
|
+
<stringProp name="HTTPSampler.domain"></stringProp>
|
440
|
+
<stringProp name="HTTPSampler.port"></stringProp>
|
426
441
|
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
427
442
|
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
428
443
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
429
444
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
430
|
-
<stringProp name="HTTPSampler.path">/
|
445
|
+
<stringProp name="HTTPSampler.path">/thumbnails/crop,100,100,PNG/pad,64,64,JPEG/fit,60,60,JPEG</stringProp>
|
431
446
|
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
432
447
|
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
433
448
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
@@ -457,7 +472,7 @@
|
|
457
472
|
<hashTree/>
|
458
473
|
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
459
474
|
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
460
|
-
<stringProp name="SizeAssertion.size">
|
475
|
+
<stringProp name="SizeAssertion.size">4000</stringProp>
|
461
476
|
<intProp name="SizeAssertion.operator">5</intProp>
|
462
477
|
</SizeAssertion>
|
463
478
|
<hashTree/>
|
@@ -498,13 +513,13 @@
|
|
498
513
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
499
514
|
<collectionProp name="Arguments.arguments"/>
|
500
515
|
</elementProp>
|
501
|
-
<stringProp name="HTTPSampler.domain"
|
502
|
-
<stringProp name="HTTPSampler.port"
|
516
|
+
<stringProp name="HTTPSampler.domain"></stringProp>
|
517
|
+
<stringProp name="HTTPSampler.port"></stringProp>
|
503
518
|
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
504
519
|
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
505
520
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
506
521
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
507
|
-
<stringProp name="HTTPSampler.path">/
|
522
|
+
<stringProp name="HTTPSampler.path">/thumbnails/crop,128,128,PNG/pad,129,310,JPEG/fit,60,60,JPEG</stringProp>
|
508
523
|
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
509
524
|
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
510
525
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
@@ -534,7 +549,7 @@
|
|
534
549
|
<hashTree/>
|
535
550
|
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
536
551
|
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
537
|
-
<stringProp name="SizeAssertion.size">
|
552
|
+
<stringProp name="SizeAssertion.size">20000</stringProp>
|
538
553
|
<intProp name="SizeAssertion.operator">5</intProp>
|
539
554
|
</SizeAssertion>
|
540
555
|
<hashTree/>
|
@@ -575,13 +590,13 @@
|
|
575
590
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
576
591
|
<collectionProp name="Arguments.arguments"/>
|
577
592
|
</elementProp>
|
578
|
-
<stringProp name="HTTPSampler.domain"
|
579
|
-
<stringProp name="HTTPSampler.port"
|
593
|
+
<stringProp name="HTTPSampler.domain"></stringProp>
|
594
|
+
<stringProp name="HTTPSampler.port"></stringProp>
|
580
595
|
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
581
596
|
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
582
597
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
583
598
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
584
|
-
<stringProp name="HTTPSampler.path">/
|
599
|
+
<stringProp name="HTTPSampler.path">/thumbnails/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
|
585
600
|
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
586
601
|
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
587
602
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
@@ -611,7 +626,7 @@
|
|
611
626
|
<hashTree/>
|
612
627
|
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
613
628
|
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
614
|
-
<stringProp name="SizeAssertion.size">
|
629
|
+
<stringProp name="SizeAssertion.size">2000</stringProp>
|
615
630
|
<intProp name="SizeAssertion.operator">5</intProp>
|
616
631
|
</SizeAssertion>
|
617
632
|
<hashTree/>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
sampler_label,aggregate_report_count,average,aggregate_report_median,aggregate_report_90%_line,aggregate_report_min,aggregate_report_max,aggregate_report_error%,aggregate_report_rate,aggregate_report_bandwidth
|
2
|
+
crop 100x100 JPEG,9434,163,82,218,15,24355,1.0599957600169599E-4,1.7563116635924076,7.3452512218341335
|
3
|
+
crop 800x600 JPEG,9434,488,401,962,16,5910,1.0599957600169599E-4,1.7563185299796351,149.11867662526254
|
4
|
+
crop 300x400 PNG,9434,478,443,737,14,1597,1.0599957600169599E-4,1.7561867701093066,199.61794605857165
|
5
|
+
pad 100x100 JPEG,9434,71,54,126,9,2378,1.0599957600169599E-4,1.7562374446428708,5.336457821295207
|
6
|
+
fit 100x100 JPEG,9434,69,53,123,6,1162,1.0599957600169599E-4,1.7562184822169382,5.510921170998325
|
7
|
+
limit 100x100 JPEG,9434,68,53,119,7,1239,1.0599957600169599E-4,1.7561969047820718,5.509383664985987
|
8
|
+
limit 500x500 JPEG,9434,382,323,701,7,1612,1.0599957600169599E-4,1.7560298610700056,69.28159162507869
|
9
|
+
limit 1500x1500 JPEG,9434,625,190,1582,7,10883,1.0599957600169599E-4,1.7556814925042041,315.8534505970671
|
10
|
+
multipart,9434,2746,1331,5595,7,59639,1.0599957600169599E-4,1.752705741811247,755.3157395719443
|
11
|
+
TOTAL,84906,566,160,1114,6,59639,1.0599957600169599E-4,15.770876685474601,1511.1397532008416
|
@@ -0,0 +1,10 @@
|
|
1
|
+
sampler_label,aggregate_report_count,average,aggregate_report_median,aggregate_report_90%_line,aggregate_report_min,aggregate_report_max,aggregate_report_error%,aggregate_report_rate,aggregate_report_bandwidth
|
2
|
+
crop 100x100 JPEG,21302,83,76,121,7,526,0.0,5.616822094767196,20.108323048878113
|
3
|
+
crop 800x600 JPEG,21302,189,155,257,29,1453,0.0,5.616656225412957,281.666478061634
|
4
|
+
crop 300x400 PNG,21300,779,724,1303,83,2521,9.389671361502347E-5,5.616171832709798,670.9580779119093
|
5
|
+
pad 100x100 JPEG,21297,77,72,116,7,399,0.0,5.616655915277294,16.87093942473386
|
6
|
+
fit 100x100 JPEG,21296,63,57,98,6,332,0.0,5.616451434415746,17.080941226295707
|
7
|
+
limit 100x100 JPEG,21295,63,57,99,6,382,0.0,5.61638026072453,17.053713965378755
|
8
|
+
limit 500x500 JPEG,21295,77,24,193,6,1101,0.0,5.6162750922485385,98.95595626808739
|
9
|
+
limit 1500x1500 JPEG,21294,78,24,97,5,1606,0.0,5.616492770090949,201.99272878375396
|
10
|
+
TOTAL,170381,176,73,531,5,2521,1.1738398060816641E-5,44.920480038344856,1324.468317085056
|
@@ -0,0 +1,11 @@
|
|
1
|
+
sampler_label,aggregate_report_count,average,aggregate_report_median,aggregate_report_90%_line,aggregate_report_min,aggregate_report_max,aggregate_report_error%,aggregate_report_rate,aggregate_report_bandwidth
|
2
|
+
crop 100x100 JPEG,9435,269,179,369,25,18054,1.0598834128245893E-4,1.4530576892393956,6.075741393665208
|
3
|
+
crop 800x600 JPEG,9435,510,411,1049,16,5303,1.0598834128245893E-4,1.452948715915186,123.36523433499724
|
4
|
+
crop 300x400 PNG,9435,796,756,1223,18,3270,1.0598834128245893E-4,1.4527849510264421,164.89592090446297
|
5
|
+
pad 100x100 JPEG,9435,192,166,308,18,2416,1.0598834128245893E-4,1.4527661606954925,4.414348853769809
|
6
|
+
fit 100x100 JPEG,9435,170,143,295,12,2856,1.0598834128245893E-4,1.4527753321058268,4.558875497086674
|
7
|
+
limit 100x100 JPEG,9435,170,142,292,6,1823,1.0598834128245893E-4,1.4527587789127483,4.557606634765511
|
8
|
+
limit 500x500 JPEG,9435,439,344,857,6,4214,1.0598834128245893E-4,1.45265879669967,57.31115234766828
|
9
|
+
limit 1500x1500 JPEG,9435,562,203,1453,5,9851,1.0598834128245893E-4,1.4525192472270894,261.3371834603011
|
10
|
+
multipart,9435,3061,2065,5523,6,39289,1.0598834128245893E-4,1.452267946899481,625.640618812998
|
11
|
+
TOTAL,84915,685,250,1498,5,39289,1.0598834128245893E-4,13.067971611961191,1251.7379056145878
|