oauth_client.erl 5.2 KB

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