httpthumbnailer 0.3.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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