Line data Source code
1 : //
2 : // Copyright (c) 2023 Vinnie Falco (vinnie.falco@gmail.com)
3 : // Copyright (c) 2024 Mohammad Nejati
4 : //
5 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 : //
8 : // Official repository: https://github.com/cppalliance/http
9 : //
10 :
11 : #include "src/detail/filter.hpp"
12 :
13 : #include <boost/capy/buffers/front.hpp>
14 :
15 : namespace boost {
16 : namespace http {
17 : namespace detail {
18 :
19 : auto
20 0 : filter::
21 : process(
22 : capy::slice_of<
23 : boost::span<const capy::mutable_buffer>> out,
24 : capy::const_buffer_pair in,
25 : bool more) -> results
26 : {
27 0 : results rv;
28 0 : bool p_more = true;
29 : for(;;)
30 : {
31 0 : if(!more && p_more && in[1].size() == 0)
32 : {
33 0 : if(capy::buffer_size(out) < min_out_buffer())
34 : {
35 0 : rv.out_short = true;
36 0 : return rv;
37 : }
38 0 : p_more = false;
39 : }
40 :
41 0 : auto ob = capy::front(out);
42 0 : auto ib = capy::front(in);
43 0 : auto rs = do_process(ob, ib, p_more);
44 :
45 0 : rv.in_bytes += rs.in_bytes;
46 0 : rv.out_bytes += rs.out_bytes;
47 :
48 0 : if(rs.ec)
49 : {
50 0 : rv.ec = rs.ec;
51 0 : return rv;
52 : }
53 :
54 0 : if(rs.finished)
55 : {
56 0 : rv.finished = true;
57 0 : return rv;
58 : }
59 :
60 0 : capy::remove_prefix(out, rs.out_bytes);
61 0 : capy::remove_prefix(in, rs.in_bytes);
62 :
63 0 : if(capy::buffer_empty(out))
64 0 : return rv;
65 :
66 0 : if(capy::buffer_empty(in) && rs.out_bytes < ob.size())
67 0 : return rv;
68 0 : }
69 : }
70 :
71 : } // detail
72 : } // http
73 : } // boost
|