Skip to content

Commit a8a887c

Browse files
authored
Merge pull request #31 from Thaodan/thaodan/http_connection_erros_purple2.x
Handle http connection errors when building against Purple 2.x
2 parents 9b3e3cd + 2318b25 commit a8a887c

File tree

1 file changed

+57
-12
lines changed

1 file changed

+57
-12
lines changed

librocketchat.c

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -718,10 +718,37 @@ gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message
718718
gchar *error_msg_formatted = g_strdup_printf(_("Connection error: %s."), error_message);
719719
purple_connection_error(conn->ya->pc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg_formatted);
720720
g_free(error_msg_formatted);
721-
g_object_unref(parser);
722-
g_free(conn);
723-
return;
721+
goto out;
724722
}
723+
#if !PURPLE_VERSION_CHECK(3, 0, 0)
724+
else {
725+
/* Purple 2.x doesn't check for the http status to be successful so let's
726+
* do that here quick.
727+
* Borrowed and then adapted from purple2compat http.c
728+
*/
729+
if (!error_message) {
730+
gsize header_len = (body + 4 - url_text);
731+
gchar header[header_len];
732+
g_strlcpy(header, url_text, header_len);
733+
gchar** header_by_word = g_strsplit_set(header, " ", 2);
734+
gint code = -1;
735+
736+
sscanf(header_by_word[1], "%d", &code);
737+
g_strfreev(header_by_word);
738+
739+
if (!(code <= 0 || code / 100 == 2)) {
740+
gchar *error_msg_formatted = g_strdup_printf(
741+
_("Connection error: Invalid HTTP response code (%d)."),
742+
code);
743+
purple_connection_error(conn->ya->pc,
744+
PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
745+
error_msg_formatted);
746+
g_free(error_msg_formatted);
747+
goto out;
748+
}
749+
}
750+
}
751+
#endif
725752
if (body != NULL && !json_parser_load_from_data(parser, body, body_len, NULL)) {
726753
//purple_debug_error("rocketchat", "Error parsing response: %s\n", body);
727754
if (conn->callback) {
@@ -747,9 +774,12 @@ gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message
747774
conn->callback(conn->ya, root, conn->user_data, NULL);
748775
}
749776
}
750-
777+
778+
out:
751779
g_object_unref(parser);
752780
g_free(conn);
781+
782+
return;
753783
}
754784

755785
static void
@@ -2041,6 +2071,8 @@ static guint rc_conv_send_typing(PurpleConversation *conv, PurpleIMTypingState s
20412071
static gulong chat_conversation_typing_signal = 0;
20422072
static void rc_mark_conv_seen(PurpleConversation *conv, PurpleConversationUpdateType type);
20432073
static gulong conversation_updated_signal = 0;
2074+
static void rc_login_me_cb(RocketChatAccount *ya, JsonNode *node, gpointer user_data,
2075+
JsonObject *error);
20442076

20452077
static void
20462078
rc_free_proxy(gpointer data)
@@ -2131,20 +2163,33 @@ rc_login(PurpleAccount *account)
21312163

21322164
//Build the initial hash tables from the current buddy list
21332165
rc_build_groups_from_blist(ya);
2134-
2135-
//TODO do something with this callback to make sure it's actually a rocket.chat server
2166+
21362167
url = g_strconcat("https://", ya->server, ya->path, "/api/me", NULL);
2137-
rc_fetch_url(ya, url, NULL, NULL, NULL);
2168+
rc_fetch_url(ya, url, NULL, rc_login_me_cb, NULL);
21382169
g_free(url);
2139-
2170+
}
2171+
2172+
2173+
static void
2174+
rc_login_me_cb(RocketChatAccount *ya, JsonNode *node, gpointer user_data,
2175+
JsonObject *error)
2176+
{
2177+
if(!ya) return;
2178+
// TODO: Add else that parses the error status
2179+
21402180
rc_start_socket(ya);
2141-
2142-
2181+
21432182
if (!chat_conversation_typing_signal) {
2144-
chat_conversation_typing_signal = purple_signal_connect(purple_conversations_get_handle(), "chat-conversation-typing", purple_connection_get_protocol(pc), PURPLE_CALLBACK(rc_conv_send_typing), NULL);
2183+
chat_conversation_typing_signal = purple_signal_connect(
2184+
purple_conversations_get_handle(), "chat-conversation-typing",
2185+
purple_connection_get_protocol(ya->pc), PURPLE_CALLBACK(rc_conv_send_typing),
2186+
NULL);
21452187
}
21462188
if (!conversation_updated_signal) {
2147-
conversation_updated_signal = purple_signal_connect(purple_conversations_get_handle(), "conversation-updated", purple_connection_get_protocol(pc), PURPLE_CALLBACK(rc_mark_conv_seen), NULL);
2189+
conversation_updated_signal = purple_signal_connect(
2190+
purple_conversations_get_handle(), "conversation-updated",
2191+
purple_connection_get_protocol(ya->pc), PURPLE_CALLBACK(rc_mark_conv_seen),
2192+
NULL);
21482193
}
21492194
}
21502195

0 commit comments

Comments
 (0)