Line data Source code
1 : // 2 : // Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.com) 3 : // Copyright (c) 2024 Christian Mazakas 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 <boost/http_proto/response.hpp> 12 : #include <boost/http_proto/response_view.hpp> 13 : #include <boost/http_proto/version.hpp> 14 : 15 : #include <utility> 16 : 17 : namespace boost { 18 : namespace http_proto { 19 : 20 32 : response:: 21 32 : response() noexcept 22 : : fields_view_base( 23 32 : &this->fields_base::h_) 24 : , message_base( 25 32 : detail::kind::response) 26 : { 27 32 : } 28 : 29 86 : response:: 30 : response( 31 86 : core::string_view s) 32 : : fields_view_base( 33 86 : &this->fields_base::h_) 34 : , message_base( 35 86 : detail::kind::response, s) 36 : { 37 86 : } 38 : 39 3 : response:: 40 : response( 41 3 : response&& other) noexcept 42 3 : : response() 43 : { 44 3 : swap(other); 45 3 : } 46 : 47 2 : response:: 48 : response( 49 2 : response const& other) 50 : : fields_view_base( 51 2 : &this->fields_base::h_) 52 2 : , message_base(*other.ph_) 53 : { 54 2 : } 55 : 56 2 : response:: 57 : response( 58 2 : response_view const& other) 59 : : fields_view_base( 60 2 : &this->fields_base::h_) 61 2 : , message_base(*other.ph_) 62 : { 63 2 : } 64 : 65 : response& 66 1 : response:: 67 : operator=( 68 : response&& other) noexcept 69 : { 70 : response temp( 71 1 : std::move(other)); 72 1 : temp.swap(*this); 73 1 : return *this; 74 : } 75 : 76 6 : response:: 77 : response( 78 6 : http_proto::status sc) 79 : : response( 80 6 : sc, http_proto::version::http_1_1) 81 : { 82 6 : } 83 : 84 14 : response:: 85 : response( 86 : http_proto::status sc, 87 14 : http_proto::version v) 88 14 : : response() 89 : { 90 14 : if( sc != h_.res.status || 91 4 : v != h_.version) 92 11 : set_start_line(sc, v); 93 14 : } 94 : 95 : //------------------------------------------------ 96 : 97 : void 98 14 : response:: 99 : set_impl( 100 : http_proto::status sc, 101 : unsigned short si, 102 : core::string_view rs, 103 : http_proto::version v) 104 : { 105 : // measure and resize 106 14 : auto const vs = to_string(v); 107 : auto const n = 108 14 : vs.size() + 1 + 109 14 : 3 + 1 + 110 14 : rs.size() + 111 14 : 2; 112 14 : auto dest = set_prefix_impl(n); 113 : 114 14 : h_.version = v; 115 14 : vs.copy(dest, vs.size()); 116 14 : dest += vs.size(); 117 14 : *dest++ = ' '; 118 : 119 14 : h_.res.status = sc; 120 14 : h_.res.status_int = si; 121 14 : dest[0] = '0' + ((h_.res.status_int / 100) % 10); 122 14 : dest[1] = '0' + ((h_.res.status_int / 10) % 10); 123 14 : dest[2] = '0' + ((h_.res.status_int / 1) % 10); 124 14 : dest[3] = ' '; 125 14 : dest += 4; 126 : 127 14 : rs.copy(dest, rs.size()); 128 14 : dest += rs.size(); 129 14 : dest[0] = '\r'; 130 14 : dest[1] = '\n'; 131 : 132 14 : h_.on_start_line(); 133 14 : } 134 : 135 : } // http_proto 136 : } // boost