11use colored:: Colorize ;
22use rustls:: OwnedTrustAnchor ;
33use serde:: { Deserialize , Serialize } ;
4+
45use std:: fs:: File ;
56use std:: io:: BufReader ;
67use std:: path:: Path ;
78use std:: sync:: Arc ;
8- use tokio:: io:: { AsyncReadExt , AsyncWriteExt } ;
9+
10+ use tokio:: io:: { AsyncRead , AsyncReadExt , AsyncWrite , AsyncWriteExt } ;
911use tokio:: net:: TcpStream ;
1012use tokio_rustls:: { client:: TlsStream , TlsConnector } ;
1113
@@ -109,8 +111,7 @@ impl Rustbase {
109111 }
110112 }
111113
112- pub async fn request ( & mut self , request : Request ) {
113- let client = self . client . as_mut ( ) . unwrap ( ) ;
114+ pub async fn request ( & mut self , request : Request , tls : bool ) {
114115 match request {
115116 Request :: Query ( query) => {
116117 let doc = bson:: doc! {
@@ -120,15 +121,21 @@ impl Rustbase {
120121 } ,
121122 } ;
122123
123- client
124- . write_all ( & bson:: to_vec ( & doc) . unwrap ( ) )
124+ let response = if !tls {
125+ Rustbase :: send_and_receive (
126+ self . client . as_mut ( ) . unwrap ( ) ,
127+ bson:: to_vec ( & doc) . unwrap ( ) ,
128+ )
125129 . await
126- . unwrap ( ) ;
127-
128- let mut buf = vec ! [ 0 ; BUFFER_SIZE ] ;
129- let n = client. read ( & mut buf) . await . unwrap ( ) ;
130+ } else {
131+ Rustbase :: send_and_receive (
132+ self . tls_client . as_mut ( ) . unwrap ( ) ,
133+ bson:: to_vec ( & doc) . unwrap ( ) ,
134+ )
135+ . await
136+ } ;
130137
131- let doc: Response = bson:: from_slice ( & buf [ ..n ] ) . unwrap ( ) ;
138+ let doc: Response = bson:: from_slice ( & response ) . unwrap ( ) ;
132139
133140 match doc. status {
134141 Status :: Ok => {
@@ -152,47 +159,28 @@ impl Rustbase {
152159 }
153160 }
154161
155- pub async fn request_tls ( & mut self , request : Request ) {
156- let client = self . tls_client . as_mut ( ) . unwrap ( ) ;
157- match request {
158- Request :: Query ( query) => {
159- let doc = bson:: doc! {
160- "body" : {
161- "query" : query,
162- "database" : self . database. clone( ) ,
163- } ,
164- } ;
165-
166- client
167- . write_all ( & bson:: to_vec ( & doc) . unwrap ( ) )
168- . await
169- . unwrap ( ) ;
170-
171- let mut buf = vec ! [ 0 ; BUFFER_SIZE ] ;
172- let n = client. read ( & mut buf) . await . unwrap ( ) ;
162+ async fn send_and_receive < IO > ( client : & mut IO , data : Vec < u8 > ) -> Vec < u8 >
163+ where
164+ IO : AsyncRead + AsyncWrite + Unpin ,
165+ {
166+ let mut buffer = vec ! [ 0 ; BUFFER_SIZE ] ;
167+ let mut final_buffer = Vec :: new ( ) ;
173168
174- let doc : Response = bson :: from_slice ( & buf [ ..n ] ) . unwrap ( ) ;
169+ client . write_all ( & data ) . await . unwrap ( ) ;
175170
176- match doc. status {
177- Status :: Ok => {
178- if doc. body . is_some ( ) {
179- println ! ( "{}" , doc. body. unwrap( ) ) ;
180- } else {
181- println ! ( "{} Ok" , "[Success]" . green( ) ) ;
182- }
183- }
184-
185- Status :: SyntaxError => {
186- println ! ( "{}" , "[Error]" . red( ) ) ;
187- println ! ( "{}" , doc. message. unwrap( ) ) ;
188- }
171+ while let Ok ( n) = client. read ( & mut buffer) . await {
172+ if n == 0 {
173+ println ! ( "[Wirewave] connection closed" ) ;
174+ break ;
175+ }
189176
190- _ => {
191- println ! ( "{} {}" , "[Error]" . red( ) , status_string( doc. status) ) ;
192- }
193- }
177+ final_buffer. extend_from_slice ( & buffer[ ..n] ) ;
178+ if n < BUFFER_SIZE {
179+ break ;
194180 }
195181 }
182+
183+ final_buffer
196184 }
197185}
198186
0 commit comments