1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
-module(oauth_client).
-behaviour(gen_server).
-export([access_token_params/1, deauthorize/1, get/2, get/3, get/4, get_access_token/2,
get_access_token/3, get_access_token/4, get_request_token/2, get_request_token/3,
get_request_token/4, start/1, start/2, start_link/1, start_link/2, stop/1]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, code_change/3, terminate/2]).
%%============================================================================
%% API functions
%%============================================================================
start(Consumer) ->
gen_server:start(?MODULE, Consumer, []).
start(ServerName, Consumer) ->
gen_server:start(ServerName, ?MODULE, Consumer, []).
start_link(Consumer) ->
gen_server:start_link(?MODULE, Consumer, []).
start_link(ServerName, Consumer) ->
gen_server:start_link(ServerName, ?MODULE, Consumer, []).
get_request_token(Client, URL) ->
get_request_token(Client, URL, [], header).
get_request_token(Client, URL, Params) ->
gen_server:call(Client, {get_request_token, URL, Params, header}).
get_request_token(Client, URL, Params, ParamsMethod) ->
gen_server:call(Client, {get_request_token, URL, Params, ParamsMethod}).
get_access_token(Client, URL) ->
get_access_token(Client, URL, [], header).
get_access_token(Client, URL, Params) ->
gen_server:call(Client, {get_access_token, URL, Params, header}).
get_access_token(Client, URL, Params, ParamsMethod) ->
gen_server:call(Client, {get_access_token, URL, Params, ParamsMethod}).
get(Client, URL) ->
get(Client, URL, [], header).
get(Client, URL, Params) ->
gen_server:call(Client, {get, URL, Params, header}).
get(Client, URL, Params, ParamsMethod) ->
gen_server:call(Client, {get, URL, Params, ParamsMethod}).
access_token_params(Client) ->
gen_server:call(Client, {access_token_params}).
deauthorize(Client) ->
gen_server:cast(Client, deauthorize).
stop(Client) ->
gen_server:cast(Client, stop).
%%============================================================================
%% Helper functions
%%============================================================================
oauth_get(header, URL, Params, Consumer, Token, TokenSecret) ->
Signed = oauth:signed_params("GET", URL, Params, Consumer, Token, TokenSecret),
{AuthorizationParams, QueryParams} = lists:partition(fun({K, _}) -> lists:prefix("oauth_", K) end, Signed),
Request = {oauth:uri(URL, QueryParams), [oauth:header(AuthorizationParams)]},
httpc:request(get, Request, [{autoredirect, false}], []);
oauth_get(querystring, URL, Params, Consumer, Token, TokenSecret) ->
oauth:get(URL, Params, Consumer, Token, TokenSecret).
%%============================================================================
%% gen_server callbacks
%%============================================================================
init(Consumer) ->
{ok, {Consumer}}.
handle_call({get_request_token, URL, Params, ParamsMethod}, _From, State={Consumer}) ->
case oauth_get(ParamsMethod, URL, Params, Consumer, "", "") of
{ok, Response} ->
case oauth_http:response_code(Response) of
200 ->
RParams = oauth_http:response_params(Response),
{reply, {ok, oauth:token(RParams)}, {Consumer, RParams}};
_ ->
{reply, Response, State}
end;
Error ->
{reply, Error, State}
end;
handle_call({get_access_token, URL, Params, ParamsMethod}, _From, State={Consumer, RParams}) ->
case oauth_get(ParamsMethod, URL, Params, Consumer, oauth:token(RParams), oauth:token_secret(RParams)) of
{ok, Response} ->
case oauth_http:response_code(Response) of
200 ->
AParams = oauth_http:response_params(Response),
{reply, ok, {Consumer, RParams, AParams}};
_ ->
{reply, Response, State}
end;
Error ->
{reply, Error, State}
end;
handle_call({get, URL, Params, ParamsMethod}, _From, State={Consumer, _RParams, AParams}) ->
case oauth_get(ParamsMethod, URL, Params, Consumer, oauth:token(AParams), oauth:token_secret(AParams)) of
{ok, Response={{_, Status, _}, Headers, Body}} ->
case Status of
200 ->
case proplists:get_value("content-type", Headers) of
undefined ->
{reply, {ok, Headers, Body}, State};
ContentType ->
MediaType = hd(string:tokens(ContentType, ";")),
case lists:suffix("/xml", MediaType) orelse lists:suffix("+xml", MediaType) of
true ->
{XML, []} = xmerl_scan:string(Body),
{reply, {ok, Headers, XML}, State};
false ->
{reply, {ok, Headers, Body}, State}
end
end;
_ ->
{reply, Response, State}
end;
Error ->
{reply, Error, State}
end;
handle_call({access_token_params}, _From, State={_Consumer, _RParams, AParams}) ->
{reply, AParams, State}.
handle_cast(deauthorize, {Consumer, _RParams}) ->
{noreply, {Consumer}};
handle_cast(deauthorize, {Consumer, _RParams, _AParams}) ->
{noreply, {Consumer}};
handle_cast(stop, State) ->
{stop, normal, State}.
handle_info(_Msg, State) ->
{noreply, State}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
terminate(normal, _State) ->
ok.
|