httpthumbnailer 0.0.13 → 0.0.14
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.
- data/VERSION +1 -1
- data/bin/httpthumbnailer +10 -1
- data/features/httpthumbnailer.feature +46 -1
- data/features/step_definitions/httpthumbnailer_steps.rb +11 -0
- data/features/support/env.rb +1 -1
- data/httpthumbnailer.gemspec +13 -2
- data/lib/httpthumbnailer/thumbnail_specs.rb +14 -0
- data/lib/httpthumbnailer/thumbnailer.rb +57 -5
- data/load_test/extralarge.jpg +0 -0
- data/load_test/large.jpg +0 -0
- data/load_test/large.png +0 -0
- data/load_test/load_test.jmx +718 -0
- data/load_test/medium.jpg +0 -0
- data/load_test/small.jpg +0 -0
- data/load_test/tiny.jpg +0 -0
- data/load_test/v0.0.13-loading.csv +7 -0
- data/load_test/v0.0.13.csv +7 -0
- data/load_test/v0.0.14-no-optimization.csv +10 -0
- data/load_test/v0.0.14.csv +10 -0
- metadata +15 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.14
|
data/bin/httpthumbnailer
CHANGED
@@ -8,6 +8,7 @@ options = CLI.new do
|
|
8
8
|
switch :no_bind, :description => "Do not bind to TCP socket - useful with -s fastcgi option"
|
9
9
|
switch :no_logging, :description => "Disable logging"
|
10
10
|
switch :debug, :description => "Enable debugging"
|
11
|
+
switch :no_optimization, :description => "Disable size hinting and related optimization (loading, prescaling)"
|
11
12
|
option :bind, :short => :b, :default => IP.new('127.0.0.1'), :cast => IP, :description => "HTTP server bind address - use 0.0.0.0 to bind to all interfaces"
|
12
13
|
option :port, :short => :p, :default => 3100, :cast => Integer, :description => "HTTP server TCP port"
|
13
14
|
option :server, :short => :s, :default => 'mongrel', :description => "Rack server handler like thin, mongrel, webrick, fastcgi etc."
|
@@ -39,6 +40,7 @@ sinatra.set :lock, true
|
|
39
40
|
sinatra.set :boundary, "thumnail image data"
|
40
41
|
sinatra.set :logging, (not options.no_logging)
|
41
42
|
sinatra.set :debug, options.debug
|
43
|
+
sinatra.set :optimization, (not options.no_optimization)
|
42
44
|
sinatra.set :limit_memory, options.limit_memory
|
43
45
|
sinatra.set :limit_map, options.limit_map
|
44
46
|
sinatra.set :limit_disk, options.limit_disk
|
@@ -90,7 +92,14 @@ end
|
|
90
92
|
|
91
93
|
sinatra.put %r{^/thumbnail/(.*)} do |specs|
|
92
94
|
thumbnail_specs = ThumbnailSpecs.from_uri(specs)
|
93
|
-
|
95
|
+
|
96
|
+
opts = {}
|
97
|
+
if settings.optimization
|
98
|
+
biggest_spec = thumbnail_specs.biggest_spec
|
99
|
+
opts.merge!({'max-width' => biggest_spec.width, 'max-height' => biggest_spec.height})
|
100
|
+
end
|
101
|
+
|
102
|
+
$thumbnailer.load(request.body, opts) do |original_image_handler|
|
94
103
|
status 200
|
95
104
|
headers "Content-Type" => "multipart/mixed; boundary=\"#{settings.boundary}\""
|
96
105
|
|
@@ -141,9 +141,20 @@ Feature: Generating set of thumbnails with single PUT request
|
|
141
141
|
And third part mime type will be image/jpeg
|
142
142
|
And there will be no leaked images
|
143
143
|
|
144
|
+
Scenario: Handing of large image data - possible thanks to loading size optimization
|
145
|
+
Given test-large.jpg file content as request body
|
146
|
+
When I do PUT request http://localhost:3100/thumbnail/crop,16,16,PNG/crop,32,32,JPEG
|
147
|
+
Then response status will be 200
|
148
|
+
And I will get multipart response
|
149
|
+
Then first part will contain PNG image of size 16x16
|
150
|
+
And first part mime type will be image/png
|
151
|
+
Then second part will contain JPEG image of size 32x32
|
152
|
+
And second part mime type will be image/jpeg
|
153
|
+
And there will be no leaked images
|
154
|
+
|
144
155
|
Scenario: Memory limits exhausted while loading
|
145
156
|
Given test-large.jpg file content as request body
|
146
|
-
When I do PUT request http://localhost:3100/thumbnail/crop,
|
157
|
+
When I do PUT request http://localhost:3100/thumbnail/crop,7000,7000,PNG
|
147
158
|
Then response status will be 413
|
148
159
|
And response content type will be text/plain
|
149
160
|
And response body will be CRLF endend lines like
|
@@ -168,3 +179,37 @@ Feature: Generating set of thumbnails with single PUT request
|
|
168
179
|
And third part mime type will be image/jpeg
|
169
180
|
And there will be no leaked images
|
170
181
|
|
182
|
+
Scenario: Quality option - JPEG
|
183
|
+
Given test.jpg file content as request body
|
184
|
+
When I do PUT request http://localhost:3100/thumbnail/crop,32,32,JPEG,quality:10/crop,32,32,JPG,quality:80/crop,32,32,JPEG,quality:90
|
185
|
+
Then response status will be 200
|
186
|
+
And I will get multipart response
|
187
|
+
And first part mime type will be image/jpeg
|
188
|
+
And second part mime type will be image/jpeg
|
189
|
+
And third part mime type will be image/jpeg
|
190
|
+
Then first part will contain body smaller than second part
|
191
|
+
Then second part will contain body smaller than third part
|
192
|
+
|
193
|
+
Scenario: Quality option - JPEG - default 85
|
194
|
+
Given test.jpg file content as request body
|
195
|
+
When I do PUT request http://localhost:3100/thumbnail/crop,32,32,JPEG,quality:84/crop,32,32,JPG/crop,32,32,JPEG,quality:86
|
196
|
+
Then response status will be 200
|
197
|
+
And I will get multipart response
|
198
|
+
And first part mime type will be image/jpeg
|
199
|
+
And second part mime type will be image/jpeg
|
200
|
+
And third part mime type will be image/jpeg
|
201
|
+
Then first part will contain body smaller than second part
|
202
|
+
Then second part will contain body smaller than third part
|
203
|
+
|
204
|
+
Scenario: Quality option - PNG (XY where X - zlib compresion level, Y - filter)
|
205
|
+
Given test.jpg file content as request body
|
206
|
+
When I do PUT request http://localhost:3100/thumbnail/crop,64,64,PNG,quality:90/crop,64,64,PNG,quality:50/crop,64,64,PNG,quality:10
|
207
|
+
Then response status will be 200
|
208
|
+
And I will get multipart response
|
209
|
+
And first part mime type will be image/png
|
210
|
+
And second part mime type will be image/png
|
211
|
+
And third part mime type will be image/png
|
212
|
+
Then first part will contain body smaller than second part
|
213
|
+
Then second part will contain body smaller than third part
|
214
|
+
And there will be no leaked images
|
215
|
+
|
@@ -76,6 +76,17 @@ Then /(.*) part will contain (.*) image of size (.*)x(.*)/ do |part, format, wid
|
|
76
76
|
@image.rows.should == height.to_i
|
77
77
|
end
|
78
78
|
|
79
|
+
Then /(.*) part will contain body of size within (.*) of (.*)/ do |part, margin, size|
|
80
|
+
data = @response_multipart.part[part_no(part)].body
|
81
|
+
data.length.should be_within(margin.to_i).of(size.to_i)
|
82
|
+
end
|
83
|
+
|
84
|
+
Then /(.*) part will contain body smaller than (.*) part/ do |part, big_part|
|
85
|
+
data = @response_multipart.part[part_no(part)].body
|
86
|
+
data_big = @response_multipart.part[part_no(big_part)].body
|
87
|
+
data.length.should < data_big.length
|
88
|
+
end
|
89
|
+
|
79
90
|
And /(.*) part body will be saved as (.*) for human inspection/ do |part, file|
|
80
91
|
data = @response_multipart.part[part_no(part)].body
|
81
92
|
(support_dir + file).open('w'){|f| f.write(data)}
|
data/features/support/env.rb
CHANGED
data/httpthumbnailer.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "httpthumbnailer"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.14"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jakub Pastuszek"]
|
12
|
-
s.date = "2011-12-
|
12
|
+
s.date = "2011-12-02"
|
13
13
|
s.description = "Provides HTTP API for thumbnailing images"
|
14
14
|
s.email = "jpastuszek@gmail.com"
|
15
15
|
s.executables = ["httpthumbnailer"]
|
@@ -38,6 +38,17 @@ Gem::Specification.new do |s|
|
|
38
38
|
"lib/httpthumbnailer/multipart_response.rb",
|
39
39
|
"lib/httpthumbnailer/thumbnail_specs.rb",
|
40
40
|
"lib/httpthumbnailer/thumbnailer.rb",
|
41
|
+
"load_test/extralarge.jpg",
|
42
|
+
"load_test/large.jpg",
|
43
|
+
"load_test/large.png",
|
44
|
+
"load_test/load_test.jmx",
|
45
|
+
"load_test/medium.jpg",
|
46
|
+
"load_test/small.jpg",
|
47
|
+
"load_test/tiny.jpg",
|
48
|
+
"load_test/v0.0.13-loading.csv",
|
49
|
+
"load_test/v0.0.13.csv",
|
50
|
+
"load_test/v0.0.14-no-optimization.csv",
|
51
|
+
"load_test/v0.0.14.csv",
|
41
52
|
"spec/multipart_response_spec.rb",
|
42
53
|
"spec/spec_helper.rb",
|
43
54
|
"spec/thumbnail_specs_spec.rb",
|
@@ -24,5 +24,19 @@ class ThumbnailSpecs < Array
|
|
24
24
|
end
|
25
25
|
ts
|
26
26
|
end
|
27
|
+
|
28
|
+
def biggest_spec
|
29
|
+
max_field = -1
|
30
|
+
max_spec = nil
|
31
|
+
each do |spec|
|
32
|
+
field = spec.width * spec.height
|
33
|
+
if max_field < field
|
34
|
+
max_field = field
|
35
|
+
max_spec = spec
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
max_spec
|
40
|
+
end
|
27
41
|
end
|
28
42
|
|
@@ -89,22 +89,54 @@ class Thumbnailer
|
|
89
89
|
@options = options
|
90
90
|
@logger = (options[:logger] or Logger.new('/dev/null'))
|
91
91
|
|
92
|
+
|
93
|
+
mw = options['max-width']
|
94
|
+
mh = options['max-height']
|
95
|
+
if mw and mh
|
96
|
+
mw = mw.to_i
|
97
|
+
mh = mh.to_i
|
98
|
+
@logger.info "Using max size hint of: #{mw}x#{mh}"
|
99
|
+
end
|
100
|
+
|
92
101
|
begin
|
93
|
-
@image = Magick::Image.from_blob(io.read)
|
102
|
+
@image = Magick::Image.from_blob(io.read) do |info|
|
103
|
+
if mw and mh
|
104
|
+
define('jpeg', 'size', "#{mw*2}x#{mh*2}")
|
105
|
+
define('jbig', 'size', "#{mw*2}x#{mh*2}")
|
106
|
+
end
|
107
|
+
end.first.strip!
|
108
|
+
@logger.info "Loaded image: #{@image.inspect}"
|
109
|
+
|
110
|
+
if mw and mh
|
111
|
+
f = find_prescale_factor(mw, mh)
|
112
|
+
if f > 1
|
113
|
+
prescale(f)
|
114
|
+
@logger.info "Prescaled image by factor of #{f}: #{@image.inspect}"
|
115
|
+
end
|
116
|
+
end
|
94
117
|
rescue Magick::ImageMagickError => e
|
95
118
|
raise ImageTooLargeError, e if e.message =~ /cache resources exhausted/
|
96
119
|
raise UnsupportedMediaTypeError, e
|
97
120
|
end
|
121
|
+
|
98
122
|
@methods = methods
|
99
123
|
end
|
100
124
|
|
125
|
+
def prescale(f)
|
126
|
+
@image.sample!(@image.columns / f, @image.rows / f)
|
127
|
+
end
|
128
|
+
|
101
129
|
def thumbnail(spec)
|
102
130
|
begin
|
131
|
+
quality = (spec.options['quality'] or default_quality(spec.format))
|
132
|
+
quality = quality.to_i if quality
|
133
|
+
|
103
134
|
ImageHandler.new do
|
104
135
|
process_image(@image, spec).render_on_background!((spec.options['background-color'] or 'white').sub(/^0x/, '#'))
|
105
136
|
end.use do |thumb|
|
106
|
-
thumb.to_blob do
|
107
|
-
|
137
|
+
thumb.to_blob do
|
138
|
+
self.format = spec.format
|
139
|
+
self.quality = quality if quality
|
108
140
|
end
|
109
141
|
end
|
110
142
|
rescue Magick::ImageMagickError => e
|
@@ -119,6 +151,26 @@ class Thumbnailer
|
|
119
151
|
|
120
152
|
private
|
121
153
|
|
154
|
+
def default_quality(format)
|
155
|
+
case format
|
156
|
+
when /png/i
|
157
|
+
95 # max zlib compression, adaptive filtering (photo)
|
158
|
+
when /jpeg|jpg/i
|
159
|
+
85
|
160
|
+
else
|
161
|
+
nil
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def find_prescale_factor(max_width, max_height, factor = 1)
|
166
|
+
new_factor = factor * 2
|
167
|
+
if @image.columns / new_factor > max_width * 2 and @image.rows / new_factor > max_height * 2
|
168
|
+
find_prescale_factor(max_width, max_height, factor * 2)
|
169
|
+
else
|
170
|
+
factor
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
122
174
|
def process_image(image, spec)
|
123
175
|
impl = @methods[spec.method] or raise UnsupportedMethodError.new(spec.method)
|
124
176
|
copy = image.copy
|
@@ -155,9 +207,9 @@ class Thumbnailer
|
|
155
207
|
end
|
156
208
|
end
|
157
209
|
|
158
|
-
def load(io)
|
210
|
+
def load(io, options = {})
|
159
211
|
h = ImageHandler.new do
|
160
|
-
OriginalImage.new(io, @methods, @options)
|
212
|
+
OriginalImage.new(io, @methods, @options.merge(options))
|
161
213
|
end
|
162
214
|
|
163
215
|
begin
|
Binary file
|
data/load_test/large.jpg
ADDED
Binary file
|
data/load_test/large.png
ADDED
Binary file
|
@@ -0,0 +1,718 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<jmeterTestPlan version="1.2" properties="2.1">
|
3
|
+
<hashTree>
|
4
|
+
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Plan testów" enabled="true">
|
5
|
+
<stringProp name="TestPlan.comments"></stringProp>
|
6
|
+
<boolProp name="TestPlan.functional_mode">false</boolProp>
|
7
|
+
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
|
8
|
+
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
9
|
+
<collectionProp name="Arguments.arguments">
|
10
|
+
<elementProp name="media" elementType="Argument">
|
11
|
+
<stringProp name="Argument.name">media</stringProp>
|
12
|
+
<stringProp name="Argument.value">/Users/jpastuszek/Documents/httpthumbnailer/load_test</stringProp>
|
13
|
+
<stringProp name="Argument.metadata">=</stringProp>
|
14
|
+
</elementProp>
|
15
|
+
</collectionProp>
|
16
|
+
</elementProp>
|
17
|
+
<stringProp name="TestPlan.user_define_classpath"></stringProp>
|
18
|
+
</TestPlan>
|
19
|
+
<hashTree>
|
20
|
+
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Grupa wątków" enabled="true">
|
21
|
+
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
22
|
+
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
|
23
|
+
<boolProp name="LoopController.continue_forever">false</boolProp>
|
24
|
+
<intProp name="LoopController.loops">-1</intProp>
|
25
|
+
</elementProp>
|
26
|
+
<stringProp name="ThreadGroup.num_threads">1</stringProp>
|
27
|
+
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
|
28
|
+
<longProp name="ThreadGroup.start_time">1322835045000</longProp>
|
29
|
+
<longProp name="ThreadGroup.end_time">1322835045000</longProp>
|
30
|
+
<boolProp name="ThreadGroup.scheduler">false</boolProp>
|
31
|
+
<stringProp name="ThreadGroup.duration"></stringProp>
|
32
|
+
<stringProp name="ThreadGroup.delay"></stringProp>
|
33
|
+
</ThreadGroup>
|
34
|
+
<hashTree>
|
35
|
+
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="tiny" enabled="true">
|
36
|
+
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
37
|
+
<collectionProp name="Arguments.arguments"/>
|
38
|
+
</elementProp>
|
39
|
+
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
40
|
+
<stringProp name="HTTPSampler.port">3100</stringProp>
|
41
|
+
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
42
|
+
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
43
|
+
<stringProp name="HTTPSampler.protocol"></stringProp>
|
44
|
+
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
45
|
+
<stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
|
46
|
+
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
47
|
+
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
48
|
+
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
49
|
+
<boolProp name="HTTPSampler.use_keepalive">false</boolProp>
|
50
|
+
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
51
|
+
<elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
|
52
|
+
<collectionProp name="HTTPFileArgs.files">
|
53
|
+
<elementProp name="${media}/tiny.jpg" elementType="HTTPFileArg">
|
54
|
+
<stringProp name="File.path">${media}/tiny.jpg</stringProp>
|
55
|
+
<stringProp name="File.paramname"></stringProp>
|
56
|
+
<stringProp name="File.mimetype">image/jpeg</stringProp>
|
57
|
+
</elementProp>
|
58
|
+
</collectionProp>
|
59
|
+
</elementProp>
|
60
|
+
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
61
|
+
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
62
|
+
</HTTPSamplerProxy>
|
63
|
+
<hashTree>
|
64
|
+
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
|
65
|
+
<collectionProp name="Asserion.test_strings">
|
66
|
+
<stringProp name="693218829">test/plain</stringProp>
|
67
|
+
</collectionProp>
|
68
|
+
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
69
|
+
<boolProp name="Assertion.assume_success">false</boolProp>
|
70
|
+
<intProp name="Assertion.test_type">6</intProp>
|
71
|
+
</ResponseAssertion>
|
72
|
+
<hashTree/>
|
73
|
+
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
74
|
+
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
75
|
+
<stringProp name="SizeAssertion.size">50000</stringProp>
|
76
|
+
<intProp name="SizeAssertion.operator">5</intProp>
|
77
|
+
</SizeAssertion>
|
78
|
+
<hashTree/>
|
79
|
+
<ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
|
80
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
81
|
+
<objProp>
|
82
|
+
<name>saveConfig</name>
|
83
|
+
<value class="SampleSaveConfiguration">
|
84
|
+
<time>true</time>
|
85
|
+
<latency>true</latency>
|
86
|
+
<timestamp>true</timestamp>
|
87
|
+
<success>true</success>
|
88
|
+
<label>true</label>
|
89
|
+
<code>true</code>
|
90
|
+
<message>true</message>
|
91
|
+
<threadName>true</threadName>
|
92
|
+
<dataType>true</dataType>
|
93
|
+
<encoding>false</encoding>
|
94
|
+
<assertions>true</assertions>
|
95
|
+
<subresults>true</subresults>
|
96
|
+
<responseData>false</responseData>
|
97
|
+
<samplerData>false</samplerData>
|
98
|
+
<xml>true</xml>
|
99
|
+
<fieldNames>false</fieldNames>
|
100
|
+
<responseHeaders>false</responseHeaders>
|
101
|
+
<requestHeaders>false</requestHeaders>
|
102
|
+
<responseDataOnError>false</responseDataOnError>
|
103
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
104
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
105
|
+
<bytes>true</bytes>
|
106
|
+
</value>
|
107
|
+
</objProp>
|
108
|
+
<stringProp name="filename"></stringProp>
|
109
|
+
</ResultCollector>
|
110
|
+
<hashTree/>
|
111
|
+
</hashTree>
|
112
|
+
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="small" enabled="true">
|
113
|
+
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
114
|
+
<collectionProp name="Arguments.arguments"/>
|
115
|
+
</elementProp>
|
116
|
+
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
117
|
+
<stringProp name="HTTPSampler.port">3100</stringProp>
|
118
|
+
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
119
|
+
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
120
|
+
<stringProp name="HTTPSampler.protocol"></stringProp>
|
121
|
+
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
122
|
+
<stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
|
123
|
+
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
124
|
+
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
125
|
+
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
126
|
+
<boolProp name="HTTPSampler.use_keepalive">false</boolProp>
|
127
|
+
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
128
|
+
<elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
|
129
|
+
<collectionProp name="HTTPFileArgs.files">
|
130
|
+
<elementProp name="${media}/small.jpg" elementType="HTTPFileArg">
|
131
|
+
<stringProp name="File.path">${media}/small.jpg</stringProp>
|
132
|
+
<stringProp name="File.paramname"></stringProp>
|
133
|
+
<stringProp name="File.mimetype">image/jpeg</stringProp>
|
134
|
+
</elementProp>
|
135
|
+
</collectionProp>
|
136
|
+
</elementProp>
|
137
|
+
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
138
|
+
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
139
|
+
</HTTPSamplerProxy>
|
140
|
+
<hashTree>
|
141
|
+
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
|
142
|
+
<collectionProp name="Asserion.test_strings">
|
143
|
+
<stringProp name="693218829">test/plain</stringProp>
|
144
|
+
</collectionProp>
|
145
|
+
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
146
|
+
<boolProp name="Assertion.assume_success">false</boolProp>
|
147
|
+
<intProp name="Assertion.test_type">6</intProp>
|
148
|
+
</ResponseAssertion>
|
149
|
+
<hashTree/>
|
150
|
+
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
151
|
+
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
152
|
+
<stringProp name="SizeAssertion.size">50000</stringProp>
|
153
|
+
<intProp name="SizeAssertion.operator">5</intProp>
|
154
|
+
</SizeAssertion>
|
155
|
+
<hashTree/>
|
156
|
+
<ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
|
157
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
158
|
+
<objProp>
|
159
|
+
<name>saveConfig</name>
|
160
|
+
<value class="SampleSaveConfiguration">
|
161
|
+
<time>true</time>
|
162
|
+
<latency>true</latency>
|
163
|
+
<timestamp>true</timestamp>
|
164
|
+
<success>true</success>
|
165
|
+
<label>true</label>
|
166
|
+
<code>true</code>
|
167
|
+
<message>true</message>
|
168
|
+
<threadName>true</threadName>
|
169
|
+
<dataType>true</dataType>
|
170
|
+
<encoding>false</encoding>
|
171
|
+
<assertions>true</assertions>
|
172
|
+
<subresults>true</subresults>
|
173
|
+
<responseData>false</responseData>
|
174
|
+
<samplerData>false</samplerData>
|
175
|
+
<xml>true</xml>
|
176
|
+
<fieldNames>false</fieldNames>
|
177
|
+
<responseHeaders>false</responseHeaders>
|
178
|
+
<requestHeaders>false</requestHeaders>
|
179
|
+
<responseDataOnError>false</responseDataOnError>
|
180
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
181
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
182
|
+
<bytes>true</bytes>
|
183
|
+
</value>
|
184
|
+
</objProp>
|
185
|
+
<stringProp name="filename"></stringProp>
|
186
|
+
</ResultCollector>
|
187
|
+
<hashTree/>
|
188
|
+
</hashTree>
|
189
|
+
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="medium" enabled="true">
|
190
|
+
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
191
|
+
<collectionProp name="Arguments.arguments"/>
|
192
|
+
</elementProp>
|
193
|
+
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
194
|
+
<stringProp name="HTTPSampler.port">3100</stringProp>
|
195
|
+
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
196
|
+
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
197
|
+
<stringProp name="HTTPSampler.protocol"></stringProp>
|
198
|
+
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
199
|
+
<stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
|
200
|
+
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
201
|
+
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
202
|
+
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
203
|
+
<boolProp name="HTTPSampler.use_keepalive">false</boolProp>
|
204
|
+
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
205
|
+
<elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
|
206
|
+
<collectionProp name="HTTPFileArgs.files">
|
207
|
+
<elementProp name="${media}/medium.jpg" elementType="HTTPFileArg">
|
208
|
+
<stringProp name="File.path">${media}/medium.jpg</stringProp>
|
209
|
+
<stringProp name="File.paramname"></stringProp>
|
210
|
+
<stringProp name="File.mimetype">image/jpeg</stringProp>
|
211
|
+
</elementProp>
|
212
|
+
</collectionProp>
|
213
|
+
</elementProp>
|
214
|
+
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
215
|
+
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
216
|
+
</HTTPSamplerProxy>
|
217
|
+
<hashTree>
|
218
|
+
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
|
219
|
+
<collectionProp name="Asserion.test_strings">
|
220
|
+
<stringProp name="693218829">test/plain</stringProp>
|
221
|
+
</collectionProp>
|
222
|
+
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
223
|
+
<boolProp name="Assertion.assume_success">false</boolProp>
|
224
|
+
<intProp name="Assertion.test_type">6</intProp>
|
225
|
+
</ResponseAssertion>
|
226
|
+
<hashTree/>
|
227
|
+
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
228
|
+
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
229
|
+
<stringProp name="SizeAssertion.size">50000</stringProp>
|
230
|
+
<intProp name="SizeAssertion.operator">5</intProp>
|
231
|
+
</SizeAssertion>
|
232
|
+
<hashTree/>
|
233
|
+
<ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
|
234
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
235
|
+
<objProp>
|
236
|
+
<name>saveConfig</name>
|
237
|
+
<value class="SampleSaveConfiguration">
|
238
|
+
<time>true</time>
|
239
|
+
<latency>true</latency>
|
240
|
+
<timestamp>true</timestamp>
|
241
|
+
<success>true</success>
|
242
|
+
<label>true</label>
|
243
|
+
<code>true</code>
|
244
|
+
<message>true</message>
|
245
|
+
<threadName>true</threadName>
|
246
|
+
<dataType>true</dataType>
|
247
|
+
<encoding>false</encoding>
|
248
|
+
<assertions>true</assertions>
|
249
|
+
<subresults>true</subresults>
|
250
|
+
<responseData>false</responseData>
|
251
|
+
<samplerData>false</samplerData>
|
252
|
+
<xml>true</xml>
|
253
|
+
<fieldNames>false</fieldNames>
|
254
|
+
<responseHeaders>false</responseHeaders>
|
255
|
+
<requestHeaders>false</requestHeaders>
|
256
|
+
<responseDataOnError>false</responseDataOnError>
|
257
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
258
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
259
|
+
<bytes>true</bytes>
|
260
|
+
</value>
|
261
|
+
</objProp>
|
262
|
+
<stringProp name="filename"></stringProp>
|
263
|
+
</ResultCollector>
|
264
|
+
<hashTree/>
|
265
|
+
</hashTree>
|
266
|
+
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="large" enabled="true">
|
267
|
+
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
268
|
+
<collectionProp name="Arguments.arguments"/>
|
269
|
+
</elementProp>
|
270
|
+
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
271
|
+
<stringProp name="HTTPSampler.port">3100</stringProp>
|
272
|
+
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
273
|
+
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
274
|
+
<stringProp name="HTTPSampler.protocol"></stringProp>
|
275
|
+
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
276
|
+
<stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
|
277
|
+
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
278
|
+
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
279
|
+
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
280
|
+
<boolProp name="HTTPSampler.use_keepalive">false</boolProp>
|
281
|
+
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
282
|
+
<elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
|
283
|
+
<collectionProp name="HTTPFileArgs.files">
|
284
|
+
<elementProp name="${media}/large.jpg" elementType="HTTPFileArg">
|
285
|
+
<stringProp name="File.path">${media}/large.jpg</stringProp>
|
286
|
+
<stringProp name="File.paramname"></stringProp>
|
287
|
+
<stringProp name="File.mimetype">image/jpeg</stringProp>
|
288
|
+
</elementProp>
|
289
|
+
</collectionProp>
|
290
|
+
</elementProp>
|
291
|
+
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
292
|
+
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
293
|
+
</HTTPSamplerProxy>
|
294
|
+
<hashTree>
|
295
|
+
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
|
296
|
+
<collectionProp name="Asserion.test_strings">
|
297
|
+
<stringProp name="693218829">test/plain</stringProp>
|
298
|
+
</collectionProp>
|
299
|
+
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
300
|
+
<boolProp name="Assertion.assume_success">false</boolProp>
|
301
|
+
<intProp name="Assertion.test_type">6</intProp>
|
302
|
+
</ResponseAssertion>
|
303
|
+
<hashTree/>
|
304
|
+
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
305
|
+
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
306
|
+
<stringProp name="SizeAssertion.size">50000</stringProp>
|
307
|
+
<intProp name="SizeAssertion.operator">5</intProp>
|
308
|
+
</SizeAssertion>
|
309
|
+
<hashTree/>
|
310
|
+
<ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
|
311
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
312
|
+
<objProp>
|
313
|
+
<name>saveConfig</name>
|
314
|
+
<value class="SampleSaveConfiguration">
|
315
|
+
<time>true</time>
|
316
|
+
<latency>true</latency>
|
317
|
+
<timestamp>true</timestamp>
|
318
|
+
<success>true</success>
|
319
|
+
<label>true</label>
|
320
|
+
<code>true</code>
|
321
|
+
<message>true</message>
|
322
|
+
<threadName>true</threadName>
|
323
|
+
<dataType>true</dataType>
|
324
|
+
<encoding>false</encoding>
|
325
|
+
<assertions>true</assertions>
|
326
|
+
<subresults>true</subresults>
|
327
|
+
<responseData>false</responseData>
|
328
|
+
<samplerData>false</samplerData>
|
329
|
+
<xml>true</xml>
|
330
|
+
<fieldNames>false</fieldNames>
|
331
|
+
<responseHeaders>false</responseHeaders>
|
332
|
+
<requestHeaders>false</requestHeaders>
|
333
|
+
<responseDataOnError>false</responseDataOnError>
|
334
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
335
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
336
|
+
<bytes>true</bytes>
|
337
|
+
</value>
|
338
|
+
</objProp>
|
339
|
+
<stringProp name="filename"></stringProp>
|
340
|
+
</ResultCollector>
|
341
|
+
<hashTree/>
|
342
|
+
</hashTree>
|
343
|
+
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="extra large" enabled="true">
|
344
|
+
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
345
|
+
<collectionProp name="Arguments.arguments"/>
|
346
|
+
</elementProp>
|
347
|
+
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
348
|
+
<stringProp name="HTTPSampler.port">3100</stringProp>
|
349
|
+
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
350
|
+
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
351
|
+
<stringProp name="HTTPSampler.protocol"></stringProp>
|
352
|
+
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
353
|
+
<stringProp name="HTTPSampler.path">/thumbnail/crop,200,50,PNG/pad,64,64,JPEG/fit,60,60,JPEG</stringProp>
|
354
|
+
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
355
|
+
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
356
|
+
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
357
|
+
<boolProp name="HTTPSampler.use_keepalive">false</boolProp>
|
358
|
+
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
359
|
+
<elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
|
360
|
+
<collectionProp name="HTTPFileArgs.files">
|
361
|
+
<elementProp name="${media}/extralarge.jpg" elementType="HTTPFileArg">
|
362
|
+
<stringProp name="File.path">${media}/extralarge.jpg</stringProp>
|
363
|
+
<stringProp name="File.paramname"></stringProp>
|
364
|
+
<stringProp name="File.mimetype">image/jpeg</stringProp>
|
365
|
+
</elementProp>
|
366
|
+
</collectionProp>
|
367
|
+
</elementProp>
|
368
|
+
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
369
|
+
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
370
|
+
</HTTPSamplerProxy>
|
371
|
+
<hashTree>
|
372
|
+
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
|
373
|
+
<collectionProp name="Asserion.test_strings">
|
374
|
+
<stringProp name="693218829">test/plain</stringProp>
|
375
|
+
</collectionProp>
|
376
|
+
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
377
|
+
<boolProp name="Assertion.assume_success">false</boolProp>
|
378
|
+
<intProp name="Assertion.test_type">6</intProp>
|
379
|
+
</ResponseAssertion>
|
380
|
+
<hashTree/>
|
381
|
+
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
382
|
+
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
383
|
+
<stringProp name="SizeAssertion.size">50000</stringProp>
|
384
|
+
<intProp name="SizeAssertion.operator">5</intProp>
|
385
|
+
</SizeAssertion>
|
386
|
+
<hashTree/>
|
387
|
+
<ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
|
388
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
389
|
+
<objProp>
|
390
|
+
<name>saveConfig</name>
|
391
|
+
<value class="SampleSaveConfiguration">
|
392
|
+
<time>true</time>
|
393
|
+
<latency>true</latency>
|
394
|
+
<timestamp>true</timestamp>
|
395
|
+
<success>true</success>
|
396
|
+
<label>true</label>
|
397
|
+
<code>true</code>
|
398
|
+
<message>true</message>
|
399
|
+
<threadName>true</threadName>
|
400
|
+
<dataType>true</dataType>
|
401
|
+
<encoding>false</encoding>
|
402
|
+
<assertions>true</assertions>
|
403
|
+
<subresults>true</subresults>
|
404
|
+
<responseData>false</responseData>
|
405
|
+
<samplerData>false</samplerData>
|
406
|
+
<xml>true</xml>
|
407
|
+
<fieldNames>false</fieldNames>
|
408
|
+
<responseHeaders>false</responseHeaders>
|
409
|
+
<requestHeaders>false</requestHeaders>
|
410
|
+
<responseDataOnError>false</responseDataOnError>
|
411
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
412
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
413
|
+
<bytes>true</bytes>
|
414
|
+
</value>
|
415
|
+
</objProp>
|
416
|
+
<stringProp name="filename"></stringProp>
|
417
|
+
</ResultCollector>
|
418
|
+
<hashTree/>
|
419
|
+
</hashTree>
|
420
|
+
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="extra large w prescale" enabled="true">
|
421
|
+
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
422
|
+
<collectionProp name="Arguments.arguments"/>
|
423
|
+
</elementProp>
|
424
|
+
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
425
|
+
<stringProp name="HTTPSampler.port">3100</stringProp>
|
426
|
+
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
427
|
+
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
428
|
+
<stringProp name="HTTPSampler.protocol"></stringProp>
|
429
|
+
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
430
|
+
<stringProp name="HTTPSampler.path">/thumbnail/crop,100,100,PNG/pad,64,64,JPEG/fit,60,60,JPEG</stringProp>
|
431
|
+
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
432
|
+
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
433
|
+
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
434
|
+
<boolProp name="HTTPSampler.use_keepalive">false</boolProp>
|
435
|
+
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
436
|
+
<elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
|
437
|
+
<collectionProp name="HTTPFileArgs.files">
|
438
|
+
<elementProp name="${media}/extralarge.jpg" elementType="HTTPFileArg">
|
439
|
+
<stringProp name="File.path">${media}/extralarge.jpg</stringProp>
|
440
|
+
<stringProp name="File.paramname"></stringProp>
|
441
|
+
<stringProp name="File.mimetype">image/jpeg</stringProp>
|
442
|
+
</elementProp>
|
443
|
+
</collectionProp>
|
444
|
+
</elementProp>
|
445
|
+
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
446
|
+
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
447
|
+
</HTTPSamplerProxy>
|
448
|
+
<hashTree>
|
449
|
+
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
|
450
|
+
<collectionProp name="Asserion.test_strings">
|
451
|
+
<stringProp name="693218829">test/plain</stringProp>
|
452
|
+
</collectionProp>
|
453
|
+
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
454
|
+
<boolProp name="Assertion.assume_success">false</boolProp>
|
455
|
+
<intProp name="Assertion.test_type">6</intProp>
|
456
|
+
</ResponseAssertion>
|
457
|
+
<hashTree/>
|
458
|
+
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
459
|
+
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
460
|
+
<stringProp name="SizeAssertion.size">8000</stringProp>
|
461
|
+
<intProp name="SizeAssertion.operator">5</intProp>
|
462
|
+
</SizeAssertion>
|
463
|
+
<hashTree/>
|
464
|
+
<ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
|
465
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
466
|
+
<objProp>
|
467
|
+
<name>saveConfig</name>
|
468
|
+
<value class="SampleSaveConfiguration">
|
469
|
+
<time>true</time>
|
470
|
+
<latency>true</latency>
|
471
|
+
<timestamp>true</timestamp>
|
472
|
+
<success>true</success>
|
473
|
+
<label>true</label>
|
474
|
+
<code>true</code>
|
475
|
+
<message>true</message>
|
476
|
+
<threadName>true</threadName>
|
477
|
+
<dataType>true</dataType>
|
478
|
+
<encoding>false</encoding>
|
479
|
+
<assertions>true</assertions>
|
480
|
+
<subresults>true</subresults>
|
481
|
+
<responseData>false</responseData>
|
482
|
+
<samplerData>false</samplerData>
|
483
|
+
<xml>true</xml>
|
484
|
+
<fieldNames>false</fieldNames>
|
485
|
+
<responseHeaders>false</responseHeaders>
|
486
|
+
<requestHeaders>false</requestHeaders>
|
487
|
+
<responseDataOnError>false</responseDataOnError>
|
488
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
489
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
490
|
+
<bytes>true</bytes>
|
491
|
+
</value>
|
492
|
+
</objProp>
|
493
|
+
<stringProp name="filename"></stringProp>
|
494
|
+
</ResultCollector>
|
495
|
+
<hashTree/>
|
496
|
+
</hashTree>
|
497
|
+
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="large PNG" enabled="true">
|
498
|
+
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
499
|
+
<collectionProp name="Arguments.arguments"/>
|
500
|
+
</elementProp>
|
501
|
+
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
502
|
+
<stringProp name="HTTPSampler.port">3100</stringProp>
|
503
|
+
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
504
|
+
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
505
|
+
<stringProp name="HTTPSampler.protocol"></stringProp>
|
506
|
+
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
507
|
+
<stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,129,310,JPEG/fit,60,60,JPEG</stringProp>
|
508
|
+
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
509
|
+
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
510
|
+
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
511
|
+
<boolProp name="HTTPSampler.use_keepalive">false</boolProp>
|
512
|
+
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
513
|
+
<elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
|
514
|
+
<collectionProp name="HTTPFileArgs.files">
|
515
|
+
<elementProp name="${media}/large.png" elementType="HTTPFileArg">
|
516
|
+
<stringProp name="File.path">${media}/large.png</stringProp>
|
517
|
+
<stringProp name="File.paramname"></stringProp>
|
518
|
+
<stringProp name="File.mimetype">image/jpeg</stringProp>
|
519
|
+
</elementProp>
|
520
|
+
</collectionProp>
|
521
|
+
</elementProp>
|
522
|
+
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
523
|
+
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
524
|
+
</HTTPSamplerProxy>
|
525
|
+
<hashTree>
|
526
|
+
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
|
527
|
+
<collectionProp name="Asserion.test_strings">
|
528
|
+
<stringProp name="693218829">test/plain</stringProp>
|
529
|
+
</collectionProp>
|
530
|
+
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
531
|
+
<boolProp name="Assertion.assume_success">false</boolProp>
|
532
|
+
<intProp name="Assertion.test_type">6</intProp>
|
533
|
+
</ResponseAssertion>
|
534
|
+
<hashTree/>
|
535
|
+
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
536
|
+
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
537
|
+
<stringProp name="SizeAssertion.size">50000</stringProp>
|
538
|
+
<intProp name="SizeAssertion.operator">5</intProp>
|
539
|
+
</SizeAssertion>
|
540
|
+
<hashTree/>
|
541
|
+
<ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
|
542
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
543
|
+
<objProp>
|
544
|
+
<name>saveConfig</name>
|
545
|
+
<value class="SampleSaveConfiguration">
|
546
|
+
<time>true</time>
|
547
|
+
<latency>true</latency>
|
548
|
+
<timestamp>true</timestamp>
|
549
|
+
<success>true</success>
|
550
|
+
<label>true</label>
|
551
|
+
<code>true</code>
|
552
|
+
<message>true</message>
|
553
|
+
<threadName>true</threadName>
|
554
|
+
<dataType>true</dataType>
|
555
|
+
<encoding>false</encoding>
|
556
|
+
<assertions>true</assertions>
|
557
|
+
<subresults>true</subresults>
|
558
|
+
<responseData>false</responseData>
|
559
|
+
<samplerData>false</samplerData>
|
560
|
+
<xml>true</xml>
|
561
|
+
<fieldNames>false</fieldNames>
|
562
|
+
<responseHeaders>false</responseHeaders>
|
563
|
+
<requestHeaders>false</requestHeaders>
|
564
|
+
<responseDataOnError>false</responseDataOnError>
|
565
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
566
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
567
|
+
<bytes>true</bytes>
|
568
|
+
</value>
|
569
|
+
</objProp>
|
570
|
+
<stringProp name="filename"></stringProp>
|
571
|
+
</ResultCollector>
|
572
|
+
<hashTree/>
|
573
|
+
</hashTree>
|
574
|
+
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="large PNG w prescale" enabled="true">
|
575
|
+
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Zmienne zdefiniowane przez użytkownika" enabled="true">
|
576
|
+
<collectionProp name="Arguments.arguments"/>
|
577
|
+
</elementProp>
|
578
|
+
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
579
|
+
<stringProp name="HTTPSampler.port">3100</stringProp>
|
580
|
+
<stringProp name="HTTPSampler.connect_timeout">30000</stringProp>
|
581
|
+
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
582
|
+
<stringProp name="HTTPSampler.protocol"></stringProp>
|
583
|
+
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
584
|
+
<stringProp name="HTTPSampler.path">/thumbnail/crop,128,128,PNG/pad,200,200,JPEG/fit,60,60,JPEG</stringProp>
|
585
|
+
<stringProp name="HTTPSampler.method">PUT</stringProp>
|
586
|
+
<boolProp name="HTTPSampler.follow_redirects">false</boolProp>
|
587
|
+
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
588
|
+
<boolProp name="HTTPSampler.use_keepalive">false</boolProp>
|
589
|
+
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
590
|
+
<elementProp name="HTTPsampler.Files" elementType="HTTPFileArgs">
|
591
|
+
<collectionProp name="HTTPFileArgs.files">
|
592
|
+
<elementProp name="${media}/large.png" elementType="HTTPFileArg">
|
593
|
+
<stringProp name="File.path">${media}/large.png</stringProp>
|
594
|
+
<stringProp name="File.paramname"></stringProp>
|
595
|
+
<stringProp name="File.mimetype">image/jpeg</stringProp>
|
596
|
+
</elementProp>
|
597
|
+
</collectionProp>
|
598
|
+
</elementProp>
|
599
|
+
<boolProp name="HTTPSampler.monitor">false</boolProp>
|
600
|
+
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
601
|
+
</HTTPSamplerProxy>
|
602
|
+
<hashTree>
|
603
|
+
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="No thumbnailing errors" enabled="true">
|
604
|
+
<collectionProp name="Asserion.test_strings">
|
605
|
+
<stringProp name="693218829">test/plain</stringProp>
|
606
|
+
</collectionProp>
|
607
|
+
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
608
|
+
<boolProp name="Assertion.assume_success">false</boolProp>
|
609
|
+
<intProp name="Assertion.test_type">6</intProp>
|
610
|
+
</ResponseAssertion>
|
611
|
+
<hashTree/>
|
612
|
+
<SizeAssertion guiclass="SizeAssertionGui" testclass="SizeAssertion" testname="Size Assertion" enabled="true">
|
613
|
+
<stringProp name="Assertion.test_field">SizeAssertion.response_network_size</stringProp>
|
614
|
+
<stringProp name="SizeAssertion.size">50000</stringProp>
|
615
|
+
<intProp name="SizeAssertion.operator">5</intProp>
|
616
|
+
</SizeAssertion>
|
617
|
+
<hashTree/>
|
618
|
+
<ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
|
619
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
620
|
+
<objProp>
|
621
|
+
<name>saveConfig</name>
|
622
|
+
<value class="SampleSaveConfiguration">
|
623
|
+
<time>true</time>
|
624
|
+
<latency>true</latency>
|
625
|
+
<timestamp>true</timestamp>
|
626
|
+
<success>true</success>
|
627
|
+
<label>true</label>
|
628
|
+
<code>true</code>
|
629
|
+
<message>true</message>
|
630
|
+
<threadName>true</threadName>
|
631
|
+
<dataType>true</dataType>
|
632
|
+
<encoding>false</encoding>
|
633
|
+
<assertions>true</assertions>
|
634
|
+
<subresults>true</subresults>
|
635
|
+
<responseData>false</responseData>
|
636
|
+
<samplerData>false</samplerData>
|
637
|
+
<xml>true</xml>
|
638
|
+
<fieldNames>false</fieldNames>
|
639
|
+
<responseHeaders>false</responseHeaders>
|
640
|
+
<requestHeaders>false</requestHeaders>
|
641
|
+
<responseDataOnError>false</responseDataOnError>
|
642
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
643
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
644
|
+
<bytes>true</bytes>
|
645
|
+
</value>
|
646
|
+
</objProp>
|
647
|
+
<stringProp name="filename"></stringProp>
|
648
|
+
</ResultCollector>
|
649
|
+
<hashTree/>
|
650
|
+
</hashTree>
|
651
|
+
</hashTree>
|
652
|
+
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
|
653
|
+
<boolProp name="ResultCollector.error_logging">true</boolProp>
|
654
|
+
<objProp>
|
655
|
+
<name>saveConfig</name>
|
656
|
+
<value class="SampleSaveConfiguration">
|
657
|
+
<time>true</time>
|
658
|
+
<latency>true</latency>
|
659
|
+
<timestamp>true</timestamp>
|
660
|
+
<success>true</success>
|
661
|
+
<label>true</label>
|
662
|
+
<code>true</code>
|
663
|
+
<message>true</message>
|
664
|
+
<threadName>true</threadName>
|
665
|
+
<dataType>true</dataType>
|
666
|
+
<encoding>false</encoding>
|
667
|
+
<assertions>true</assertions>
|
668
|
+
<subresults>true</subresults>
|
669
|
+
<responseData>false</responseData>
|
670
|
+
<samplerData>false</samplerData>
|
671
|
+
<xml>true</xml>
|
672
|
+
<fieldNames>false</fieldNames>
|
673
|
+
<responseHeaders>false</responseHeaders>
|
674
|
+
<requestHeaders>false</requestHeaders>
|
675
|
+
<responseDataOnError>false</responseDataOnError>
|
676
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
677
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
678
|
+
<bytes>true</bytes>
|
679
|
+
</value>
|
680
|
+
</objProp>
|
681
|
+
<stringProp name="filename"></stringProp>
|
682
|
+
</ResultCollector>
|
683
|
+
<hashTree/>
|
684
|
+
<ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="Dane zagregowane" enabled="true">
|
685
|
+
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
686
|
+
<objProp>
|
687
|
+
<name>saveConfig</name>
|
688
|
+
<value class="SampleSaveConfiguration">
|
689
|
+
<time>true</time>
|
690
|
+
<latency>true</latency>
|
691
|
+
<timestamp>true</timestamp>
|
692
|
+
<success>true</success>
|
693
|
+
<label>true</label>
|
694
|
+
<code>true</code>
|
695
|
+
<message>true</message>
|
696
|
+
<threadName>true</threadName>
|
697
|
+
<dataType>true</dataType>
|
698
|
+
<encoding>false</encoding>
|
699
|
+
<assertions>true</assertions>
|
700
|
+
<subresults>true</subresults>
|
701
|
+
<responseData>false</responseData>
|
702
|
+
<samplerData>false</samplerData>
|
703
|
+
<xml>true</xml>
|
704
|
+
<fieldNames>false</fieldNames>
|
705
|
+
<responseHeaders>false</responseHeaders>
|
706
|
+
<requestHeaders>false</requestHeaders>
|
707
|
+
<responseDataOnError>false</responseDataOnError>
|
708
|
+
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
|
709
|
+
<assertionsResultsToSave>0</assertionsResultsToSave>
|
710
|
+
<bytes>true</bytes>
|
711
|
+
</value>
|
712
|
+
</objProp>
|
713
|
+
<stringProp name="filename"></stringProp>
|
714
|
+
</ResultCollector>
|
715
|
+
<hashTree/>
|
716
|
+
</hashTree>
|
717
|
+
</hashTree>
|
718
|
+
</jmeterTestPlan>
|
Binary file
|
data/load_test/small.jpg
ADDED
Binary file
|
data/load_test/tiny.jpg
ADDED
Binary file
|
@@ -0,0 +1,7 @@
|
|
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,16,55,46,50,43,187,0.0,0.9256045354622238,67.94967748466966
|
3
|
+
small,16,141,140,145,132,150,0.0,0.921605898277749,77.99539917055469
|
4
|
+
medium,16,118,114,129,110,137,0.0,0.9236808682600162,82.94996969172152
|
5
|
+
large,16,146,146,154,128,163,0.0625,0.9237875288683602,93.9015025079388
|
6
|
+
extra large,15,678,675,691,655,747,0.0,0.8956293288750896,89.44310747925125
|
7
|
+
RAZEM,79,222,140,675,43,747,0.012658227848101266,4.471613743136922,401.30654964057277
|
@@ -0,0 +1,7 @@
|
|
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,11,54,56,59,47,66,0.0,0.17140898183064793,13.240004713746998
|
3
|
+
small,11,79,80,85,72,87,0.0,0.17137159593693524,14.533449349956378
|
4
|
+
medium,11,127,129,133,110,140,0.0,0.1712595360423478,15.379741870037364
|
5
|
+
large,11,452,477,510,114,516,0.09090909090909091,0.17129153819801302,16.917609378406365
|
6
|
+
extra large,10,5654,5604,5868,5408,6147,0.0,0.157855688329729,15.774623760832847
|
7
|
+
RAZEM,54,1192,126,5604,47,6147,0.018518518518518517,0.8372482441043769,75.29186798416981
|
@@ -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,5,54,54,54,49,60,0.0,0.08831113780069944,6.821345464339962
|
3
|
+
small,5,77,78,80,73,81,0.0,0.088281512085739,7.486858469286862
|
4
|
+
medium,5,122,120,133,111,133,0.0,0.08818808755313333,7.919617522752526
|
5
|
+
large,5,511,507,521,491,537,0.0,0.0875871492134674,9.501409468827735
|
6
|
+
extra large,4,6220,5973,6931,5748,6931,0.0,0.08261219769098907,4.524873370990727
|
7
|
+
extra large w prescale,4,6066,6046,6257,5825,6257,0.0,0.08256615613260124,4.769001826776204
|
8
|
+
large PNG,4,532,536,568,486,568,0.0,0.0931619154089808,9.325471341065771
|
9
|
+
large PNG w prescale,4,547,541,571,533,571,0.0,0.0930925339787749,10.098630812465089
|
10
|
+
RAZEM,36,1591,500,6046,49,6931,0.0,0.6278996755851676,53.82679507360379
|
@@ -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,48,51,50,57,42,72,0.0,0.3999566713606026,29.36127232049861
|
3
|
+
small,48,147,146,154,138,171,0.0,0.39959707295144065,33.81785345609843
|
4
|
+
medium,48,118,119,125,105,132,0.0,0.3996968965201389,35.89426455771041
|
5
|
+
large,48,143,142,153,130,183,0.0,0.3995804405374357,43.283068403176664
|
6
|
+
extra large,48,656,647,676,636,894,0.0,0.3977757704833804,21.74248576708571
|
7
|
+
extra large w prescale,48,593,590,604,579,654,0.0,0.39787468605200554,23.01534097031689
|
8
|
+
large PNG,48,509,505,540,483,587,0.0,0.39790766884134265,39.83040221833525
|
9
|
+
large PNG w prescale,48,326,307,361,299,608,0.0,0.39849898714840765,43.22196289808389
|
10
|
+
RAZEM,384,318,183,642,42,894,0.0,3.1306559702587684,265.0230977596243
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: httpthumbnailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 14
|
10
|
+
version: 0.0.14
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jakub Pastuszek
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-12-
|
18
|
+
date: 2011-12-02 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :runtime
|
@@ -274,6 +274,17 @@ files:
|
|
274
274
|
- lib/httpthumbnailer/multipart_response.rb
|
275
275
|
- lib/httpthumbnailer/thumbnail_specs.rb
|
276
276
|
- lib/httpthumbnailer/thumbnailer.rb
|
277
|
+
- load_test/extralarge.jpg
|
278
|
+
- load_test/large.jpg
|
279
|
+
- load_test/large.png
|
280
|
+
- load_test/load_test.jmx
|
281
|
+
- load_test/medium.jpg
|
282
|
+
- load_test/small.jpg
|
283
|
+
- load_test/tiny.jpg
|
284
|
+
- load_test/v0.0.13-loading.csv
|
285
|
+
- load_test/v0.0.13.csv
|
286
|
+
- load_test/v0.0.14-no-optimization.csv
|
287
|
+
- load_test/v0.0.14.csv
|
277
288
|
- spec/multipart_response_spec.rb
|
278
289
|
- spec/spec_helper.rb
|
279
290
|
- spec/thumbnail_specs_spec.rb
|