http_async/response.rs
1use
2{
3 super::
4 {
5 Content,
6 KeyValuePair,
7 status::
8 {
9 Status,
10 },
11 version::
12 {
13 Version,
14 },
15 },
16};
17
18/// Hyper Text Transfer Protocol Response.
19pub struct Response
20{
21 /// Protocol Version.
22 pub version: Version,
23 /// Status Code.
24 pub status: Status,
25 /// List of Header Key Value Pairs.
26 pub header: Vec < KeyValuePair >,
27 /// Content of Response.
28 pub content: Vec < u8 >,
29}
30
31/// Constructor for a dummy `Response`.
32pub fn Response ( )
33-> Response
34{
35 Response
36 {
37 version: Version::HTTP_10,
38 status: Status::Ok,
39 header: Vec::new(),
40 content: Vec::new(),
41 }
42}
43
44impl Response
45{
46 /// Consumes `Response` and converts it to `Vec<u8>`.
47 pub fn into_vector
48 (
49 mut self,
50 )
51 -> Vec < u8 >
52 {
53 let mut buffer: Vec < u8 > = Vec::new();
54 let mut header
55 = format!
56 (
57 "{} {}\r\n{}\r\n",
58 self.version,
59 self.status,
60 {
61 let mut result = "".to_owned ( );
62 for pair in &self.header
63 {
64 result
65 .push_str
66 (
67 &format!
68 (
69 "{}: {}\r\n",
70 pair.key,
71 pair.value,
72 )
73 );
74 }
75 result
76 },
77 ).into_bytes ( );
78 buffer.append ( &mut header );
79 buffer.append ( &mut self.content );
80 buffer
81 }
82
83 /// Add a `header`-value to `Response` in an OOP-Style.
84 ///
85 /// # Arguments
86 /// * `key` – key of new header entry,
87 /// * `value` – value of new header entry.
88 pub fn addHeader
89 (
90 mut self,
91 key: String,
92 value: String,
93 )
94 -> Self
95 {
96 self
97 .header
98 .push
99 (
100 KeyValuePair
101 {
102 key,
103 value,
104 }
105 );
106 self
107 }
108
109 /// Set `version` of `Response` in an OOP-Style.
110 ///
111 /// # Arguments
112 /// * `version` – hyper text protocol version.
113 pub fn version
114 (
115 mut self,
116 version: Version,
117 )
118 -> Self
119 {
120 self.version = version;
121 self
122 }
123
124 /// Set `status` of `Response` in an OOP-Style.
125 ///
126 /// # Arguments
127 /// * `status` – hyper text protocol respone status code.
128 pub fn status
129 (
130 mut self,
131 status: Status,
132 )
133 -> Self
134 {
135 self.status = status;
136 self
137 }
138
139 /// Set `content` of `Response` in an OOP-Style.
140 ///
141 /// # Arguments
142 /// * `contentType` – type of body,
143 /// * `contentBody` – actual body.
144 pub fn content
145 (
146 mut self,
147 this: Content,
148 )
149 -> Self
150 {
151 let length = this.contentBody.len ( );
152 self.content = this.contentBody;
153 self.status = this.statusCode;
154 self
155 .addHeader
156 (
157 "Content-Type".to_owned(),
158 this.contentType.to_owned(),
159 )
160 .addHeader
161 (
162 "Content-Length".to_owned(),
163 format!
164 (
165 "{}",
166 length,
167 ),
168 )
169 }
170}