@@ -2443,7 +2443,8 @@ static void
24432443rc_socket_got_data (gpointer userdata , PurpleSslConnection * conn , PurpleInputCondition cond )
24442444{
24452445 RocketChatAccount * ya = userdata ;
2446- guchar length_code ;
2446+ guchar length_code = -1 ;
2447+ gint ping_frame_len = -1 ;
24472448 int read_len = 0 ;
24482449 gboolean done_some_reads = FALSE;
24492450
@@ -2475,64 +2476,61 @@ rc_socket_got_data(gpointer userdata, PurpleSslConnection *conn, PurpleInputCond
24752476 while (ya -> frame || (read_len = purple_ssl_read (conn , & ya -> packet_code , 1 )) == 1 ) {
24762477 if (!ya -> frame ) {
24772478 if (ya -> packet_code != 129 ) {
2479+
24782480 if (ya -> packet_code == 136 ) {
24792481 purple_debug_error ("rocketchat" , "websocket closed\n" );
2480-
2481- // Try reconnect
2482- rc_start_socket (ya );
2483-
2484- return ;
2485- } else if (ya -> packet_code == 137 ) {
2486- // Ping
2487- gint ping_frame_len ;
2488- length_code = 0 ;
2489- purple_ssl_read (conn , & length_code , 1 );
2490- if (length_code <= 125 ) {
2491- ping_frame_len = length_code ;
2492- } else if (length_code == 126 ) {
2493- guchar len_buf [2 ];
2494- purple_ssl_read (conn , len_buf , 2 );
2495- ping_frame_len = (len_buf [0 ] << 8 ) + len_buf [1 ];
2496- } else if (length_code == 127 ) {
2497- purple_ssl_read (conn , & ping_frame_len , 8 );
2498- ping_frame_len = GUINT64_FROM_BE (ping_frame_len );
2499- }
2500- if (ping_frame_len ) {
2501- guchar * pong_data = g_new0 (guchar , ping_frame_len );
2502- purple_ssl_read (conn , pong_data , ping_frame_len );
2503-
2504- rc_socket_write_data (ya , pong_data , ping_frame_len , 138 );
2505- g_free (pong_data );
2506- } else {
2507- rc_socket_write_data (ya , (guchar * ) "" , 0 , 138 );
2508- }
2509- return ;
2510- } else if (ya -> packet_code == 138 ) {
2511- // Pong
2512- //who cares
2513- return ;
2514- }
2515- purple_debug_error ("rocketchat" , "unknown websocket error %d\n" , ya -> packet_code );
2516- return ;
2517- }
2482+ goto try_reconnect ;
2483+ }
2484+
2485+ if (ya -> packet_code == 137 ) {
2486+ // Ping
2487+ length_code = 0 ;
2488+ purple_ssl_read (conn , & length_code , 1 );
2489+ if (length_code <= 125 ) {
2490+ ping_frame_len = length_code ;
2491+ } else if (length_code == 126 ) {
2492+ guchar len_buf [2 ];
2493+ purple_ssl_read (conn , len_buf , 2 );
2494+ ping_frame_len = (len_buf [0 ] << 8 ) + len_buf [1 ];
2495+ } else if (length_code == 127 ) {
2496+ purple_ssl_read (conn , & ping_frame_len , 8 );
2497+ ping_frame_len = GUINT64_FROM_BE (ping_frame_len );
2498+ }
2499+ if (ping_frame_len ) {
2500+ guchar * pong_data = g_new0 (guchar , ping_frame_len );
2501+ purple_ssl_read (conn , pong_data , ping_frame_len );
2502+
2503+ rc_socket_write_data (ya , pong_data , ping_frame_len , 138 );
2504+ g_free (pong_data );
2505+ } else {
2506+ rc_socket_write_data (ya , (guchar * ) "" , 0 , 138 );
2507+ }
2508+ return ;
2509+ } else if (ya -> packet_code == 138 ) {
2510+ // Pong
2511+ return ;
2512+ }
2513+ purple_debug_error ("rocketchat" , "unknown websocket error %d\n" , ya -> packet_code );
2514+ return ;
2515+ }
25182516
2519- length_code = 0 ;
2520- purple_ssl_read (conn , & length_code , 1 );
2521- if (length_code <= 125 ) {
2522- ya -> frame_len = length_code ;
2523- } else if (length_code == 126 ) {
2524- guchar len_buf [2 ];
2525- purple_ssl_read (conn , len_buf , 2 );
2526- ya -> frame_len = (len_buf [0 ] << 8 ) + len_buf [1 ];
2527- } else if (length_code == 127 ) {
2528- purple_ssl_read (conn , & ya -> frame_len , 8 );
2529- ya -> frame_len = GUINT64_FROM_BE (ya -> frame_len );
2530- }
2531- //purple_debug_info("rocketchat", "frame_len: %" G_GUINT64_FORMAT "\n", ya->frame_len);
2517+ length_code = 0 ;
2518+ purple_ssl_read (conn , & length_code , 1 );
2519+ if (length_code <= 125 ) {
2520+ ya -> frame_len = length_code ;
2521+ } else if (length_code == 126 ) {
2522+ guchar len_buf [2 ];
2523+ purple_ssl_read (conn , len_buf , 2 );
2524+ ya -> frame_len = (len_buf [0 ] << 8 ) + len_buf [1 ];
2525+ } else if (length_code == 127 ) {
2526+ purple_ssl_read (conn , & ya -> frame_len , 8 );
2527+ ya -> frame_len = GUINT64_FROM_BE (ya -> frame_len );
2528+ }
2529+ //purple_debug_info("rocketchat", "frame_len: %" G_GUINT64_FORMAT "\n", ya->frame_len);
25322530
2533- ya -> frame = g_new0 (gchar , ya -> frame_len + 1 );
2534- ya -> frame_len_progress = 0 ;
2535- }
2531+ ya -> frame = g_new0 (gchar , ya -> frame_len + 1 );
2532+ ya -> frame_len_progress = 0 ;
2533+ }
25362534
25372535 do {
25382536 read_len = purple_ssl_read (conn , ya -> frame + ya -> frame_len_progress , ya -> frame_len - ya -> frame_len_progress );
@@ -2556,20 +2554,31 @@ rc_socket_got_data(gpointer userdata, PurpleSslConnection *conn, PurpleInputCond
25562554 }
25572555 }
25582556
2559- if (done_some_reads == FALSE && read_len <= 0 ) {
2560- if (read_len < 0 && errno == EAGAIN ) {
2561- return ;
2562- }
2557+ if (!done_some_reads && read_len <= 0 ) {
2558+ if (read_len == -1 && (errno == EAGAIN ||
2559+ errno == EINPROGRESS ||
2560+ errno == ENOENT )) {
2561+ return ;
2562+ }
25632563
2564- purple_debug_error ("rocketchat" , "got errno %d, read_len %d from websocket thread\n" , errno , read_len );
2564+ purple_debug_error ("rocketchat" ,
2565+ "got errno %d, read_len %d from websocket thread\n" ,
2566+ errno , read_len );
25652567
25662568 if (ya -> frames_since_reconnect < 2 ) {
2567- purple_connection_error (ya -> pc , PURPLE_CONNECTION_ERROR_NETWORK_ERROR , "Lost connection to server" );
2569+ purple_connection_error (ya -> pc , PURPLE_CONNECTION_ERROR_NETWORK_ERROR ,
2570+ "Lost connection to server" );
25682571 } else {
25692572 // Try reconnect
25702573 rc_start_socket (ya );
25712574 }
25722575 }
2576+
2577+ return ;
2578+
2579+ try_reconnect :
2580+ rc_start_socket (ya );
2581+ return ;
25732582}
25742583
25752584static void
0 commit comments