@@ -239,46 +239,59 @@ impl<'a> EventSource<'a> {
239239 }
240240 self . retry_count = 0 ;
241241 let mut pending_data: String = "" . to_string ( ) ;
242+ let mut pending_bytes: Vec < u8 > = Vec :: new ( ) ;
242243 while let Some ( chunk) = ok_response. chunk ( ) . await . unwrap_or_default ( ) {
243244 if controller. is_aborted {
244245 return SseAction :: Abort ;
245246 }
246- let chunk_vec = chunk. to_vec ( ) ;
247- let data = std:: str:: from_utf8 ( chunk_vec. as_slice ( ) ) ;
248- match data {
249- Ok ( text) => {
250- if !text. ends_with ( "\n \n " ) {
251- pending_data. push_str ( text) ;
252- continue ;
247+ pending_bytes. extend_from_slice ( & chunk) ;
248+ let text = match std:: str:: from_utf8 ( & pending_bytes) {
249+ Ok ( s) => {
250+ let s_owned = s. to_string ( ) ;
251+ pending_bytes. clear ( ) ;
252+ s_owned
253+ }
254+ Err ( e) => {
255+ if e. error_len ( ) . is_some ( ) {
256+ let s_owned = String :: from_utf8_lossy ( & pending_bytes) . into_owned ( ) ;
257+ pending_bytes. clear ( ) ;
258+ s_owned
259+ } else {
260+ let valid_len = e. valid_up_to ( ) ;
261+ let s_owned = std:: str:: from_utf8 ( & pending_bytes[ ..valid_len] ) . unwrap ( ) . to_string ( ) ;
262+ pending_bytes. drain ( ..valid_len) ;
263+ s_owned
253264 }
254- let msg_text = format ! ( "{}{}" , pending_data, text) ;
255- let ( messages, left_over) = sse_message_list_from_string ( msg_text, false ) ;
256- pending_data = left_over;
257- for message in messages {
258- let event = message. event . unwrap_or ( "" . to_string ( ) ) ;
259- match event. as_str ( ) {
260- "done" => {
261- on_event ( SseEvent :: Close , & mut controller) ;
262- return SseAction :: Abort ;
263- }
264- "message" => {
265- on_event (
266- SseEvent :: Message ( T :: from_json_string ( message. data ) ) ,
267- & mut controller,
268- ) ;
269- if controller. is_aborted {
270- return SseAction :: Abort ;
271- }
272- }
273- "" => on_event (
274- SseEvent :: Message ( T :: from_json_string ( message. data ) ) ,
275- & mut controller,
276- ) ,
277- _ => { }
265+ }
266+ } ;
267+ if text. is_empty ( ) {
268+ continue ;
269+ }
270+ let msg_text = format ! ( "{}{}" , pending_data, text) ;
271+ let ( messages, left_over) = sse_message_list_from_string ( msg_text, false ) ;
272+ pending_data = left_over;
273+ for message in messages {
274+ let event = message. event . unwrap_or ( "" . to_string ( ) ) ;
275+ match event. as_str ( ) {
276+ "done" => {
277+ on_event ( SseEvent :: Close , & mut controller) ;
278+ return SseAction :: Abort ;
279+ }
280+ "message" => {
281+ on_event (
282+ SseEvent :: Message ( T :: from_json_string ( message. data ) ) ,
283+ & mut controller,
284+ ) ;
285+ if controller. is_aborted {
286+ return SseAction :: Abort ;
278287 }
279288 }
289+ "" => on_event (
290+ SseEvent :: Message ( T :: from_json_string ( message. data ) ) ,
291+ & mut controller,
292+ ) ,
293+ _ => { }
280294 }
281- _ => { }
282295 }
283296 }
284297 if controller. is_aborted {
0 commit comments