httpthumbnailer 0.3.1 → 1.0.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.
@@ -1,247 +1,70 @@
1
- require 'logger'
1
+ require 'httpthumbnailer/plugin/thumbnailer'
2
+ require 'httpthumbnailer/thumbnail_specs'
2
3
 
3
- class Magick::Image
4
- def render_on_background!(background_color)
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
- class ImageTooLargeError < ArgumentError
29
- def initialize(e)
30
- super("#{e.class.name}: #{e}")
31
- end
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
- def use
57
- raise ImageDestroyedError unless @image
58
- begin
59
- yield @image
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
- end
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
- class InputImage
74
- def initialize(io, methods, options = {})
75
- @options = options
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
- mw = options['max-width']
79
- mh = options['max-height']
80
- if mw and mh
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
- def thumbnail(spec)
115
- begin
116
- ImageHandler.new do
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
- process_image(@image, spec.method, width, height, spec.options).render_on_background!((spec.options['background-color'] or 'white').sub(/^0x/, '#'))
121
- end.use do |image|
122
- format = spec.format == :input ? @image.format : spec.format
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
- end
131
-
132
- def mime_type
133
- @image.mime_type
134
- end
135
-
136
- def destroy!
137
- @image.destroy!
138
- end
139
-
140
- private
141
-
142
- def find_prescale_factor(max_width, max_height, factor = 1)
143
- new_factor = factor * 2
144
- if @image.columns / new_factor > max_width * 2 and @image.rows / new_factor > max_height * 2
145
- find_prescale_factor(max_width, max_height, factor * 2)
146
- else
147
- factor
148
- end
149
- end
150
-
151
- def process_image(image, method, width, height, options)
152
- impl = @methods[method] or raise UnsupportedMethodError.new(method)
153
- copy = image.copy
154
- begin
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
- end
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
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <jmeterTestPlan version="1.2" properties="2.1">
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">/Users/jpastuszek/Documents/httpthumbnailer/load_test</stringProp>
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">localhost</stringProp>
40
- <stringProp name="HTTPSampler.port">3100</stringProp>
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">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
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">50000</stringProp>
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">localhost</stringProp>
117
- <stringProp name="HTTPSampler.port">3100</stringProp>
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">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
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">50000</stringProp>
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">localhost</stringProp>
194
- <stringProp name="HTTPSampler.port">3100</stringProp>
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">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
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">50000</stringProp>
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">localhost</stringProp>
271
- <stringProp name="HTTPSampler.port">3100</stringProp>
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">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
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">50000</stringProp>
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">localhost</stringProp>
348
- <stringProp name="HTTPSampler.port">3100</stringProp>
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">/thumbnail/crop,200,50,PNG/pad,64,64,JPEG/fit,60,60,JPEG</stringProp>
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">50000</stringProp>
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">localhost</stringProp>
425
- <stringProp name="HTTPSampler.port">3100</stringProp>
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">/thumbnail/crop,100,100,PNG/pad,64,64,JPEG/fit,60,60,JPEG</stringProp>
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">8000</stringProp>
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">localhost</stringProp>
502
- <stringProp name="HTTPSampler.port">3100</stringProp>
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">/thumbnail/crop,128,128,PNG/pad,129,310,JPEG/fit,60,60,JPEG</stringProp>
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">50000</stringProp>
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">localhost</stringProp>
579
- <stringProp name="HTTPSampler.port">3100</stringProp>
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">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
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">50000</stringProp>
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