@@ -131,38 +131,79 @@ struct request::_data {
131131 std::vector<char > post_data;
132132 content_limits limits;
133133 basic_content_filter *filter;
134+ bool filter_owned;
134135 bool filter_is_raw_content_filter;
135136 bool filter_is_multipart_filter;
136137 bool ready;
137138 long long content_length;
138139 long long read_size;
139140 bool read_full;
140141 bool no_on_error;
142+ int buffer_size;
141143 booster::hold_ptr<cppcms::impl::multipart_parser> multipart_parser;
142144 _data (cppcms::service &srv) :
143145 limits (srv.cached_settings()),
144146 filter (0 ),
147+ filter_owned (false ),
145148 filter_is_raw_content_filter (false ),
146149 filter_is_multipart_filter (false ),
147150 ready (false ),
148151 content_length (0 ),
149152 read_size (0 ),
150153 read_full (false ),
151- no_on_error (false )
154+ no_on_error (false ),
155+ buffer_size (srv.cached_settings().service.input_buffer_size)
152156 {
153157 }
158+ ~_data ()
159+ {
160+ if (filter_owned)
161+ delete filter;
162+ }
154163};
155164
165+ void request::setbuf (int size)
166+ {
167+ if (size < 1 )
168+ size = 1 ;
169+ d->buffer_size = size;
170+ }
171+
156172basic_content_filter *request::content_filter ()
157173{
158174 return d->filter ;
159175}
160176
161- void request::content_filter (basic_content_filter *filter )
177+ void request::set_content_filter (basic_content_filter &flt )
162178{
179+ set_filter (&flt,false );
180+ }
181+ void request::reset_content_filter (basic_content_filter *flt)
182+ {
183+ set_filter (flt,true );
184+ }
185+ basic_content_filter *request::release_content_filter ()
186+ {
187+ if (d->filter_owned ) {
188+ basic_content_filter *flt = d->filter ;
189+ d->filter = 0 ;
190+ d->filter_owned = false ;
191+ return flt;
192+ }
193+ d->filter = 0 ;
194+ return 0 ;
195+ }
196+
197+ void request::set_filter (basic_content_filter *filter,bool owned)
198+ {
199+ if (d->filter && d->filter != filter && d->filter_owned ) {
200+ delete d->filter ;
201+ d->filter = 0 ;
202+ }
163203 d->filter = filter;
164- d->filter_is_multipart_filter = dynamic_cast <multipart_filter *>(filter) != 0 ;
165- d->filter_is_raw_content_filter = dynamic_cast <raw_content_filter *>(filter) != 0 ;
204+ d->filter_owned = filter ? owned : false ;
205+ d->filter_is_multipart_filter = dynamic_cast <multipart_filter *>(d->filter ) != 0 ;
206+ d->filter_is_raw_content_filter = dynamic_cast <raw_content_filter *>(d->filter ) != 0 ;
166207}
167208
168209bool request::is_ready ()
@@ -180,9 +221,10 @@ std::pair<char *,size_t > request::get_buffer()
180221 }
181222 else {
182223 long long reminder = d->content_length - d->read_size ;
183- if (static_cast <long long >(d->post_data .size ()) < reminder) {
184- d->post_data .resize (d->content_length );
185- }
224+ if (reminder < d->buffer_size )
225+ d->post_data .resize (reminder);
226+ else
227+ d->post_data .resize (d->buffer_size );
186228 if (d->post_data .size () == 0 ) {
187229 std::vector<char > tmp;
188230 tmp.swap (d->post_data );
@@ -339,6 +381,8 @@ int request::on_content_progress(size_t n)
339381
340382void request::on_error ()
341383{
384+ if (d->no_on_error )
385+ return ;
342386 if (d->filter ) {
343387 d->filter ->on_error ();
344388 }
@@ -361,10 +405,6 @@ int request::on_content_start()
361405 d->read_full = true ;
362406 }
363407 else {
364- if (d->content_length < 65535 )
365- d->post_data .resize (d->content_length );
366- else
367- d->post_data .resize (65536 );
368408 if (content_type_.is_multipart_form_data () && !d->filter_is_raw_content_filter ) {
369409 d->multipart_parser .reset (new multipart_parser (
370410 d->limits .uploads_path (),
@@ -406,6 +446,8 @@ bool request::prepare()
406446 else
407447 d->content_length = atoll (s);
408448 content_type_ = cppcms::http::content_type (conn_->cgetenv (" CONTENT_TYPE" ));
449+ if (d->content_length == 0 )
450+ d->ready = true ;
409451 return true ;
410452}
411453
0 commit comments