aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/twitter/twitter_http.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/twitter/twitter_http.c')
-rw-r--r--protocols/twitter/twitter_http.c142
1 files changed, 142 insertions, 0 deletions
diff --git a/protocols/twitter/twitter_http.c b/protocols/twitter/twitter_http.c
new file mode 100644
index 00000000..ff17f5f4
--- /dev/null
+++ b/protocols/twitter/twitter_http.c
@@ -0,0 +1,142 @@
+/***************************************************************************\
+* *
+* BitlBee - An IRC to IM gateway *
+* Simple module to facilitate twitter functionality. *
+* *
+* Copyright 2009 Geert Mulders <g.c.w.m.mulders@gmail.com> *
+* *
+* This library is free software; you can redistribute it and/or *
+* modify it under the terms of the GNU Lesser General Public *
+* License as published by the Free Software Foundation, version *
+* 2.1. *
+* *
+* This library is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+* Lesser General Public License for more details. *
+* *
+* You should have received a copy of the GNU Lesser General Public License *
+* along with this library; if not, write to the Free Software Foundation, *
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
+* *
+****************************************************************************/
+
+/***************************************************************************\
+* *
+* Some funtions within this file have been copied from other files within *
+* BitlBee. *
+* *
+****************************************************************************/
+
+#include "twitter.h"
+#include "bitlbee.h"
+#include "url.h"
+#include "misc.h"
+#include "base64.h"
+#include "oauth.h"
+#include <ctype.h>
+#include <errno.h>
+
+#include "twitter_http.h"
+
+
+static char *twitter_url_append(char *url, char *key, char* value);
+
+/**
+ * Do a request.
+ * This is actually pretty generic function... Perhaps it should move to the lib/http_client.c
+ */
+void *twitter_http(struct im_connection *ic, char *url_string, http_input_function func, gpointer data, int is_post, char** arguments, int arguments_len)
+{
+ struct twitter_data *td = ic->proto_data;
+ char *tmp;
+ GString *request = g_string_new("");
+ void *ret;
+ char *url_arguments;
+
+ url_arguments = g_strdup("");
+
+ // Construct the url arguments.
+ if (arguments_len != 0)
+ {
+ int i;
+ for (i=0; i<arguments_len; i+=2)
+ {
+ tmp = twitter_url_append(url_arguments, arguments[i], arguments[i+1]);
+ g_free(url_arguments);
+ url_arguments = tmp;
+ }
+ }
+
+ // Make the request.
+ g_string_printf(request, "%s %s%s%s%s HTTP/1.0\r\n"
+ "Host: %s\r\n"
+ "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n",
+ is_post ? "POST" : "GET",
+ td->url_path, url_string,
+ is_post ? "" : "?", is_post ? "" : url_arguments,
+ td->url_host);
+
+ // If a pass and user are given we append them to the request.
+ if (td->oauth_info)
+ {
+ char *full_header;
+ char *full_url;
+
+ full_url = g_strconcat(set_getstr(&ic->acc->set, "base_url" ), url_string, NULL);
+ full_header = oauth_http_header(td->oauth_info, is_post ? "POST" : "GET",
+ full_url, url_arguments);
+
+ g_string_append_printf(request, "Authorization: %s\r\n", full_header);
+ g_free(full_header);
+ g_free(full_url);
+ }
+ else
+ {
+ char userpass[strlen(ic->acc->user)+2+strlen(ic->acc->pass)];
+ char *userpass_base64;
+
+ g_snprintf(userpass, sizeof(userpass), "%s:%s", ic->acc->user, ic->acc->pass);
+ userpass_base64 = base64_encode((unsigned char*)userpass, strlen(userpass));
+ g_string_append_printf(request, "Authorization: Basic %s\r\n", userpass_base64);
+ g_free( userpass_base64 );
+ }
+
+ // Do POST stuff..
+ if (is_post)
+ {
+ // Append the Content-Type and url-encoded arguments.
+ g_string_append_printf(request,
+ "Content-Type: application/x-www-form-urlencoded\r\n"
+ "Content-Length: %zd\r\n\r\n%s",
+ strlen(url_arguments), url_arguments);
+ } else {
+ // Append an extra \r\n to end the request...
+ g_string_append(request, "\r\n");
+ }
+
+ ret = http_dorequest(td->url_host, td->url_port, td->url_ssl, request->str, func, data);
+
+ g_free( url_arguments );
+ g_string_free( request, TRUE );
+ return ret;
+}
+
+static char *twitter_url_append(char *url, char *key, char* value)
+{
+ char *key_encoded = g_strndup(key, 3 * strlen(key));
+ http_encode(key_encoded);
+ char *value_encoded = g_strndup(value, 3 * strlen(value));
+ http_encode(value_encoded);
+
+ char *retval;
+ if (strlen(url) != 0)
+ retval = g_strdup_printf("%s&%s=%s", url, key_encoded, value_encoded);
+ else
+ retval = g_strdup_printf("%s=%s", key_encoded, value_encoded);
+
+ g_free(key_encoded);
+ g_free(value_encoded);
+
+ return retval;
+}