Ignore:
Timestamp:
2010-05-23T12:50:51Z (11 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
a7b9ec7
Parents:
f9110b4
Message:

Added base_url settting to Twitter module so other services using the
Twitter API can be used. Only with Basic authentication though.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/twitter/twitter_http.c

    rf9110b4 rbb5ce4d1  
    4141
    4242
    43 char *twitter_url_append(char *url, char *key, char* value);
     43static char *twitter_url_append(char *url, char *key, char* value);
    4444
    4545/**
     
    4747 * This is actually pretty generic function... Perhaps it should move to the lib/http_client.c
    4848 */
    49 void *twitter_http(char *url_string, http_input_function func, gpointer data, int is_post, char* user, char* pass, struct oauth_info* oi, char** arguments, int arguments_len)
     49void *twitter_http(struct im_connection *ic, char *url_string, http_input_function func, gpointer data, int is_post, char** arguments, int arguments_len)
    5050{
    51         url_t *url = g_new0( url_t, 1 );
     51        struct twitter_data *td = ic->proto_data;
    5252        char *tmp;
    53         char *request;
     53        GString *request = g_string_new("");
    5454        void *ret;
    55         char *userpass = NULL;
    56         char *userpass_base64;
    5755        char *url_arguments;
    5856
    59         // Fill the url structure.
    60         if( !url_set( url, url_string ) )
    61         {
    62                 g_free( url );
    63                 return NULL;
    64         }
    65 
    66         if( url->proto != PROTO_HTTP && url->proto != PROTO_HTTPS )
    67         {
    68                 g_free( url );
    69                 return NULL;
    70         }
    71 
    72         // Concatenate user and pass
    73         if (user && pass) {
    74                 userpass = g_strdup_printf("%s:%s", user, pass);
    75                 userpass_base64 = base64_encode((unsigned char*)userpass, strlen(userpass));
    76         } else {
    77                 userpass_base64 = NULL;
    78         }
    79 
    80         url_arguments = g_malloc(1);
    81         url_arguments[0] = '\0';
     57        url_arguments = g_strdup("");
    8258
    8359        // Construct the url arguments.
     
    9369        }
    9470
    95         // Do GET stuff...
    96         if (!is_post)
    97         {
    98                 // Find the char-pointer of the end of the string.
    99                 tmp = url->file + strlen(url->file);
    100                 tmp[0] = '?';
    101                 // append the url_arguments to the end of the url->file.
    102                 // TODO GM: Check the length?
    103                 g_stpcpy (tmp+1, url_arguments);
    104         }
    105 
    106 
    10771        // Make the request.
    108         request = g_strdup_printf(  "%s %s HTTP/1.0\r\n"
    109                                     "Host: %s\r\n"
    110                                     "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n",
    111                                     is_post ? "POST" : "GET", url->file, url->host );
     72        g_string_printf(request, "%s %s%s%s%s HTTP/1.0\r\n"
     73                                 "Host: %s\r\n"
     74                                 "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n",
     75                                 is_post ? "POST" : "GET",
     76                                 td->url_path, url_string,
     77                                 is_post ? "" : "?", is_post ? "" : url_arguments,
     78                                 td->url_host);
    11279
    11380        // If a pass and user are given we append them to the request.
    114         if (oi)
     81        if (td->oauth_info)
    11582        {
    11683                char *full_header;
     84                char *full_url;
    11785               
    118                 full_header = oauth_http_header(oi, is_post ? "POST" : "GET",
    119                                                 url_string, url_arguments);
     86                full_url = g_strconcat(set_getstr(&ic->acc->set, "base_url" ), url_string, NULL);
     87                full_header = oauth_http_header(td->oauth_info, is_post ? "POST" : "GET",
     88                                                full_url, url_arguments);
    12089               
    121                 tmp = g_strdup_printf("%sAuthorization: %s\r\n", request, full_header);
    122                 g_free(request);
     90                g_string_append_printf(request, "Authorization: %s\r\n", full_header);
    12391                g_free(full_header);
    124                 request = tmp;
     92                g_free(full_url);
    12593        }
    126         else if (userpass_base64)
     94        else
    12795        {
    128                 tmp = g_strdup_printf("%sAuthorization: Basic %s\r\n", request, userpass_base64);
    129                 g_free(request);
    130                 request = tmp;
     96                char userpass[strlen(ic->acc->user)+2+strlen(ic->acc->pass)];
     97                char *userpass_base64;
     98               
     99                g_snprintf(userpass, sizeof(userpass), "%s:%s", ic->acc->user, ic->acc->pass);
     100                userpass_base64 = base64_encode((unsigned char*)userpass, strlen(userpass));
     101                g_string_append_printf(request, "Authorization: Basic %s\r\n", userpass_base64);
     102                g_free( userpass_base64 );
    131103        }
    132104
     
    135107        {
    136108                // Append the Content-Type and url-encoded arguments.
    137                 tmp = g_strdup_printf("%sContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %zd\r\n\r\n%s",
    138                                                                 request, strlen(url_arguments), url_arguments);
    139                 g_free(request);
    140                 request = tmp;
     109                g_string_append_printf(request,
     110                                       "Content-Type: application/x-www-form-urlencoded\r\n"
     111                                       "Content-Length: %zd\r\n\r\n%s",
     112                                       strlen(url_arguments), url_arguments);
    141113        } else {
    142114                // Append an extra \r\n to end the request...
    143                 tmp = g_strdup_printf("%s\r\n", request);
    144                 g_free(request);
    145                 request = tmp;
     115                g_string_append(request, "\r\n");
    146116        }
    147117
    148         ret = http_dorequest( url->host, url->port,     url->proto == PROTO_HTTPS, request, func, data );
     118        ret = http_dorequest(td->url_host, td->url_port, td->url_ssl, request->str, func, data);
    149119
    150         g_free( url );
    151         g_free( userpass );
    152         g_free( userpass_base64 );
    153120        g_free( url_arguments );
    154         g_free( request );
     121        g_string_free( request, TRUE );
    155122        return ret;
    156123}
    157124
    158 char *twitter_url_append(char *url, char *key, char* value)
     125static char *twitter_url_append(char *url, char *key, char* value)
    159126{
    160127        char *key_encoded = g_strndup(key, 3 * strlen(key));
Note: See TracChangeset for help on using the changeset viewer.