Skip to content

Commit

Permalink
Functionerize the plain http request code to get it working (hackily)…
Browse files Browse the repository at this point in the history
… with libpurple 2.11.0 in preparation for the Big Changes coming soon
  • Loading branch information
EionRobb committed Jun 20, 2016
1 parent c6c43cd commit 72f0b00
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 71 deletions.
42 changes: 0 additions & 42 deletions skypeweb/skypeweb_connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,46 +69,4 @@ void skypeweb_update_cookies(SkypeWebAccount *sa, const gchar *headers);
gchar *skypeweb_cookies_to_string(SkypeWebAccount *sa);



/* Hack needed to stop redirect */
struct _PurpleUtilFetchUrlData
{
PurpleUtilFetchUrlCallback callback;
void *user_data;

struct
{
char *user;
char *passwd;
char *address;
int port;
char *page;

} website;

char *url;
int num_times_redirected;
gboolean full;
char *user_agent;
gboolean http11;
char *request;
gsize request_written;
gboolean include_headers;

gboolean is_ssl;
PurpleSslConnection *ssl_connection;
PurpleProxyConnectData *connect_data;
int fd;
guint inpa;

gboolean got_headers;
gboolean has_explicit_data_len;
char *webdata;
gsize len;
unsigned long data_len;
gssize max_len;
gboolean chunked;
PurpleAccount *account;
};

#endif /* SKYPEWEB_CONNECTION_H */
32 changes: 17 additions & 15 deletions skypeweb/skypeweb_contacts.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,22 +56,28 @@ skypeweb_get_icon_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const
PurpleBuddy *buddy = user_data;
SkypeWebBuddy *sbuddy = purple_buddy_get_protocol_data(buddy);
SkypeWebAccount *sa = sbuddy->sa;
gchar *url = g_dataset_get_data(url_data, "url");

sa->url_datas = g_slist_remove(sa->url_datas, url_data);

active_icon_downloads--;

if (!buddy)
if (!buddy) {
g_dataset_destroy(url_data);
return;
}

purple_buddy_icons_set_for_user(purple_buddy_get_account(buddy), purple_buddy_get_name(buddy), g_memdup(url_text, len), len, url);

purple_buddy_icons_set_for_user(purple_buddy_get_account(buddy), purple_buddy_get_name(buddy), g_memdup(url_text, len), len, url_data->url);
g_dataset_destroy(url_data);
}

static void
skypeweb_get_icon_now(PurpleBuddy *buddy)
{
SkypeWebBuddy *sbuddy;
gchar *url;
gpointer url_data;

purple_debug_info("skypeweb", "getting new buddy icon for %s\n", purple_buddy_get_name(buddy));

Expand All @@ -82,9 +88,8 @@ skypeweb_get_icon_now(PurpleBuddy *buddy)
url = g_strdup_printf("https://api.skype.com/users/%s/profile/avatar", purple_url_encode(purple_buddy_get_name(buddy)));
}

skypeweb_fetch_url_request(sbuddy->sa, url, TRUE, NULL, FALSE, NULL, FALSE, 524288, skypeweb_get_icon_cb, buddy);

g_free(url);
url_data = skypeweb_fetch_url_request(sbuddy->sa, url, TRUE, NULL, FALSE, NULL, FALSE, 524288, skypeweb_get_icon_cb, buddy);
g_dataset_set_data_full(url_data, "url", url, g_free);

active_icon_downloads++;
}
Expand Down Expand Up @@ -119,6 +124,7 @@ skypeweb_got_imagemessage(PurpleUtilFetchUrlData *url_data, gpointer user_data,
SkypeWebAccount *sa;
gint icon_id;
gchar *msg_tmp;
gchar *location;

// Conversation could have been closed before we retrieved the image
if (!purple_conversation_is_valid(conv)) {
Expand All @@ -129,13 +135,10 @@ skypeweb_got_imagemessage(PurpleUtilFetchUrlData *url_data, gpointer user_data,
sa = purple_connection_get_protocol_data(pc);
sa->url_datas = g_slist_remove(sa->url_datas, url_data);

if (url_text == NULL && url_data->data_len) {
gchar *location;
location = skypeweb_string_get_chunk(url_data->webdata, url_data->data_len, "Location: https://", "/");
if (location && *location) {
skypeweb_download_uri_to_conv(sa, location, conv);
g_free(location);
}
location = skypeweb_string_get_chunk(url_text, len, "Location: https://", "/");
if (location && *location) {
skypeweb_download_uri_to_conv(sa, location, conv);
g_free(location);
return;
}

Expand All @@ -158,7 +161,7 @@ void
skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, PurpleConversation *conv)
{
gchar *headers, *url, *text;
PurpleUtilFetchUrlData *requestdata;
gpointer requestdata;
PurpleHttpURL *httpurl;

httpurl = purple_http_url_parse(uri);
Expand All @@ -173,8 +176,7 @@ skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, PurpleConve

requestdata = skypeweb_fetch_url_request(sa, uri, TRUE, NULL, FALSE, headers, FALSE, -1, skypeweb_got_imagemessage, conv);

if (requestdata != NULL)
requestdata->num_times_redirected = 10; /* Prevent following redirects */
skypeweb_url_prevent_follow_redirects(requestdata);

g_free(headers);
purple_http_url_free(httpurl);
Expand Down
5 changes: 0 additions & 5 deletions skypeweb/skypeweb_login.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,6 @@ skypeweb_login_did_auth(PurpleUtilFetchUrlData *url_data, gpointer user_data, co
SkypeWebAccount *sa = user_data;

sa->url_datas = g_slist_remove(sa->url_datas, url_data);

if (url_text == NULL) {
url_text = url_data->webdata;
len = url_data->data_len;
}

if (url_text != NULL)
refresh_token = skypeweb_string_get_chunk(url_text, len, "=\"skypetoken\" value=\"", "\"");
Expand Down
10 changes: 2 additions & 8 deletions skypeweb/skypeweb_messages.c
Original file line number Diff line number Diff line change
Expand Up @@ -1004,11 +1004,6 @@ skypeweb_got_registration_token(PurpleUtilFetchUrlData *url_data, gpointer user_

sa->url_datas = g_slist_remove(sa->url_datas, url_data);

if (url_text == NULL) {
url_text = url_data->webdata;
len = url_data->data_len;
}

if (url_text == NULL) {
if (purple_major_version == 2 && (
purple_minor_version < 10 ||
Expand Down Expand Up @@ -1063,7 +1058,7 @@ skypeweb_get_registration_token(SkypeWebAccount *sa)
gchar *request;
gchar *curtime;
gchar *response;
PurpleUtilFetchUrlData *requestdata;
gpointer requestdata;

g_free(sa->registration_token); sa->registration_token = NULL;
g_free(sa->endpoint); sa->endpoint = NULL;
Expand All @@ -1089,8 +1084,7 @@ skypeweb_get_registration_token(SkypeWebAccount *sa)

requestdata = skypeweb_fetch_url_request(sa, messages_url, TRUE, NULL, FALSE, request, TRUE, 524288, skypeweb_got_registration_token, sa);

if (requestdata != NULL)
requestdata->num_times_redirected = 10; /* Prevent following redirects */
skypeweb_url_prevent_follow_redirects(requestdata);

g_free(request);
g_free(curtime);
Expand Down
117 changes: 116 additions & 1 deletion skypeweb/skypeweb_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,112 @@ find_acct(const char *prpl, const char *acct_id)
}


/* Hack needed to stop redirect */
struct _PurpleUtilFetchUrlData
{
PurpleUtilFetchUrlCallback callback;
void *user_data;

struct
{
char *user;
char *passwd;
char *address;
int port;
char *page;

} website;

char *url;
int num_times_redirected;
gboolean full;
char *user_agent;
gboolean http11;
char *request;
gsize request_written;
gboolean include_headers;

gboolean is_ssl;
PurpleSslConnection *ssl_connection;
PurpleProxyConnectData *connect_data;
int fd;
guint inpa;

gboolean got_headers;
gboolean has_explicit_data_len;
char *webdata;
gsize len;
unsigned long data_len;
gssize max_len;
gboolean chunked;
PurpleAccount *account;
};

/* Hack needed to stop redirect */
struct _PurpleUtilFetchUrlDataTwoEleven
{
PurpleUtilFetchUrlCallback callback;
void *user_data;

struct
{
char *user;
char *passwd;
char *address;
int port;
char *page;

} website;

char *url;
int num_times_redirected;
gboolean full;
char *user_agent;
gboolean http11;
char *request;
gsize request_len;
gsize request_written;
gboolean include_headers;

gboolean is_ssl;
PurpleSslConnection *ssl_connection;
PurpleProxyConnectData *connect_data;
int fd;
guint inpa;

gboolean got_headers;
gboolean has_explicit_data_len;
char *webdata;
gsize len;
unsigned long data_len;
gssize max_len;
gboolean chunked;
PurpleAccount *account;
};

static void
skypeweb_fetch_url_request_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message) {

PurpleUtilFetchUrlCallback callback;

if (url_text == NULL) {
if (purple_major_version == 2 && purple_minor_version >= 11) {
struct _PurpleUtilFetchUrlDataTwoEleven *two_eleven_url_data = (struct _PurpleUtilFetchUrlDataTwoEleven *) url_data;

url_text = two_eleven_url_data->webdata;
len = two_eleven_url_data->data_len;
} else {
url_text = url_data->webdata;
len = url_data->data_len;
}
}

callback = g_dataset_get_data(url_data, "real_callback");
callback(url_data, user_data, url_text, len, error_message);

g_dataset_destroy(url_data);
}

/* Wrapper of purple_util_fetch_url_request_len_with_account()
* that takes a SkypeWebAccount instead of a PurpleAccount,
* and keeps track of requests in sa->url_datas to cancel them on logout. */
Expand All @@ -266,14 +372,23 @@ skypeweb_fetch_url_request(SkypeWebAccount *sa,
{
PurpleUtilFetchUrlData *url_data;

url_data = purple_util_fetch_url_request(sa->account, url, full, user_agent, http11, request, include_headers, max_len, callback, user_data);
url_data = purple_util_fetch_url_request(sa->account, url, full, user_agent, http11, request, include_headers, max_len, skypeweb_fetch_url_request_cb, user_data);
g_dataset_set_data(url_data, "real_callback", callback);

if (url_data != NULL)
sa->url_datas = g_slist_prepend(sa->url_datas, url_data);

return url_data;
}

void
skypeweb_url_prevent_follow_redirects(PurpleUtilFetchUrlData *requestdata)
{
if (requestdata != NULL) {
requestdata->num_times_redirected = 10;
}
}

const gchar *
skypeweb_user_url_prefix(const gchar *who)
{
Expand Down
2 changes: 2 additions & 0 deletions skypeweb/skypeweb_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,6 @@ skypeweb_fetch_url_request(SkypeWebAccount *sa,
const char *request, gboolean include_headers, gssize max_len,
PurpleUtilFetchUrlCallback callback, void *user_data);

void skypeweb_url_prevent_follow_redirects(PurpleUtilFetchUrlData *requestdata);

const gchar *skypeweb_user_url_prefix(const gchar *who);

0 comments on commit 72f0b00

Please sign in to comment.