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_proto
9 : //
10 :
11 : #include "src/detail/filter.hpp"
12 :
13 : #include <boost/buffers/front.hpp>
14 :
15 : namespace boost {
16 : namespace http_proto {
17 : namespace detail {
18 :
19 : auto
20 61068 : filter::
21 : process(
22 : buffers::slice_of<
23 : boost::span<const buffers::mutable_buffer>> out,
24 : buffers::const_buffer_pair in,
25 : bool more) -> results
26 : {
27 61068 : results rv;
28 61068 : bool p_more = true;
29 : for(;;)
30 : {
31 61497 : if(!more && p_more && in[1].size() == 0)
32 : {
33 178 : if(buffers::size(out) < min_out_buffer())
34 : {
35 0 : rv.out_short = true;
36 61068 : return rv;
37 : }
38 178 : p_more = false;
39 : }
40 :
41 61497 : auto ob = buffers::front(out);
42 61497 : auto ib = buffers::front(in);
43 61497 : auto rs = do_process(ob, ib, p_more);
44 :
45 61497 : rv.in_bytes += rs.in_bytes;
46 61497 : rv.out_bytes += rs.out_bytes;
47 :
48 61497 : if(rs.ec.failed())
49 : {
50 0 : rv.ec = rs.ec;
51 0 : return rv;
52 : }
53 :
54 61497 : if(rs.finished)
55 : {
56 172 : rv.finished = true;
57 172 : return rv;
58 : }
59 :
60 61325 : buffers::trim_front(out, rs.out_bytes);
61 61325 : buffers::trim_front(in, rs.in_bytes);
62 :
63 61325 : if(buffers::size(out) == 0)
64 6713 : return rv;
65 :
66 54612 : if(buffers::size(in) == 0 && rs.out_bytes < ob.size())
67 54183 : return rv;
68 429 : }
69 : }
70 :
71 : } // detail
72 : } // http_proto
73 : } // boost
|