aboutsummaryrefslogtreecommitdiffstats
path: root/lib/oauth.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-04-26 01:42:37 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-04-26 01:42:37 +0100
commit508c340d1d12d3ca932001d7ee1dea1a4c81bf02 (patch)
tree7afffb4e4258fb8190555afdc7b2707965894229 /lib/oauth.c
parentb2bc25c4483f4c2b419d91d479f38c3f07ef4226 (diff)
Successfully posted a tweet!
Twitter's tricky. It returns vars (user_id, screen_name) in the access token that, the way I read the spec, should be included in all subsequent queries. However, stuff only started to work when I dropped those vars. This code's definitely not pretty ATM. Need to clean up now that it actually works.
Diffstat (limited to 'lib/oauth.c')
-rw-r--r--lib/oauth.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/lib/oauth.c b/lib/oauth.c
index c166d96a..6731fe7e 100644
--- a/lib/oauth.c
+++ b/lib/oauth.c
@@ -174,9 +174,8 @@ const char *oauth_params_get( GSList **params, const char *key )
return NULL;
}
-GSList *oauth_params_parse( char *in )
+static void oauth_params_parse( GSList **params, char *in )
{
- GSList *ret = NULL;
char *amp, *eq;
while( in && *in )
@@ -189,7 +188,7 @@ GSList *oauth_params_parse( char *in )
if( ( amp = strchr( eq + 1, '&' ) ) )
*amp = '\0';
- oauth_params_add( &ret, in, eq + 1 );
+ oauth_params_add( params, in, eq + 1 );
*eq = '=';
if( amp == NULL )
@@ -198,8 +197,6 @@ GSList *oauth_params_parse( char *in )
*amp = '&';
in = amp + 1;
}
-
- return ret;
}
void oauth_params_free( GSList **params )
@@ -311,10 +308,10 @@ static void oauth_request_token_done( struct http_request *req )
if( req->status_code == 200 )
{
- GSList *params;
+ GSList *params = NULL;
st->auth_params = g_strdup( req->reply_body );
- params = oauth_params_parse( st->auth_params );
+ oauth_params_parse( &params, st->auth_params );
st->token = g_strdup( oauth_params_get( &params, "oauth_token" ) );
oauth_params_free( &params );
}
@@ -344,13 +341,13 @@ static void oauth_access_token_done( struct http_request *req )
//st->func( st );
}
-char *oauth_http_header( char *access_token, const char *method, const char *url )
+char *oauth_http_header( char *access_token, const char *method, const char *url, char *args )
{
- GSList *params, *l;
- char *token_secret, *sig, *params_s;
+ GSList *params = NULL, *l;
+ char *token_secret, *sig, *params_s, *s;
GString *ret = NULL;
- params = oauth_params_parse( access_token );
+ oauth_params_parse( &params, access_token );
if( params == NULL )
goto err;
token_secret = g_strdup( oauth_params_get( &params, "oauth_token_secret" ) );
@@ -360,12 +357,6 @@ char *oauth_http_header( char *access_token, const char *method, const char *url
oauth_add_default_params( &params );
- params_s = oauth_params_string( params );
- sig = oauth_sign( method, url, params_s, token_secret );
- g_free( params_s );
- sig = g_realloc( sig, strlen( sig ) * 3 + 1 );
- http_encode( sig );
-
ret = g_string_new( "OAuth " );
for( l = params; l; l = l->next )
{
@@ -385,6 +376,21 @@ char *oauth_http_header( char *access_token, const char *method, const char *url
g_string_append( ret, "\", " );
}
+ if( args )
+ oauth_params_parse( &params, args );
+ if( ( s = strchr( url, '?' ) ) )
+ {
+ s = g_strdup( s + 1 );
+ oauth_params_parse( &params, s + 1 );
+ g_free( s );
+ }
+
+ params_s = oauth_params_string( params );
+ sig = oauth_sign( method, url, params_s, token_secret );
+ g_free( params_s );
+ sig = g_realloc( sig, strlen( sig ) * 3 + 1 );
+ http_encode( sig );
+
g_string_append_printf( ret, "oauth_signature=\"%s\"", sig );
err: