From 2ee0a514a596bcccd4a42f1a5dcec755aede39db Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 26 Jul 2022 16:14:16 +0200 Subject: [PATCH] Delete ejabberd_auth_http dependency dirs (#115) --- ejabberd_auth_http/deps/cuesport/LICENSE | 202 ------ ejabberd_auth_http/deps/cuesport/Makefile | 16 - ejabberd_auth_http/deps/cuesport/NOTICE | 3 - ejabberd_auth_http/deps/cuesport/README.md | 38 - .../deps/cuesport/src/cuesport.app.src | 7 - .../deps/cuesport/src/cuesport.erl | 85 --- ejabberd_auth_http/deps/fusco/LICENSE | 177 ----- ejabberd_auth_http/deps/fusco/Makefile | 34 - ejabberd_auth_http/deps/fusco/README.md | 9 - ejabberd_auth_http/deps/fusco/cover.spec | 3 - .../deps/fusco/include/fusco.hrl | 66 -- .../deps/fusco/include/fusco_types.hrl | 65 -- .../deps/fusco/performance-results.txt | 57 -- .../deps/fusco/priv/fusco_drv.so | Bin 4208 -> 0 bytes ejabberd_auth_http/deps/fusco/rebar | Bin 304108 -> 0 bytes ejabberd_auth_http/deps/fusco/rebar.config | 6 - .../deps/fusco/src/fusco.app.src | 13 - ejabberd_auth_http/deps/fusco/src/fusco.erl | 642 ----------------- .../deps/fusco/src/fusco_binary.erl | 14 - .../deps/fusco/src/fusco_cp.erl | 219 ------ .../deps/fusco/src/fusco_lib.erl | 498 ------------- .../deps/fusco/src/fusco_protocol.erl | 567 --------------- .../deps/fusco/src/fusco_sock.erl | 123 ---- ejabberd_auth_http/deps/fusco/test/crt.pem | 17 - .../deps/fusco/test/fusco_cp_tests.erl | 57 -- .../deps/fusco/test/fusco_lib_tests.erl | 207 ------ .../deps/fusco/test/fusco_protocol_SUITE.erl | 38 - .../deps/fusco/test/fusco_protocol_eqc.erl | 173 ----- .../deps/fusco/test/fusco_protocol_tests.erl | 66 -- .../deps/fusco/test/fusco_tests.erl | 201 ------ .../deps/fusco/test/fusco_tests_SUITE.erl | 102 --- .../deps/fusco/test/fusco_tests_eqc.erl | 676 ------------------ .../deps/fusco/test/http_eqc_encoding.erl | 153 ---- .../deps/fusco/test/http_eqc_gen.erl | 262 ------- ejabberd_auth_http/deps/fusco/test/key.pem | 15 - .../deps/fusco/test/test_utils.erl | 73 -- .../deps/fusco/test/webserver.erl | 147 ---- .../deps/fusco/test/webserver_utils.erl | 88 --- 38 files changed, 5119 deletions(-) delete mode 100644 ejabberd_auth_http/deps/cuesport/LICENSE delete mode 100644 ejabberd_auth_http/deps/cuesport/Makefile delete mode 100644 ejabberd_auth_http/deps/cuesport/NOTICE delete mode 100644 ejabberd_auth_http/deps/cuesport/README.md delete mode 100644 ejabberd_auth_http/deps/cuesport/src/cuesport.app.src delete mode 100644 ejabberd_auth_http/deps/cuesport/src/cuesport.erl delete mode 100644 ejabberd_auth_http/deps/fusco/LICENSE delete mode 100644 ejabberd_auth_http/deps/fusco/Makefile delete mode 100644 ejabberd_auth_http/deps/fusco/README.md delete mode 100644 ejabberd_auth_http/deps/fusco/cover.spec delete mode 100644 ejabberd_auth_http/deps/fusco/include/fusco.hrl delete mode 100644 ejabberd_auth_http/deps/fusco/include/fusco_types.hrl delete mode 100644 ejabberd_auth_http/deps/fusco/performance-results.txt delete mode 100755 ejabberd_auth_http/deps/fusco/priv/fusco_drv.so delete mode 100755 ejabberd_auth_http/deps/fusco/rebar delete mode 100644 ejabberd_auth_http/deps/fusco/rebar.config delete mode 100644 ejabberd_auth_http/deps/fusco/src/fusco.app.src delete mode 100644 ejabberd_auth_http/deps/fusco/src/fusco.erl delete mode 100644 ejabberd_auth_http/deps/fusco/src/fusco_binary.erl delete mode 100644 ejabberd_auth_http/deps/fusco/src/fusco_cp.erl delete mode 100644 ejabberd_auth_http/deps/fusco/src/fusco_lib.erl delete mode 100644 ejabberd_auth_http/deps/fusco/src/fusco_protocol.erl delete mode 100644 ejabberd_auth_http/deps/fusco/src/fusco_sock.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/crt.pem delete mode 100644 ejabberd_auth_http/deps/fusco/test/fusco_cp_tests.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/fusco_lib_tests.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/fusco_protocol_SUITE.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/fusco_protocol_eqc.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/fusco_protocol_tests.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/fusco_tests.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/fusco_tests_SUITE.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/fusco_tests_eqc.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/http_eqc_encoding.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/http_eqc_gen.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/key.pem delete mode 100644 ejabberd_auth_http/deps/fusco/test/test_utils.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/webserver.erl delete mode 100644 ejabberd_auth_http/deps/fusco/test/webserver_utils.erl diff --git a/ejabberd_auth_http/deps/cuesport/LICENSE b/ejabberd_auth_http/deps/cuesport/LICENSE deleted file mode 100644 index d645695..0000000 --- a/ejabberd_auth_http/deps/cuesport/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/ejabberd_auth_http/deps/cuesport/Makefile b/ejabberd_auth_http/deps/cuesport/Makefile deleted file mode 100644 index 36e45a3..0000000 --- a/ejabberd_auth_http/deps/cuesport/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -.PHONY: all reload compile clean - -all: compile - -compile: rebar - ./rebar get-deps compile - -reload: compile - zsh -c './reload.erl $$(foreach f (src/*.erl); basename $$f .erl; end)' - -rebar: - wget -c http://cloud.github.com/downloads/basho/rebar/rebar - chmod +x $@ - -clean: rebar - ./rebar clean diff --git a/ejabberd_auth_http/deps/cuesport/NOTICE b/ejabberd_auth_http/deps/cuesport/NOTICE deleted file mode 100644 index e8aca02..0000000 --- a/ejabberd_auth_http/deps/cuesport/NOTICE +++ /dev/null @@ -1,3 +0,0 @@ -Copyright 2011 Erlang Solutions Ltd. - -Use `git shortlog --summary` to get the list of developers. diff --git a/ejabberd_auth_http/deps/cuesport/README.md b/ejabberd_auth_http/deps/cuesport/README.md deleted file mode 100644 index 85167fb..0000000 --- a/ejabberd_auth_http/deps/cuesport/README.md +++ /dev/null @@ -1,38 +0,0 @@ -Summary -======= - -Cuesport is a simple pool of workers, meant mainly to be used with things like DB connections. -Use when poolboy's elaborate checkin/checkout seems to be overkill for your task. - -Usage ------ - -Suggested usage is to create your own wrapper module which wraps cuesport and provides -wrapper functions to hide pool's usage. Something in the lines of: - -```erlang --module(myproduct_redis). - --export([start_link/0, q/1, q/2]). - --define(POOL_NAME, myproduct_redis_pool). - -%%%=================================================================== -%%% API functions -%%%=================================================================== - -start_link() -> - PoolSize = get_config(redis_pool_size), - EredisOpts = get_config(redis_worker_config), - ChildMods = [eredis, eredis_client, eredis_parser], - ChildMFA = {eredis, start_link, EredisOpts}, - cuesport:start_link(?POOL_NAME, PoolSize, ChildMods, ChildMFA). - -q(Query) -> - eredis:q(cuesport:get_worker(?POOL_NAME), Query). - -q(Query, Opts) -> - eredis:q(cuesport:get_worker(?POOL_NAME), Query, Opts). -``` - -Then add `myproduct_redis` to your supervision tree. diff --git a/ejabberd_auth_http/deps/cuesport/src/cuesport.app.src b/ejabberd_auth_http/deps/cuesport/src/cuesport.app.src deleted file mode 100644 index f8d9f02..0000000 --- a/ejabberd_auth_http/deps/cuesport/src/cuesport.app.src +++ /dev/null @@ -1,7 +0,0 @@ -{application, cuesport, [ - {description, "Simple pool of workers"}, - {vsn, "0.1"}, - {registered, []}, - {applications, [kernel, stdlib]}, - {env, []} - ]}. diff --git a/ejabberd_auth_http/deps/cuesport/src/cuesport.erl b/ejabberd_auth_http/deps/cuesport/src/cuesport.erl deleted file mode 100644 index 1c815da..0000000 --- a/ejabberd_auth_http/deps/cuesport/src/cuesport.erl +++ /dev/null @@ -1,85 +0,0 @@ -%%%=================================================================== -%%% @copyright (C) 2011, Erlang Solutions Ltd. -%%% -%%% Licensed under the Apache License, Version 2.0 (the "License"); -%%% you may not use this file except in compliance with the License. -%%% You may obtain a copy of the License at -%%% -%%% http://www.apache.org/licenses/LICENSE-2.0 -%%% -%%% Unless required by applicable law or agreed to in writing, software -%%% distributed under the License is distributed on an "AS IS" BASIS, -%%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%%% See the License for the specific language governing permissions and -%%% limitations under the License. -%%% -%%% @doc Utility for using a pool of workers easily -%%% Obvious pun is obvious. -%%% @end -%%%=================================================================== - --module(cuesport). --behaviour(supervisor). - -%% API --export([start_link/4, - start_link/5, - get_worker/1]). - -%% Supervisor callbacks --export([init/1]). - -%% Internal exports --export([start_worker/3]). - --define(SERVER, ?MODULE). - -%%%=================================================================== -%%% API functions -%%%=================================================================== - --spec start_link(atom(), integer(), [atom()], {atom(), atom(), [term()]}) -> - {ok, pid()} | ignore | {error, term()}. -start_link(PoolName, PoolSize, ChildMods, ChildMFA) -> - start_link(PoolName, PoolSize, 2*PoolSize, ChildMods, ChildMFA). - --spec start_link(atom(), integer(), integer(), [atom()], {atom(), atom(), [term()]}) -> - {ok, pid()} | ignore | {error, term()}. -start_link(PoolName, PoolSize, MaxRestarts, ChildMods, ChildMFA) -> - Args = [PoolName, PoolSize, MaxRestarts, ChildMods, ChildMFA], - SupName = list_to_atom("cuesport_" ++ atom_to_list(PoolName) ++ "_sup"), - supervisor:start_link({local, SupName}, ?MODULE, Args). - --spec get_worker(atom()) -> pid(). -get_worker(PoolName) -> - [{pool_size, PoolSize}] = ets:lookup(PoolName, pool_size), - N = ets:update_counter(PoolName, seq, {2, 1, PoolSize, 1}), - [{N, Worker}] = ets:lookup(PoolName, N), - Worker. - -%%%=================================================================== -%%% Supervisor callbacks -%%%=================================================================== - -init([PoolName, PoolSize, MaxRestarts, ChildMods, ChildMFA]) -> - PoolTable = ets:new(PoolName, [named_table, public]), - ets:insert(PoolTable, {pool_size, PoolSize}), - ets:insert(PoolTable, {seq, 0}), - - MFA = fun(Id) -> - {?MODULE, start_worker, [Id, PoolTable, ChildMFA]} - end, - Children = [{N, MFA(N), transient, 2000, worker, ChildMods} - || N <- lists:seq(1, PoolSize)], - - {ok, {{one_for_one, MaxRestarts, PoolSize}, Children}}. - -%%%=================================================================== -%%% non-API exports -%%%=================================================================== - --spec start_worker(integer(), atom(), {module(), atom(), [term()]}) -> {ok, pid()}. -start_worker(Id, PoolTable, {M, F, A}) -> - {ok, Pid} = apply(M, F, A), - ets:insert(PoolTable, {Id, Pid}), - {ok, Pid}. diff --git a/ejabberd_auth_http/deps/fusco/LICENSE b/ejabberd_auth_http/deps/fusco/LICENSE deleted file mode 100644 index f433b1a..0000000 --- a/ejabberd_auth_http/deps/fusco/LICENSE +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/ejabberd_auth_http/deps/fusco/Makefile b/ejabberd_auth_http/deps/fusco/Makefile deleted file mode 100644 index 264d761..0000000 --- a/ejabberd_auth_http/deps/fusco/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -.PHONY: all release compile test clean rel doc build-plt dialyzer - -PROJECT = fusco - -REBAR := ./rebar -DIALYZER = dialyzer - -APPS = kernel stdlib sasl inets ssl public_key crypto compiler - -all: compile doc - -compile: - $(REBAR) compile - -doc: - $(REBAR) doc - -test: compile - $(REBAR) eunit ct - -release: all dialyze test - $(REBAR) release - -clean: - $(REBAR) clean - -build-plt: compile - @$(DIALYZER) --build_plt --output_plt .$(PROJECT).plt \ - --apps $(APPS) - -dialyzer: - @$(DIALYZER) --fullpath --src ./src \ - --plt .$(PROJECT).plt --no_native \ - -Werror_handling #-Wrace_conditions diff --git a/ejabberd_auth_http/deps/fusco/README.md b/ejabberd_auth_http/deps/fusco/README.md deleted file mode 100644 index 3f81639..0000000 --- a/ejabberd_auth_http/deps/fusco/README.md +++ /dev/null @@ -1,9 +0,0 @@ -FUSCO -===== - -Fast and Ultra Slim Connection Oriented HTTP Client - -Fusco is an Erlang HTTP client for high performance applications. -For all those who need a generic HTTP client, check [lhttpc](https://github.com/esl/lhttpc) in which development is based Fusco. Not all the functionalities of lhttpc are present here. - -Fusco is still in a very early stage of development, be aware of that! \ No newline at end of file diff --git a/ejabberd_auth_http/deps/fusco/cover.spec b/ejabberd_auth_http/deps/fusco/cover.spec deleted file mode 100644 index 8d2ef9d..0000000 --- a/ejabberd_auth_http/deps/fusco/cover.spec +++ /dev/null @@ -1,3 +0,0 @@ -{import, [".eunit/eunit.coverdata"]}. -{export, ["logs/total.coverdata"]}. -{incl_dirs, ["ebin"]}. diff --git a/ejabberd_auth_http/deps/fusco/include/fusco.hrl b/ejabberd_auth_http/deps/fusco/include/fusco.hrl deleted file mode 100644 index ad7871f..0000000 --- a/ejabberd_auth_http/deps/fusco/include/fusco.hrl +++ /dev/null @@ -1,66 +0,0 @@ -%%% ---------------------------------------------------------------------------- -%%% Copyright (c) 2009, Erlang Training and Consulting Ltd. -%%% All rights reserved. -%%% -%%% Redistribution and use in source and binary forms, with or without -%%% modification, are permitted provided that the following conditions are met: -%%% * Redistributions of source code must retain the above copyright -%%% notice, this list of conditions and the following disclaimer. -%%% * Redistributions in binary form must reproduce the above copyright -%%% notice, this list of conditions and the following disclaimer in the -%%% documentation and/or other materials provided with the distribution. -%%% * Neither the name of Erlang Training and Consulting Ltd. nor the -%%% names of its contributors may be used to endorse or promote products -%%% derived from this software without specific prior written permission. -%%% -%%% THIS SOFTWARE IS PROVIDED BY Erlang Training and Consulting Ltd. ''AS IS'' -%%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -%%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%%% ARE DISCLAIMED. IN NO EVENT SHALL Erlang Training and Consulting Ltd. BE -%%% LIABLE SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -%%% BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -%%% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -%%% ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -%%% ---------------------------------------------------------------------------- - --record(fusco_url, { - host :: string(), - port :: integer(), - path :: string(), - is_ssl:: boolean(), - user = "" :: string(), - password = "" :: string() -}). - --record(fusco_cookie, { - name :: binary(), - value :: binary(), - expires :: {{integer(), integer(), integer()}, - {integer(), integer(), integer()}} | atom(), - path :: binary(), - path_tokens :: [binary()], - max_age :: integer() | atom(), - domain :: binary() - }). - --record(response, {socket, - ssl, - version, - status_code, - reason, - headers = [], - connection, - cookies = [], - content_length = 0, - size, - in_timestamp, - transfer_encoding, - body}). - --ifdef(no_binary_to_integer). - --import(fusco_binary, [binary_to_integer/1, - integer_to_binary/1]). - --endif. diff --git a/ejabberd_auth_http/deps/fusco/include/fusco_types.hrl b/ejabberd_auth_http/deps/fusco/include/fusco_types.hrl deleted file mode 100644 index 822051f..0000000 --- a/ejabberd_auth_http/deps/fusco/include/fusco_types.hrl +++ /dev/null @@ -1,65 +0,0 @@ -%%% ---------------------------------------------------------------------------- -%%% Copyright (c) 2009, Erlang Training and Consulting Ltd. -%%% All rights reserved. -%%% -%%% Redistribution and use in source and binary forms, with or without -%%% modification, are permitted provided that the following conditions are met: -%%% * Redistributions of source code must retain the above copyright -%%% notice, this list of conditions and the following disclaimer. -%%% * Redistributions in binary form must reproduce the above copyright -%%% notice, this list of conditions and the following disclaimer in the -%%% documentation and/or other materials provided with the distribution. -%%% * Neither the name of Erlang Training and Consulting Ltd. nor the -%%% names of its contributors may be used to endorse or promote products -%%% derived from this software without specific prior written permission. -%%% -%%% THIS SOFTWARE IS PROVIDED BY Erlang Training and Consulting Ltd. ''AS IS'' -%%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -%%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%%% ARE DISCLAIMED. IN NO EVENT SHALL Erlang Training and Consulting Ltd. BE -%%% LIABLE SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -%%% BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -%%% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -%%% ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -%%% ---------------------------------------------------------------------------- - --type header() :: binary(). - --type headers() :: [{header(), iodata()}]. - --type method() :: string(). - --type pos_timeout() :: pos_integer() | 'infinity'. - --type socket() :: _. - --type port_num() :: 1..65535. - --type invalid_option() :: any(). - --type destination() :: {string(), pos_integer(), boolean()}. - --type option() :: - {'connect_timeout', timeout()} | - {'send_retry', non_neg_integer()} | - {'connect_options', socket_options()} | - {'use_cookies', boolean()} | - {'proxy', string()} | - {'proxy_ssl_options', socket_options()} | - invalid_option(). - --type options() :: [option()]. - --type host() :: string() | {integer(), integer(), integer(), integer()}. - --type socket_options() :: [{atom(), term()} | atom()]. - --type body() :: binary() | - 'undefined' | % HEAD request. - pid(). % When partial_download option is used. - --type result() :: - {ok, {pos_integer(), headers(), body(), - non_neg_integer(), pos_timeout()}} | - {error, atom()}. diff --git a/ejabberd_auth_http/deps/fusco/performance-results.txt b/ejabberd_auth_http/deps/fusco/performance-results.txt deleted file mode 100644 index 7f907d9..0000000 --- a/ejabberd_auth_http/deps/fusco/performance-results.txt +++ /dev/null @@ -1,57 +0,0 @@ -============================================================================= -9fedc1ee82661eb6cbf54153198542fcbe51f771 - With http packets on sockets - -HIPE compilation - -Process | RPS -------------------- -20 | 16891 -40 | 17048 - -Without HIPE compilation - -Process | RPS -------------------- -20 | 14249 -40 | 13507 - -============================================================================= -1cb83bb70fffa37f3b51d874f15f0a1d21b72378 - With raw packets on sockets - -HIPE compilation - -Process | RPS -------------------- -20 | 19651 -40 | 20088 - -Without HIPE compilation - -Process | RPS -------------------- -20 | 18577 -40 | 18601 - -Comparison between gen_tcp:recv on http packets and decoding from lhttpc_protocol - -Gen_tcp - -Process | RPS -------------------- -20 | 32214 -40 | 31731 - -lhttpc_protocol - without HIPE - -Process | RPS -------------------- -20 | 25658 -40 | 27448 - - -lhttpc_protocol -HIPE - -Process | RPS -------------------- -20 | 55814 -40 | 49963 diff --git a/ejabberd_auth_http/deps/fusco/priv/fusco_drv.so b/ejabberd_auth_http/deps/fusco/priv/fusco_drv.so deleted file mode 100755 index 30b74a824680931bbeac93eceb22e5408067c033..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4208 zcmX^A>+L^w1_nlE1_lNWAm#yL2_^;x79b4*l0ZBIh~wi!Tq8n2B4|JWJ0EB!11k_S zLZ##5OHwOJ5Na{Z!(k3w2Ma?3oDF1v+~onp@$o*Me%`Jwo-nt;%t50IpqfGMg1HGK zq{P6`U;vdPh5`l+g9H$J0L=%P69J?_d~P5P0Ag$a**rOEXcs1jl_2VvPZ#a2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz|ahVU-x)G-E|uvhILm(fMOueXh6l-fHbH}$&J*71acWb gLkEz)CWrwA3Jk!`WlDT;Noi7iQf6LCY7s;N082wR1^@s6 diff --git a/ejabberd_auth_http/deps/fusco/rebar b/ejabberd_auth_http/deps/fusco/rebar deleted file mode 100755 index eae446d8b127c3a6e2f2c2ff336086a03d069900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304108 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 Q`o%sW2xAl6S(OQCj= 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 z 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⋙̸w)j5knK#|*kof4Qp9HU@8)EGWSFb<( z^JC8$_s{B9E~oCk&)c{>BB>Dz(WmI4$*c*HpZpVUERfB?xDUPx>H$?V`epn(@6>M- zIAqyB65UWJE~myB;0;+hxA=J2K3g6CTmV`}Kj(I*S#tRS>e^=o+h$K*@C+8|uL*@4 zWRDb;!M=Cza=9C;s3xP+-6b`hYTMw*z(R+goi+!DU4Ihk7M|~pCZ?iA z9ZWxP{$Z5qT4;+lh~=AJ5~^3`x?xnGprl}K`}M^_W*WU16hQMMQ?(EOt z$@Iw#(i}l6?8jE=xO;4PZqT!$;eI5Z*)I#zhkvAL7DmCVFQQ>4o}p5(hdNPJcwU?k zEUT_Y?&STusuaGn_rLTTtqtLV!xN?Q-#;WGJTSWC&kU?}+5w-kWA|yZ14BB4x6jH@GL({*(F9gF1(MxL)_R5j(DzWV>F8LF!Zk zO`06>R4XVHK1`Uj*On2P$~cX<6ntlTCwt|1!D-oq_T+e&3}OuuH}jUUF8)NjDX(;b z|KVQ2tZ%wT?yl_tqS6A2Q<19lekj+X#?PaDdu+F!vp}K8i1NBQaH+t)3A?{dVbP=y zLG8%0Etl|$hmygVOR6Tuo4x)Q-TDNCe7&cy{I#JYLU^3|9@tpD!$_gSNS(sy^v=MO zsS512`cz%$;9(^t(zu-2N!|L_LR-PY_$J?_&>~Wt)hVtVYoBMRe%&d5-Km(+N#X#7 zPa=$``9aqk zhAIh92i-xp@fed(+#?T{A_I3e1NWkNyCN~Yd)~;z zGy4pe2neliO34;Q!vd#uyKwNqDCaP}qtu5*cKON)fiKa1!!+^~r;UQLCvLy067@KLzlbR= z5II#rovUPq(8{;2(hDPOO;m<8^u?d(i)%EB@u&!j;mcO1#dlJPVGSynKn~U|G(}Mv z1v<2LbuSv8Z{2_0udnVdzD(>p(>m*J*p+co6adHPPF_Wy!ygfZ^fCM%7VAF zb2WwgYYPb6%_!ewt;TjXAr`yl6SL-H>d--swVKRo{peHhYW<70@l{9xd9=I#PUMla zTTOhbk~f}FR_03H)`?V-@b7p}Fx17dTH?qDpS|SGzRWp2eJr7q`i2Zsqx978p7#e> zU;G$3!}h5%r(U0~r6DgBEWTqGHPa##SaZ&>y(Wof@5NsbZGrOsNr=%16E|-3!!p{# zgEhkJLf~he&+1%OSiG09yq8%jzgWM>@OeK%DJwdJ{(@vynkvW?VftdQ_w-Sb;R7v1 zhmC(n2Em++O4T!Hv#*+9_7g?rOTwx(z9IRJvT&b~$PUR6i!&aWa0iQ22mEyhfmFwp z6Kl`5nFP5n&+%vFJ7H!txRUCy@93{qmRwHIK5*iHeOOASo++4v4 z$M*zt^#$$R75u`F9f_r7_9{J^zkJn=pWERp$IsjY4&I7NG z%nu}}Syhqw{T<2*Ziyoe*)mPHchTN!D*x&3HpTMWo#5h6_0J8nE+3e$bG@}3YJa^g zI$YVel`<+}AY7nPpJdCYAHU^R@vVZTV=3725avLv6BB23 zGM9>laQAV@lW}YhUMeP3!Z^27nN;PjHlGu%FL zfiTzU(hZ%g;3ASR{E}+?$M|9R6lBsFF`M#&zPC{FAVypeW3dsvL6w9Fe(!)<9u3(! z$%iKYjF#saK8XWOFX^=pu3gpVHs+loDP~_Ago~GhT^*D5UcW28vekPW#PbPC6gFdS zGSFHU<*IvoqmZVnM2*drW9za-s2kq&3WBAgcWyFS5wrD! zQ-QbCN9y86%Kq(K>LVhS(rFQE?hY#_!5=RC6gnB7#xH${bvTo_wfwET{HwnH#+%aa zTEUB7?8bp*fr`p$CQRD`zmRrcl45gBe;l_9F24?m$lnD)@jjAra4|($k&KC#R}5mW zgdQe`U2o2oJXJp`>PQIs$&hC_Sw7NoO*wI0=tIEHnPRw4AiM=%R!Q1tix6hqd#q>n zTea`JXxU%qWpW%fCxzAIPpxcAxrN7l!M_w|wkVXMpW2HA7aqxKo^!|ca(_(M*DKMF z%?VE}Hr?;Nl~Y)qmqa*11t%%g{$YT%t3OzyaOoTHd7DXs_YaoU=HO-UeWgI7kq>#? z_Ag5Fe`S8IQIAH~?}53j!Yb5+H|1}~nbo0VaI>h`owax1w|g_UJYk6ALFPuD2WsmQ zTKk`S!R6-;Kk2k8VJB)1I{hnyla|L8npYc4!X-yQBbMPr`%__&;M+&20jY|Zi z9Cm!4t1UA=iF9gCHqiHO94>2@u79j(%T#~fE84I`kkN6Z7wc}<26<*tH=-WEkoFHs z;N^JFjw!5Wh56PRGuGFh;ohzjezjZKcaI{#A|7H<`q3H3e(|S}>T~JGO{~kG@G&AN&qG1e?;V-%R$SwoJ|ES68Wa|Ztd>H z2)Dv-NZAF15IKO%hkO?aW5x^37yYF%K54EwFt(>r)w$|Z^H#4!Ok#%REx34hB`(db zD9-L|Z@FQa!=M&sYIwT%kV_PW?YK>EaFxw2o}IiC#ZR%wKOqP(afe?Eu)w1yfx>Y%I9-7OxGqhi5fGs=vhG1*0Sj3|yOL?|0 z6!%LN0`;V0wOy_8mhLiT5|R4l7HxX}TpIfcOys_`IQ$kW)6Yl2^3n138S__v-f&I9 zwJLywL>HAtFFo;VyS8~)EmAVz?+Kd7ZXJ`~hr7e5z*QC;hc^ z1{dB^>TwbsWN}@{D}TMU935#L*~olWwCbm?@z<|f%&L|mD-zkStP~U4RUd(0`fm)y zTx?q_n{*TQ-54>OIA8<4tOnSK$TJ`TCZnXA`RM3!#P#b>Y6c_o@ruid4sG zhXisC_C|!9QwC%@&pk}kHQUM8pBK^f)y!+L*6Lk7}x$C=V^LdF18BiapIC z1S+hID_5?mo8;fneA}#Iw|n8)*~#~v-wI8{F^!3{W*KYd^Z1zqN#)8Jnqyn-bn04`pf6d);z^K5 zqheQ{s+FvK*Gi)eqlY!szdk-n!}J3p^^s6LrFp-8Y1y^>nd;^H`Muf5PI0a{(Ne8x zDSHJ`S|j!VCZ2WOGp1qBd9K#ITgq9!n~DkA`+e`{9P`k@s|j1MR$T z7KjFwR$9>8%`K!#k^Fet;-Y}*Yp@&`$#k69gs3QX*G}h)UXMq1n#!Nr;;y2-a6az^ z&{+$MVEEYJ5aok|0Iz_O89qc$w=tdO6g2qb(G0liJ{}xPpq$%Dk64#oXws zi|WR6@F4O(q1OGBP6IiTVuIol3xdhh&10BMagNzO0dN|@Le_GbnsrD*wM03{NpLW_mIs3_7SRkbgbCNrny?n|*wl40YQB0Fq zxL1?Z|%>PFwYGA!T)}jo_(7s<<+p z;fh5@i4}$hJ>RJmz5XH4DXzL>UTQOOJ}$ug{{#R40RR6*$agdq`~%1FEAtykW(XPK zOD;lqWL}w%3pKrdClC3rs(v0zkFbfvmz61fR%D~+b4hj`t4L32L@dmXcvL6s-YB>v zhQ1H0S^e>_5F}X9sQ?)pIrJHvMiiogUh=%8aGNx&vg($e9lr`FVd@Ui}W@1 zp6iu>Pr>k=`}cSze!)Tm}cZu#hE-mZ%zB1k2h(L?*>PJF3icI&+-GFvmB z25ig((&jcPDmiIl(gd0{%L+GiX0BDY8Z~1@1Hze2%8ca@&vssB#`>~j+(y|BPl*j; zEBIFXmF0sbQWd#`LJR*$#+!vYD$R^br(3MBF79~Ao&M7@Y4L7I)O%@HsGvkm^+oW& z-9TS-t{wZwR-pw?w3gDKA@3juHC?DXgYxsdyIfmy41s{^&F2vOsK1S#xdha{-KtM` z+)T9NRUJ349^a%-UZ3UsUPnu=wN_>|GA{TbR?aMsz$cz$?;#V3Y(1T8oyu0Ew6?Bi#BGXJPB|An zb5$5qwzq7I=Vjad%JiB2a?V(T3y?h7K?AXN=ECrjZJNj@Y$ zb|GfbHoGn<=)_NFHdnTH$whl|gR$inV=3X=`TIP+0qC$FS2WR z1&eHiVN0K;y)wx0ZD~$G+dLVr-&Z?Pdoy3nQ)BpcVVeK*=a7p>(m}`%hd%el^qAVB_9msOW+sQ)^esO0Z>yq) zRqbR&WXn#)tyZ>D=O0Y138hH=B{8~6()7A?Z|feMqj|O12g92LHzVgA%8vx_i?vNs zA=_8lqy9N!8ZYdKB^)&hmgwe;JHPRB4J7-Sy!x)QSF3!oj)`5Z=;l}fSc*Mx{LxWy(8l`SLS?D! z*6wV)wi+FgE6!1WW~%1i zS^nPsr#iVDJB-DO z^<@y!Qs0)fH7F(em%e2yCt11LHdDnL#h;-T=REP(vlS1ddy@mTc8~8#EB~>Yq^{@8 zPLa+BwS~OFk3KmSNj@wbj(&Ik_GiC96P2f7cuisaWMTDTN+h*sNImau*;4w!NSrzm znLt{Gf}Y5TQK5}HKI*sCQ~83~8a3_A z;6}z?Cl?-$8?V64n2~%slcxUTmF&Y=_Dxei-!7i&RGJn?+mr1}Jbf9^)z5}@9#^Uq zEGNGA(&9yQ#t);I?y^CD2aJ}2Ir+V3k#4qDk&NEQDdKI8bv;H#v;!DGExdq;z+KD) z4tU6fjrwS69ZKd+x`HAhCCuWy$`o?nsFix3e`F=0hA=BP134hSM?S53F+N%AOm3uc zR6@5|_l-8cHYfcXwbW)!UQDAv&eBW%g8oRU&FE5-`!iV-oJ6m$SWWXIPZqkLCiU#R zxI*!L?u9$bPD=Zk*X68DqpIf4i$|+Mejnan0KeV*y)>4`Ym~m$#Vb8@nS<_Of#;N? zZ83TNQv_E?UNctf9UG8ZAvCA7&|*(a8r3ZlFe+}VG3gbC_Mt_?H&w{nRHdBQX2KDZ zI7B(kRK1Qk<1C|MUTRc=XpIg>$?sc@qV`@48s8cRlM(}myNJH@(r-R&q(ixJIycgI z4Q=L`R!QYB{6-e^$9fIXhN41Sxv*1%-Ln!A@yZ`_=UDB!vnFF29yoB%1~pDcM$`*( z%$kj2yjpG=C#+46xi=Fo!zh$%P3I2b#e&KE#mHfnylWGis}!|{N55wX#_YJI4V&FW z3l>z|dv*N?RUT*DEwsEdV_vQwU@Q2sNnDuefcs(RT(I4w5!!mu?&g4z_zphG4D5VF z=5L1F-pq$s!Gql|Dv>Ftk8pw`Z%3tmmBVo9AS_l@$@whfF44w8)>rEq zJ||hax@`EaacoR|#tePUB7|{b&4uq{d8@XCpLItQQdw}L46iG~zl?cz^gurTfGO#~ z(1~|scO${{yCZ(o-oj%$qwixEVfy|w!AvdXU<=k?Glmf-{ADHQ>L*_(q~olm4htf0Pxk zRPcmYc`KVX^#r?~?xH~!svQ$Y<4Or!%_&d3|5>8>5Qg@6eJIPr`|JH?j{6D8?mT-` zw*_%*r%IQ_xy0+6v94_qoonaw|5CElQtmoODor#lx5NuIjE=}|h593Q=R&5N9Jzh< zT@^o_l4&2jaf7e(`qei%wR9pvmD?xbJ5O4veO?xd*mRu8$2*-XVLil%asl7=JM$(A ztvC3t9*N5khtRh=hj;tv#@`ScEXUSW4r2p^|W zIi$gU*jLQ7lODoU`6^1EYW>Y{iAM)plZg#~D-)Yw6QAf%m6c~If!pus4W_za7Td$@ zD;z!RI&r>C_APe4><(x5jtJd`PetmIX#CiH)JEEH%UX*%R&9mn%-gtry==Z)AGNbT z)01$f>DjN0wlZ8WoD>#_A`oc%m(~abfhXesTm0+azX+&-ERX{zpa|3f8fXAb@EB+T z9qyj0P;Zr zz=0A_3O<1&H3a`T(kOtC0dUz8u!P}4>azYNs1@Axscn^v|F?b(J!hfI~l!qv&3^m~+ zs0$6D5j2IC&<++wQ zM9bg*`}*g3?%X@)p7Wk_-*fJr$wb8``qOB9J8@*h_z114m_}o)rqO6JmRcdF)Upb- zBA0!?^WNVeG5?MA?RHU)gLwr`IP%9N03?#V5=%1m{s!EyYQVL*{ z9KZ+ZUCI9LiAj}EMbj!3W(su?Rg#B=hlV>FH2<4dX0A%DptAEV3~I>zH2P;IN|hN* z6jNGr#DqQyTux~eXyxXJmkLBNt|^lviN?g+o0F?7(kj$4YAQ8Nrpzk=*c{U`4TOgk zQ>Dz@B1)@Ol$aGNrh!}iEr>01l$z2aFeuKYG%SNhG&WPJP^!(1l3dDCL**)DiXug^ zqD0Fy_Ke7sn2Ba`Du+_%nSWZ~0J!EL5Sd0*rp{IjK;f$71&~>pKCN;ERgBQhvh&MI z3N>s>uF~N?-58r<-bb-*gW}p9Gv0v=Ih>uTsfdfhc z!O&=CgmJb%}28&Q^+GRS2Rpu5<;Sxh~n|39a1ckZ-Sv=m((?q zk8!MBk$o1EN0L&S9;=keO9(lSg`PLMJI@j8W-@76fTpWs(n{e%%=Es8vA85_AcvF^ zdVkG&e;krE2qQUMT^o~ECuDQ5FpSNyCDnl}ZX{huvbb3IBs!_v$DpwX(i2FGPjbP; z9wYf&UANxE2ASA^iGsx~qi5+&=Fm%ZH^Ib?K9j@(NR|VKG(k?u0FmyA-Y+AMMlv|o z3>{7|dCe#eR|vyZhg&m=Ht#=BtgtfNhDq%6W)m38naH9=x|(2-A`FY<0t;MgS8EZe z1|5z*3~LmIHH5K@#a&CUBgL2v$)Pvva4t^kCh2WDUNlDErxU`pTUQF#o4PuhI2pBL-AH1M_A(Vrn8w7zrMr4)s~6;n7H`5P}&3);5q08ydKF zL^WW;gOL;9q9B}gI1hsGf*^)i@d%RT4U~XW7ceuBGgM!%P%6IqQsF|Wz&sz-3WHNa zKzdw(zGPG=46KHrAqyVPH6_@oz#C78y8*rc@Ldo-#?3=D1~58&81NJW9h1NZel#c0 zJr8BT9mKWIDjcpx_qF9)?9= z{D2U)D?b#P(2^v@d_pAV^IRcIV60z!HJaA)FwH%rk`T0WLf+A)A)<$%h!@ z1w;mze8MNC34rYf*ia*WIIJHS^wQx1KnVsE?+~^Zpm-q^5>N<0;qlQaWU$TxYoWnf zXtegx;r?J90+jdyXQLQwKOH{Y!W4JFI1r-WXhsNI0GNXQl_lV?!axkX3HUrQpB4b3 z0Mg|tf&MDg;Q;_W3IYQLg#aSNgqFgOtK&j!43dMPvkn(QGNH%=Kq&wd{^cov z<4Q_PIr?oA2$4I6utlIF>K~1WBL*o1BQgX7S(F5`MUn_fQZ`H^!9)^IoJ7-zlZa|i z*RYU&HHfQu;%ZvGxSD7IaXm{SVvDk26yO@n4s3~N!8jr8K=2lb^7dCo#F$Xx%?{+S z#=w1ThB!3p~A)#pF=qGr%GaV0uFkvQENXH@6 zQJ5tujKBh1^_zf0TBBzM$pK%Xu#s8TnDdFz^7+ zhZ-SaB!b`(kqpdGCgGpvO<@N1$S4sz3~i9nuw@~fu~3v`2s;8&5TQ>v&`&_EMR53J z0Md&fO;9J+;o+b@4%8v>QJAHW7lA=M5Iw4`aQ#z8ik>o3TR7m@W7OOT&%${I82@_xw zCGdHcLO2O&T-Zmhz_Z?=gn{g`h$taP%8+v5eTD-|L6w*QDrPWA$0vx`acC)t5CmXP z1UE^+?1`8qK>#xhk~Im|lMHl-4U1tIpd(Pg{mGdqVkaV;N$}(VoXHSlaxi-`X36`M zR(O4aNmvrk0QBjGZ%8B5tA5pd^yKM}Jz2z_gs@ZKDFoPQ5MydEdkSDfj8L%X(KZIC za}lyLP{CxtYY96IY9^hIr=ceeJhdR6^pCU-h2T^BJD4J3ryvIzfP*$-rVft;M;YKq z7Q)ViQqKJAd_$)R2%%syIXq$}2?YZO0+ICT%uj+QK_~Z2SYj0HRU0~<1uqbQmM#J|qNga|)$q3A-;Zx}?~U%chSEa!p8a0qr0DJBKc-r4s9K7S zXN%ZbXq7qe5(u%#AQlD8491eQ>WSzjJEpi4dU_KKhe9)fhC!nn$EL;}hh}b^Lt|Dy z9k#JY&C1vh==UCP4b8?lMskkP))tzbQ6G&5_p^2Ehwo$@Bb*^d93*!!_9$+CKODDy z@wgj%4``nK*5cF8)~}zfuwQKc{p7>@$wfx_h<=y|C$wMuqmB9`w1|E>F-G~v@kjZ1 zqdWy#s!^T}Z3>b{R-hc|*MRtsHtL2N$LJT_Z_OrAWhF>I2O0yK%&4z0>eA?O^Ln7m zFv>s9f0V}?@5dYQKFY@$?@41EbR-|A)FNNk;MTvQX;OR`oUVj(q>DML+`7ojB8D}P zvGPyb6N1T(Z5f1w=Vu_+UJX2*W|~I>3kQq>ecv!7mNP1`Xl8* z*NoraG}fOPwQ|XBJY&$nf1CXwzp}<}Zsvl{jOE*#r$pq~+t@noe|zBm`LQn^IrOAA zU5r0;M6h{-SNizsMN_6eaKjJG8C_JaI?I|pnAluc@LTtj&IJxHw%w}s75)Bj=1$r( z%cGZT9H%z+G{z4&p#E9osx2AeDSg=S*`8NV?=Wxv{yvOcynf8v!GCP&xjh(PlKK5O zRW{lqcEK>SLTyNAfrRV~sf& z32l^7AJuD!QODO<6G-k2Eyy@V^%`i@LHi`YI7a(NVAMhT%F8%L`)!zUjP|Fiv4jv8 zJmYv^gjTCY^;unnH1kbzXjr+XM1NC4&=_ZrCi;E9;4Nk`I{5a;GoA$nl9&?ozy7XX zpMmt5s#5f&K=VmprYh6sDAk2D2Kq3VLu2JA1H@7Sc>be!+hJNXF1Aixv51avF_!ouX41Wl336LcL4F7o7z%QfR0)->Qp>6Ae3hV7twP_rGy;XDNKmZEql#1%`m`y?QIu)~`cIhxjXGQK z*LPMwg}SI9Lax!$XqJbn6M$e@MN@0qb=ANl17$NZESGjCZg`ZWh>Sh&v3Ns71I^xb zaNAP5`mI5MVymk=re6H1YR}ZZj$IcIgU#m_EnJ+ zZgL+kKDolDrR>CKkJQg+x4T=$R$;r2nmqqJYf;&iFORR_z8T=#lJH0C&cgJ=Rx!KG zFUo>5kF}F>)gPQZsBgEtjyO2Jz^l5owW%?1^3TN$XGSIW#V)>6 z)tl5_M|8(nwUDNnYH;A-!3DVsNNJw{gcQ;5W-6h>1 zh;(;%w{%H&cfUuyuiINL^!dHV&*u2Y+21{Dt=Y3`W>$)^{zO44Y$p>0dx~n}sjlk{ z*T8-@bdx=t)710S%j&Xo)v9qa<~;StF$8Wv=0yK@w7qZX^S(M98(S=owdXlt3Qr}m zEx7nO?MI7W>J()dtxaq*@f8xEH;8Vzuy81`Gp!vLOxKJj0Zhxt4$fU$+L+zWHwq5) zp;|7F3Hy;*^}ZBNuKJStMyGpg^2y4vjrh2bDKgH#r^o`HWkU0IBdN7-??R`0OOk5A#jr z&f{&z?jew1UldcDePm8;Q4_&Q@y;^G>pLngG@D&@&2Mw#*VXqM zFmY_OR}j`f-d|UtaTDz@+Fd6l)`&`S8{D|993OC%wnJ}P+UiXf8@rPX3Jv3E+)$#! zb?$L~IOm#Z5Q*J`o$s)=ytMC|8d9ul^0#&)DvwY3f-94&{!$MovAS04cyb==IJQx4 zbDJe4LPFSox^cb1VcEB8w8bzcK&^%^v^wRK``#pSEe8HXl@tbVQTuh{nD)xnoy6|= znHV3=ZjCeb)(lY5OQmIvcYE{kY)b>T;k7l67i*1Sss|539_tnqs^XxYOm6xSJrzzy%oh?qk#aP#5xCwjeTu;xmy)n5OMnUB0aWV@(9i-blMZ6-uW(w}s)+u^u40AyyA2i9-NmDJ|k9CU@ z@9tHfT}X!SriOoI%+cq*Yd$**h_Zv!NbHOeL5Cs@?&oaOTB@d)q(?8GGv9V+&SEkD znCPN?rG#gbtPIy#(<;`VzUHvzj^i+Jtgg?yyv}pIa$KpapfN^SMe|Plq8qj7>QMJu zZsdG*FjgVC9Mv=AqX;_ZR8*~J5++ToGNrKVVMorJ?(z$^DZ4smbeQ--zLnzb(-yj zWP?n2uy6&0QwDQ$ZfHe1HEdp8Ygc63N!CgxsWw<0&0AVr+V(!HRkM#c_(mg@sb-&3 zOK*NQZ`?~p0~>g3k#xN+)&1-wrSM8oHmt~{vkE;$IQCxad7ZA|$#r>Z>VU}Xa#aKw z>(!uxOzLhOmVrV?>UbSwfA^W}yb|Ke;!PWlOD$oY!o~Px1ITt&vlTRtDwp%*MCMoz zrR|X~aO&JKanwej=K9O<8Mnj+9m#x&5+>L#)`Bfhh z+ET&NEOWB1M=o4>=o{nFLPyZd;d#T!zDK~sy0DD4BrDI{=4N;Za3me#X zY|Uu;^|1ZmQR6zQWInwu+G&mJ*zm=?SFUIlPQkj%aczoRQBQY4l}*y<(ilZ&WOo-SCha}v8oRY2Tb-{sBuWah4R!G5I5nZ(yUt%RtW)fP9;5oAt4RW(&<~gY z4F~1`A>WAl8&gU*?zx(q-UV4_ZF$HuUk;}*jL~BgJHe%Aww4!aVXcx@67sV*1(DYU zDtOwTY?dZzPIE8sdEeiu1t|-h9?NIr?&`<0KjhlHs4RN|JU=XqrK5t&d$$8V^$~&a4Nz$@O4q2OM;q{E+ zN*zt2irEl1C%xThv*?@MT85KGlg&VlOYM-_H_Rj1=Qa$BD-L`+Ah<2{)$*iDAKmTY zsrI+DdtS>PWUud8<}97zjJ?LJvxqXSEg*iActO(iEOp{t@q}{)xb11-h)#!_>5=Hp z$DPc~?QYon@U1p#d1S zhCOB?S8W|krd?t)*VzxPE`l*hLya4^^p{>IeSw9F_MdKX>L7}9k0)Ml?k?wZ$!jJW z&XibZI?h*$E)Xa_$QLw*V`%cp4Qv-4>Ufl#Ot$(7Z-lj1(Wp!?6ZKxjF2O1$b7dz# zm%r;@IN93T1ZIFZi>`coWpHqYH9LLi*H-yCZ=dK(`{>Y4VknhI=$hD0??JkwFd;c= zPKbHv17K6(#~}dtpo_POv1P-lRl^jV)%lZm8<*1zphp|z%R^+##ZA-L?R;QYCuZG> zv?>%x@u)b*(Q4f++8J*eBcEOMdXIem)1kGQ4+-y z#WI=5YvrP@S(u4Y>l2s?=S;k(6-bsv9Vf+a5raI$O*hc;QOudMMkolr(55N#}wXBD=ZI0OCqE;8RP zSg;^)kUOvguLbo^Ur0SQ8H!UBlyTDNVsmPnpT1gS1WBXxb^)y<{xO6b z)3I+*PWXI=R%Yu0dFz76ag{2JOP^k06KZRFF*oY5#Peeb80V_2aL0UkD>p%(deH?6 z{;^Bp{9BZpw|SRXU-}Ne%<_~V6;%iiFw?4#Ery)J1(HaG%;AreMW9qOk}*rMb%Z(eAAKoVr}A8C*k z0jH9y0Zt`1gf;>sKQ@E5gth`CLbeAaJa&VA5A6pykvtSS9FX)l25=U6){ivD`G6$H z#n9!@70^{bP9<;rPb%Y4z?tO3fYZpwexx$a2Ap7?0-Xw-4oH%m0Z5tb066E|76|Fr ziQzx?*8sVTf&ST-0|JuQA>#d~2;aZK0hg7Hu>;MYfAZ{~pZs$Gx$S>{4E2N8~k(Y7_#wJ->eCP@r!#V5Ctl zTK|J_0VW4M33A`%L0Jo!kW`tyj5BSi8~5Pr3#%(0=l($N_oBpnNuN_w)Vq366&QVa zO5w%%B7=B4iOH+lz3#Y>gC)=mQ-uphM(RNrn!PB3iwi0BRVNJDSY_*15SL`4bU~1V%I=7$U*LsZ#9^{ zlZ|zLU0b(m`}tz9xD@1<4{t7EiTMU&*{L=y@IP{UIC=Y!jCoJhB|Mw-6MgXi)LV6d zV_@#E78WbZCQq|=!?37eONsC-p(+N2ZcVq7KR8qVn;yUGL#xNd>M8p3tySU&Imgzy zXS6$~;IdSia82O|(&B+<=4z%y!Wb>iLl#%1?aV18P1t!gy(;4zJxSd1sYG8*ph8FIz zeyd9rgJja7C4kf|M532t7!m$X@G57fIk93yLv}ewtUjlco@HNM+E>2iIWp^uu7ehZ zQ5=!t*86bb6|Yy40;&sEhtx0JdkG3AJ6afmhs80}1c7h&Qw1h9y=HIllfuAENUAx7 zl+B?4mjpO3iEpG~&ag6hBI+f6igjPccOpy{n_Ns(r<1pSPcubulPHbPTM5lZ- z;J#n{*sGy>(xU&Z!RtA z1~Vp55D^Q6SU4f7BawgQVN$4f5N{E3T-GWmvEyWG>Sw^aZsR^ue(@rSpS@UQGg}%; zxX7H5Qx6EDo#+_jnI*%vA{Vj|L@WFg)ob2rueMI@-<&t(g4%1fEihJ*-+Cv_l# z5KgMrz_;6F(mfG5k1v-*iB@h<`nCe8bvd*oHcm{JKF?~!z;VbbLIWIx)IsP*pQ+qT zkHqA6m&-~!-5srB^)qi^`S#rDZ8`4icfHtJrAKn?J6L%~xnkjQ+xCu*tm%V^Y5xK) z+kG8)-0i{vq_tGtb(2(+rCAXoQw%3<{#oU^&vP1!B||K%2zE9!d-#d9q7W%YZ?jXv za>Bb|lLP&koGSe9FQa%5FVG7 z>Mii5jW*FWJ*&coiCgMao&p6*=MNOXXm^u+k-#_&kTbnR^IjqUWQ0V+1HWNtajjCjAVX$^(g47^&u zt6OPdH0A&`T*DXX4g>O`QiASzz*iyippEUOgU~25GKXEg5?QTloxo+BgS8qz!GnV~ zrHvYe626`0m{EevnP#(2!x0 zXMUebIFjPb!Y0lkP8-5Aq48kM)hJ7Yvo9_nRh@+3U8%>XgbO6RDDFTpZecda$4?`g zP7oJbDkxw}m%sUL05u97t7lvJjeT;7h=%eB@5G(p#Ty9?q4ZpUwab!5D^=+Ip@U5SoMx;EY8J0GzR*&@--x=q6aSHoohT5>0If^q zrCyI@m%M%1C$U9Lb+pQbJ4g4LoKM@DujU!JF#@qaac=|!+-ABJMN;tY#1|Xo)gTtV ze6wV?zzs#Vy80?*J#%czvhTUKkA$xR0bC0v!=;4(Wgb7%TTBg!Ud90@#=2$@pSlDz z4EQ|E4=tnMCPt7;_~^2O%%}rG-PEU;$EC&7YYKlc;pGDXx9Y^u}p)|hibH+ z<=wkFPaU<;CBC+8BGKiT;9y$Nbt^YRV#kI`k)vXyBPDw=Lnov~c(YQ;u+| z?f~gwBd-zFtZfTR4vaQ2uQ*z3x>jr&3EV{R{8zrRAP-+WiKVvkrG2RTb$eG@8>k{{x`Z*My zrMLO{^RsX&)}ZvM0DT{|@~;aGsj>T?AZR=T29a_s+}vn3 zb$6Mf(?!|gHV_ZQbD=wu`Nq7T&3!GY5crfoHgErGEy-A2?-;Krx%$IUKsE=j$-_*6 zmdUVepb*mH=<8#D?vh+Y*a=%nV#2p}GHqWnAv`krC_gMsQeZxWZSwE`hJS6hZ$i>qpuxri~&LsTjrjxxxzcVELg>D8<=0@#WtZX z#q({5m+n!|+^S4v4k3*^Mn1MtUunzE4vR||HM*XNcaXfTJyoQZg}|Ibz-5PmVyRr0 zsWwv6XlI?HE`RsjLfnik7YlW}nIku~N9a}OM|rAoh4)8LuuIv%t+O(1eZ!ZOGfwd9 z)q7PRuSJd=oMw4=Il%c?khwu%ZCOi$cD0*oSaxHQnCB#FS*PhJ%p1T}Jj&i7Y~7~1 zq?1ORSMFZOG#71fr))fkC$Kxg_dD`<&%S4^yWsRL(j6|a-GKepF1j+Ic~!9U5d2{J z4V17p<>fo+%r!ZMsOg67;)_S4MK{Uq z0x5u5*92U6|2FUcnA4}NJGC$sbZkOUCP6fh*i|BGmv->VbQVU7*_?5)2P{*WrCAOvzW;hmaVt#HnZ0R8x@ zECEcOh@}42_Q?KQ&hX&eTu&liegZZ+Qc^NHwz@b`mWmAgrZ4kjD>!JJh{(rS*r&p%faIeqW3eG#bQ&YPVO7@*e29N=FvBf)>>g zTfFl$CVr|XCp>c+F=`q!VXyz{51ebf!3S!E4 zoYeCOz3Yv4HUq<*C>(Fo%ywQi3OP!J*t=;nd-+X9wIAnI4vvYh)ST2P7;sCLrZ4RU z1GQ8v*pyhl^``F~LeE}^{yGJRiay92;Li&)kW8P7?;wIMfm!@Am@m9KJc~Y(t8nxz z@-y5*lj#e(&C!(?q&metAfWsTb3!XG)JTPGz_h3aT4~$&9&`~QdMBWY@{K=V#|FC^ zfgRxh2TO-0a<56Keobt-JLx;ty+awS((pIV(I|H!@4WMsO1f;XEHl#g>*>Z;B<>1U zpjRSZn$&^n-h=#Im1hY_>w*EbIs^d(g#9OdF|alNt}7L?>ZYxL$>W9Msy<@+xZ7p9 zAAAc;E3+THCO_|l22Ia|r02DV9f`QiwkXMWDuf%w7+ z1->`%qK&8~$RptR48SfJ&1(1nzm^0iBER~^XD*tSDFKZ8`~EH`rIhnSz+0BXle`2+ z4yLGE)r9B1u!3CdAxvS6A3+rNZj`f*#|*|bJ$ce+pCQm?8EJL%8F8aINFpfPz!B3< zftZw8hA&1#EWf@sF1LLPn?#YAPXGgsSBD^o_FePN`_N z_;Mq*sYuZd8#;&3nyqoan~k$gWewkFhMTWDv6wJbu2J@%1Y8Sm(i9Nb?)^k#;@6ic zjdAK?AjnSg<+1521z(`HN~9h-KV%hizf$6sSwfWsGp%v-A6F2Gy0DcV5QLyacL?Ym z(U+AXFN$K%KE*TO5Q&2Czd?)Nc#~-c#;IU*x@MIxl&wJWk|iq&UY|DLC}B499S6=) z23aqP-1<3if=+m!%HI8>Nmv$tu+3XQ>&XHxg1@!m9}E)3;K2W7kZ3Ai2|^P~MdfS4 zkI1XSqJeD#J$gZ7@zNRD01tlyxc;b0=9YTDn;i&xdRY@wrnBm5J6Q^t;~){n3|oqo zF_DwVGkBdhtx_qzpFIn4VnGmB4R@@8A3gG(dG=fZ@VH38^~Z95f8^8U2Fz4?{{NP{ zJ&UN3xS~1}MPy}GZ0SETM#+et(2Jg?^ImJEXuJjVu2KZ(j~)%h4~e4yu#Xym z09fKbJ=(%j@5fw;+E&-b*viga#>I4&7V%**bvdTmJd(-b0vMz(h8AYPix>+ICcrG& zP*#;ba*omNZolqCw~x04V{7-OVgDMh^_6V8`0JuYKlKFV;*uT_NQgeQcB7UoC?sU* zHH3FY$GCbh!>k1#k!ZGt{NgWsG^>3C&<<6ey$! z$Wd`=6TYx0owJufmhvpZ*HJ=O$S^UGIh$m(EGsvv;OId$O_jG4GgOFyy!V#hg@0>o zx8M`COwxM}legxHJ7goTx?%B#vXD?_;p&;A10LSp$HRq#$26jK5^e^vGz=EtQuk#@ zA@7+xjty9FFLH_@(1ong>tivGr3*l1S}hNQy$$t0vOGXVoVIId%)b!iArz7=DE2C3 zIO4#T=uD((lq5v)sanWyq{62H{O`GMKb5pXPTX>g2eDy85$;X2nO+sXJT`W;=lek1 zYl5#f&=D0Cq=UWZ`4x3!X}NcM{e?KQR3Fw`adli6PSywN58b zsuGaC44_byceA1LDgmIctd8qTuol{;?iHc+Hel5%iIt0dzJZH_PRy}ta zg3&)?A#r06O>C}{Z{o>PIO%9S8L~57RM_>p&tXn>Id4IqQsy0*Eh&7uxaimRwmmQK z6EsqgGMO2qx_I%dnGy-OIz29jZ%fW{6b5lB(J*=2X)EJwuQ9nL2d)zfzS1k^)jiLS z?suNIVkPWnPX(sKW(he#a!zK93@jOV{YBr>!SF1>))WQxBC*vxl-$ruz4xt7&`5FA zXD(8-n5Z=cy5M-xsxuT;7=wqpNoTE6D7=eHrJc&gDDHyzMMqVWi99aD49%z#*rqu~ zNQr#%2(fSFRtc=;?CDB5TQ|mnD-j0!ZNzHp!3>F2@Xeob9I70v%H@YvoXhRzQ4$P! zv*Gf@TCW)CpYev>WBopi+NI7@VAu?o}Q14Ky?Y6UxIv!#*q;NKMNY z!AvAIg4ufE&5h1ZPjW-?2_eC&W`z%{YOtua38V|?rpsV@m#dYv!suBM?IM{RMR33) zmp6fjePTkUch4#k2PsPp1H!BDl%PjYyHP{<9#ORtOn3)vNeWpdD{b#iZOI-x0k8 z2flkrpq+{lRZ2E@NNNwSDE1X0Tg$gi!6vb&Iwo!{>lIy>b9&~g&j2*r{wor)a7v0v zWv|0KmS<_?kXyH9@7iRIqUzm^_`Y(P*pK$Cy=o`%_U@%kH8oiAA6}B>JAGs875CEF z02LAZWY_YAb~rmp5aP|ba_LMb4N_I7{tJ*zY|FCYY_2dUW|iO<+U<+-7+lo~QDVUk z9dD7S3a#^#_%1~e!0V7NQponoiz(G|b97`C`qAp%~f<4_cF17+|&_K*I|<9(4k z_w~!k&0C!SDWv_SdNL!>-FU}Y-BB&7;DLhPc=??vB9c$zXddOy{f6q9=IQq>ThCic z=?Nzq*rrt%HA;}!va5^YrELzR#M{qrhZttEo$ARcq3iq8LL3$i!&tbK_K*>#xKeKs zKio%{;c+H>3f3mmObjT`;<0wor_S$eJLAqo2>LXg2I+>`qicM-fOG5BgI~@aXAdZ85o3M|Six5lM$a zLm||oP1^G^HXRq#u@*-SXyZFS2x8%WQlj4+CMEh}WKc~Nr2-x5o?L?`Cm+5_q;TsW zm2R?cuRCebFn{RjN{gS@F5|9yqfngEN3$I(YEwXX^P=;bETDRJR!c<6G?f8cP%V zj_t`WZrui?*44ujTL+9%kw{Im`U_|Hd&|0NMZNhd*2cWypENVxxUSbMPF$(_s9Kqs zNu?)!(3o^sxlqy#WoYzc$C)ODYbETL0zn=keQh?TXk^v`PGY#9lOa+ZLEIoDmgI17 z>~nJho_@5>g%?K_xnLyXf->Yzv>C~&bzj5d9^j+R(~5HmuMzlifup|f{lz*3L44z< zI*iKK^;Dw*2^KVZ;GjSjD56K9ZF2!btzf4sw!CIt1lZn4)yjnBv|QO1S@1UD8RtPe zjCr5B_Q+F?B__+PO_2fl(kvFkqd@r{R7x0Lnium@xrQ5>HP(>DnK8_N#6hr}l@Vsq zc~0ymYl(>LIDSqZp!2Z}k10abu%GE8X!c@|c2dqfqHt_bzuP*>!;~)e7mhoqy)UEX z{t4+UVklWuil~t`CsS_>ZWu;T!Y5$(E+rJUrD5M z1lJiiKlK3q-HyYh!I$*|ro-+4TmI^=0~H&6v+rh{TG!ITz}PTaZqLGt7VdU2+drJd z9yw!%W0&f!AMbLh5y2Z_l@Q6X18PoeS&BrGww_V zIBLYN;|gf4nDO+`63ILWWIIk{D3DnM`dqBzaMnxaW&y0jWTLf$O3)$*e4g2pdZ9G0 z>CV9iwa!5<@k>T9zHx=p74X*(lt7?7)b1ACNmQmce2 z<6Rh)p2?^}^9rI10TTrt42rc|ixk@N2owIq~u zYupXx&WAHhed52YxgGfzJ{KE;%MRWtYN@c%r&Zipo{|d{?QVv>4fBQ_(Oeo2RY^_9 zL&zmWb1iOu-AYW2YheDVoT*YaIo<7+eEg-Mzft$Qrr$MU$)1sVt_4gW98PCt5f z8+!{2eVbinRofX6B=-$PyJ93#HZw0 zHx5Ia)NCbX(FK6b(P-eXcePE87jQ0NGaGZ3dE&ayb~l*42WuKuEUKOFZm{<2`k$Gr z$($=x?^X=GCghcIIK$)}zry*7u&6X;BsS>VwxGxLI^ndd%(;qtOGz@8T8V`Qw<^`c zi&PSSs%8i?W_@b|)g zE_0e*$JiCXOI}R-VerO8R};p5vuWzu(cSEc=OoDxHaM*4aB{=}Op0kSk&p!6SYBLl zL0d5uXezR`2&5Nek@-FPjId5J=Km4VU$Ysu^i1lOJ%#nL}(5y-WK zqLTlr5QxK*^TiZ)KDt(ec|I%f-p8)XZIw>}+Sh|IOu=*6LH(E%DiIu7Qfe-l4-4)2;MMn1)t6VJYr)iv z#tM2DKO{9yeEAfG?SsN(ZUxGHU{Q||XK?%~A%37+@D`fv`dkuF-xSK86C)<>g(T8| z=@$k+u69GmfV@Cg#G>2{llYe@eUvg*3%I9+#rV{GvX~<^a62F|cIwz#FFO<-OhMe7 zST_ggIN4zc}#6TBb+LW7(q{=F-n1eDR>Dgsi*NI0dwx%BONScGL zgm@odN^wVJMeOb^R;e>yL<^)b@hUy1ZKoL}Ukv_TOxg!j`jk_Mu?zS+u2eV73n>cE zXkK4cD+lyq4=?-KE|`ns*?U3~(n!3BCc~sG}H2AQQ^GAhG#K!D__1f#%rP?H19MUs9QJ1 zVyqb$-~cfoYX>(B`82Y5aL39sdf9CERq_BK!ff`=tNlap$ps$~1k|`7F8&{-7pNSQLPNtp%Eh(p|uUuMs|VH;Wn0K)lC~Q{;Vj~46u{+^9~IA@C2d?xfevS5Jku+8Z@?Hz11edtwu)h=^OGOs=v zH<&G#I+Wm&TMQUkQ}bU^7I=2V2QP74&!KnEf9$s|qO-G;=m1rzwH!@!KvU3>ggTri zbo=5JjbuIpmed8ZG>LLTY2Zf;)Imb1s~nafpo09lrwOC5XELz1N0j0=zc@3N#T8XS zVE}~*bLje$c6I=QT&wN?%=C>$ikRpZqy}f%4r%&Z$@e4J`#zfpz1WnWll0g7%LqEx zR;}I}!mF<;4BwVMD7j7hkzk&iGkBSM-*%k~Mhh^A0%J6SuRvJyUhY7nKyr z6^CIBJF^6^#@Z;fc-(mrK7Ntz=)DT!8khNHP_$cx&1i8=7JghSNE0=8GSfUX^Ph7i zEMHrCa6R-UnV(d$gSe7HZ83%1j+`2{%$h|DN+usP0nXeW>*=~bbjG=40F#6X-ZE#t z@rIu7GG4~LcCB~AA64Y$QRzO-*O8_C+^5uEz}>r+m|L~S;3TbCn}baxuKs4hoK?aw z2sTuF#QhD~bO)G8-EQfgU`kbYb4`ZQtJl7@P5rOWm0#`a>XZzLBH$L+1*2S`r zR;|LsA#eJPdIgz*^;?E5PF&3UQZ%}akCCN&TC5MI=>2`P&V9ZlNWeie5xfXum8_0zMRPcODm%WR8TaXy(^ zDTre2fKvd5g30AKNlLBiv1&SvTUlHeymQ^IGy>jR+3Le=He-Oz#Mvls4S*z@4wnhuZ8L-eIOUyU63~1ybjrN9>nPx8^ny^9)y6(m_NJq*T zy;1uwC`1>#=2O{2v)1AlZ&;_a7jdLFX>?1Xm$d%i)+lmWPA^t z1<7^GBSH$v^}&2gEuwgM-Z6Ai;1vl&3<$4{e zq?jg!n#_C$k~WY!*(j@^g|#0#qK)?sf;6D-1&XdKPNjQ}e!mit*yRdU54qpWy&4|sa;+*@*BYy zg`OsG-Zm5D3M#UFB(NPq=|)uYD9C9TG5D&2&vRGEj6T)58e!FHB5ZJKqE5bI|FQ&k zO(s0kTJo0HF!=ooRxzR@u8?3((^rj$mLjRcsWG_LMKAmyHohtf38sw7od=8wD&^!A z3ox(|VXM8FRiTYJX68-!CX>541HoFrx!~A~Xl40(oq#JQgtG!#zXWg*{B=s` zU{0-VV`wWLAub6*hv<87L(#b_po`XW`FusdGYIny^tY}MySlRB-TkO?Stx>A$84wJ z(@}?o3ulfoMjw`O!YLRhAD+r~;!jRxi(Ou1&;0xr*37dh@?wdNVL(kyy`+>OvyOJf zo@0peOukYfi5Hw`3gm7bxd`sH{t%chpBXbnc=Y;9Gqdfcav&~OmlioKrQRt%G`PuZ zFLSujL`?m(mUl82W>MfE%`4_dWxn8uw;`g;x_esFo zYBS**(}JE)z`*X-eh7Q?nOhp`%2_XaNhl+zg*k**RxKB$iSJLqU{S?>vI($%c{%@u`wZ8-*YEikq%I=$y8Tmjr)M&Z`095uf+N3F{Mp~}-9 z=vPEi8SzDv#hH`_V!jKsDVh$9nLUW>kAY6sY^Vz*3gsgRN=HuZ5&*em;hVvV)4BAK zt_S}dOw9|nc|h6i5@yx(GB(AVPgSa7;_4L`eJMc@Um_s!_Gnn`tE?|q*Bie61K7+a zv8YJun=(hqS2d8Mju_U|B4GXx8*SDzFRn{VAwL-zhqw9$GDXQ)u-VG*+V1r#rjjiZ zlP^{!1c_kr7i!V9T-N7BIoSwb?|lv0xAkdTtwafk)qSa`2FE@ELrP3duZ-WBX!IGO z{EZ3CaRN!<%eXsFRQ=r#S-54Uc?2NfB?}B(?^%_-YXzG?{ZU!n=vTU5 z)rg#6J7<~3w3<;_ch~XduYu%EFupkm19hQmJ@v#GALqiaZIhyKB+Z)ZVDIoOz$5$G zmdNt34l|2=p_UrX-RXbe@)_5wk)vJ31dfX3&7OppoujEh9XD&;0RbnI^6qVV^Gg(eWlBA0K-2 zVnC1~d(+i>yj=<{tn}lC59)D4^O^RloFyevia5s`^A%ENR@nj_j?MWUmExpvBLe(Ooka<&QT+>WCg zOYOkGq7JIAX0R1r^2PM#m9;<*C>FTM8EYs;Z;YzlZo8xIK^jL>DW1xdMHpOh%>(S> zMVW1K=iF(5`^z;ppeR0Hq>G6+hZF1GZFJiQwrY z!hxq%A@VM#tC$qsI)%HxQUlT)J}MbT_C;5fqrcp;4~lXJ@8UjBjNDFVb{=XU*TLAOnjX+_8vDJ8u2~?rJX=b-K9!rE+yG47ATeTTFTh#*ViuQ(>_($Wu*2a$OWp@S$(Et$8Tt^RJb&xf$n1Tm1B4OLnxW4TUduZamUM?OxuI)1WmoXU!!JiVMNK<2HvRHMjY&kJ}Cmi_d?#@oJ5LR8yO6k`k zxF%|ixL%>#?90jI(%RpSk13!I(Ukd0?!~Y=dL|;nzm#0Jny|KM*$@Ox4bhiMUBd0e zZI3@bKJx58791B%GF>sq8z529Dc;Rd?Ocy8B)Vb*N}2DDwq}w#9;gL*H&#FJU~ui2 ziZUVhj#RrcDA)X?@z!V75K{+Q?qrzjV}c_A3Kmyl+=JomF!51IQZ*Oj)gg9M?|t(D zv5kSlaZ<4HHovLvlfE z^?6nltUn{uvc^@bUNz%hQM8}^Epm1$y(J;>{?5Lw=Bg*z-J%UD?!3rks zcjlmRf)B0^rLsR`b1Axb-ij`D<~W0nvDF)DQNFRuAODc%V}Gp33NLu{CfrYx9=^UL zPD1<|mUtZX9C;buZ>#<8;XT>FW}@C(;YnTO%=5y016eUcLS;Y)ve$Li@6~)c^-v~`@9SZ|pOrD~o40>ZlV{|?k#CMfL%jNj7$T`$gW z6&F1H1W*^?6r9Y|Q?T zmuG_(vSb&~VsQW(pzZ#rx{vOj20H86nf+a_DkT%YsGPO_l zQ^ucP(;1wO2MFj?;<5V5Ek1#=vIGqD|7!d1E$)NV0Pj>Wz^Mz+Hv&HYbZMP-0J(lIB4ox> zAbTA>W1FWt-_IKrrv21_oCIu-s~)uI3DiGB&Zj%K-uD8D%mDjn1n5eBmkVy;3D`e= zu}@V!yCp5tE+-JsrP$-TasvkYx4!;)obotr_^&q1;Cce|-z4I{hGYL83InD~|I>Kv zDq#O4J^1tJ8Sv`;&n@cz-11L-eoun%&&^M#LHH$i;JjPe}DR{O=d1TJMjX zKMD0XeD4=bK>uH`e+BbBF5=_Bx?i-bztR3A+~Z)lU$`iPKMVIyXxwAr9tWWPqFEUJ zh4!Ctw8yl^fmgq1?M8o~{U;3TG3jye&o5FSAlmYgmi=sk@1#Ff+T$>uU$|$cf581G zsOPa@kE3&bkv#uK`jcRf<7$54(9QlV*smy?$KpK>mifht{1flT*4OvN!Jnhb$Hd2B z4!?-xmVc1&2k{R<50CMWoy>pXVQv0~|Ne~c{qmcgd@SDM zeXn0Qb-%yi{=EzKnEZG#{1-VR=>LWM+tT=B_~T{KU+}Y#KfwR9Ncx!ccq#7}DJbkO bq+iVg4j3u|0r3L -%%%============================================================================= -{application, fusco, - [{description, "Fast and Ultra Slim Connection Oriented HTTP Client"}, - {vsn, "0.0.0"}, - {modules, []}, - {registered, []}, - {applications, [kernel, stdlib, ssl]}, - {env, []} - ]}. - diff --git a/ejabberd_auth_http/deps/fusco/src/fusco.erl b/ejabberd_auth_http/deps/fusco/src/fusco.erl deleted file mode 100644 index d21b64e..0000000 --- a/ejabberd_auth_http/deps/fusco/src/fusco.erl +++ /dev/null @@ -1,642 +0,0 @@ -%%% ---------------------------------------------------------------------------- -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Oscar Hellström -%%% @author Diana Parra Corbacho -%%% @author Ramon Lastres Guerrero -%%% @doc Fast and Ultra Slim Connection Oriented HTTP Client -%%% -%%% @end -%%%----------------------------------------------------------------------------- --module(fusco). --copyright("2013, Erlang Solutions Ltd."). - -%exported functions --export([start/2, - start_link/2, - connect/1, - request/6, - request/7, - disconnect/1]). - -%% gen_server callbacks --export([init/1, - handle_call/3, - handle_cast/2, - handle_info/2, - terminate/2, - code_change/3]). - --include("fusco_types.hrl"). --include("fusco.hrl"). - --export_type([header/0, - headers/0, - method/0, - pos_timeout/0, - socket/0, - port_num/0, - invalid_option/0, - destination/0, - option/0, - options/0, - host/0, - socket_options/0, - body/0, - result/0]). - --define(HTTP_LINE_END, "\r\n"). - --record(client_state, { - host :: string(), - port = 80 :: port_num(), - ssl = false :: boolean(), - socket, - connect_timeout = 'infinity' :: timeout(), - connect_options = [] :: [any()], - %% next fields are specific to particular requests - request :: iolist() | undefined, - connection_header, - requester, - cookies = [] :: [#fusco_cookie{}], - use_cookies = false :: boolean(), - %% in case of infinity we read whatever data we can get from - %% the wire at that point - attempts = 0 :: integer(), - proxy :: undefined | #fusco_url{}, - proxy_ssl_options = [] :: [any()], - host_header, - out_timestamp, - in_timestamp, - on_connect, - recv_timeout = 'infinity' :: timeout() - }). - -%%============================================================================== -%% Exported functions -%%============================================================================== -start(Destination, Options) -> - verify_options(Options), - gen_server:start(?MODULE, {Destination, Options}, []). - -start_link(Destination, Options) -> - verify_options(Options), - gen_server:start_link(?MODULE, {Destination, Options}, []). - -%%------------------------------------------------------------------------------ -%% @doc Starts a Client. -%% @end -%%------------------------------------------------------------------------------ -connect(Client) -> - gen_server:call(Client, connect). - -%%------------------------------------------------------------------------------ -%% @doc Stops a Client. -%% @end -%%------------------------------------------------------------------------------ --spec disconnect(pid()) -> ok. -disconnect(Client) -> - gen_server:cast(Client, stop). - -%%------------------------------------------------------------------------------ -%% @doc Makes a request using a client already connected. -%% @end -%%------------------------------------------------------------------------------ --spec request(pid(), string(), method(), headers(), iodata(), pos_timeout()) -> result(). -request(Client, Path, Method, Hdrs, Body, Timeout) -> - request(Client, Path, Method, Hdrs, Body, 1, Timeout). - - -%%------------------------------------------------------------------------------ -%% @spec (Client, Host, Method, Hdrs, RequestBody, RetryCount, Timeout) -> Result -%% Host = string() -%% Method = string() | atom() -%% Hdrs = [{Header, Value}] -%% Header = string() | binary() | atom() -%% Value = string() | binary() -%% RequestBody = iodata() -%% RetryCount = integer() -%% Timeout = integer() | infinity -%% Result = {ok, {{StatusCode, ReasonPhrase}, Hdrs, ResponseBody}} -%% | {error, Reason} -%% StatusCode = integer() -%% ReasonPhrase = string() -%% ResponseBody = binary() | pid() | undefined -%% Reason = connection_closed | connect_timeout | timeout -%% @doc Sends a request with a body. -%% -%% Instead of building and parsing URLs the target server is specified with -%% a host, port, weither SSL should be used or not and a path on the server. -%% For instance, if you want to request http://example.com/foobar you would -%% use the following:
-%% `Host' = `"example.com"'
-%% `Port' = `80'
-%% `Ssl' = `false'
-%% `Path' = `"/foobar"'
-%% `Path' must begin with a forward slash `/'. -%% -%% `Method' is either a string, stating the HTTP method exactly as in the -%% protocol, i.e: `"POST"' or `"GET"'. It could also be an atom, which is -%% then coverted to an uppercase (if it isn't already) string. -%% -%% `Hdrs' is a list of headers to send. Mandatory headers such as -%% `Host', `Content-Length' or `Transfer-Encoding' (for some requests) -%% are added automatically. -%% -%% `Body' is the entity to send in the request. Please don't include entity -%% bodies where there shouldn't be any (such as for `GET'). -%% -%% `Timeout' is the timeout for the request in milliseconds. -%% -%% `Options' is a list of options. -%% -%% Options: -%% -%% `{connect_timeout, Milliseconds}' specifies how many milliseconds the -%% client can spend trying to establish a connection to the server. This -%% doesn't affect the overall request timeout. However, if it's longer than -%% the overall timeout it will be ignored. Also note that the TCP layer my -%% choose to give up earlier than the connect timeout, in which case the -%% client will also give up. The default value is infinity, which means that -%% it will either give up when the TCP stack gives up, or when the overall -%% request timeout is reached. -%% -%% `{connect_options, Options}' specifies options to pass to the socket at -%% connect time. This makes it possible to specify both SSL options and -%% regular socket options, such as which IP/Port to connect from etc. -%% Some options must not be included here, namely the mode, `binary' -%% or `list', `{active, boolean()}', `{active, once}' or `{packet, Packet}'. -%% These options would confuse the client if they are included. -%% Please note that these options will only have an effect on *new* -%% connections, and it isn't possible for different requests -%% to the same host uses different options unless the connection is closed -%% between the requests. Using HTTP/1.0 or including the "Connection: close" -%% header would make the client close the connection after the first -%% response is received. -%% -%% `{send_retry, N}' specifies how many times the client should retry -%% sending a request if the connection is closed after the data has been -%% sent. The default value is `1'. -%% -%% `{proxy, ProxyUrl}' if this option is specified, a proxy server is used as -%% an intermediary for all communication with the destination server. The link -%% to the proxy server is established with the HTTP CONNECT method (RFC2817). -%% Example value: {proxy, "http://john:doe@myproxy.com:3128"} -%% -%% `{proxy_ssl_options, SslOptions}' this is a list of SSL options to use for -%% the SSL session created after the proxy connection is established. For a -%% list of all available options, please check OTP's ssl module manpage. -%% @end -%%------------------------------------------------------------------------------ --spec request(pid(), string(), method(), headers(), iodata(), integer(), pos_timeout()) -> result(). -request(Client, Path, Method, Hdrs, Body, SendRetry, Timeout) when is_binary(Path) -> - gen_server:call(Client, {request, Path, Method, Hdrs, Body, SendRetry, Timeout}, infinity); -request(_, _, _, _, _, _, _) -> - {error, badarg}. - -%%%=================================================================== -%%% gen_server callbacks -%%%=================================================================== -init({Destination, Options}) -> - ConnectTimeout = fusco_lib:get_value(connect_timeout, Options, infinity), - ConnectOptions = fusco_lib:get_value(connect_options, Options, []), - UseCookies = fusco_lib:get_value(use_cookies, Options, false), - ProxyInfo = fusco_lib:get_value(proxy, Options, false), - ProxySsl = fusco_lib:get_value(proxy_ssl_options, Options, []), - OnConnectFun = fusco_lib:get_value(on_connect, Options, fun(_) -> ok end), - {Host, Port, Ssl} = case Destination of - {H, P, S} -> - {H, P, S}; - URL -> - #fusco_url{host = H, port = P, - is_ssl = S} = fusco_lib:parse_url(URL), - {H, P, S} - end, - Proxy = case ProxyInfo of - false -> - undefined; - {proxy, ProxyUrl} when is_list(ProxyUrl), not Ssl -> - %% The point of HTTP CONNECT proxying is to use TLS tunneled in - %% a plain HTTP/1.1 connection to the proxy (RFC2817). - throw(origin_server_not_https); - {proxy, ProxyUrl} when is_list(ProxyUrl) -> - fusco_lib:parse_url(ProxyUrl) - end, - State = #client_state{host = Host, port = Port, ssl = Ssl, - connect_timeout = ConnectTimeout, - connect_options = ConnectOptions, - use_cookies = UseCookies, - host_header = fusco_lib:host_header(Host, Port), - proxy = Proxy, - proxy_ssl_options = ProxySsl, - on_connect = OnConnectFun}, - {ok, State}. - -%%------------------------------------------------------------------------------ -%% @doc This function fills in the Client record used in the requests and obtains -%% the socket. -%% @end -%%------------------------------------------------------------------------------ -handle_call(connect, _From, #client_state{socket = undefined} = State) -> - % if we dont get a keep alive from the previous request, the socket is undefined. - case connect_socket(State) of - {ok, NewState} -> - {reply, ok, NewState}; - {Error, NewState} -> - {reply, Error, NewState} - end; -handle_call(connect, _From, State) -> - {reply, ok, State}; -handle_call({request, Path, Method, Hdrs, Body, SendRetry, Timeout}, From, - State = #client_state{host_header = Host, - use_cookies = UseCookies}) -> - Cookies = delete_expired_cookies(State), - {Request, ConHeader} = - fusco_lib:format_request(Path, Method, Hdrs, Host, Body, {UseCookies, Cookies}), - send_request(State#client_state{ - request = Request, - requester = From, - connection_header = ConHeader, - attempts = SendRetry + 1, - recv_timeout = Timeout}). - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Handling cast messages -%% -%% @spec handle_cast(Msg, State) -> {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} -%% @end -%%-------------------------------------------------------------------- -handle_cast(stop, State) -> - {stop, normal, State}; -handle_cast(_Msg, State) -> - {noreply, State}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Handling all non call/cast messages -%% -%% @spec handle_info(Info, State) -> {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} -%% @end -%%-------------------------------------------------------------------- -handle_info(_Info, State) -> - {noreply, State}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% This function is called by a gen_server when it is about to -%% terminate. It should be the opposite of Module:init/1 and do any -%% necessary cleaning up. When it returns, the gen_server terminates -%% with Reason. The return value is ignored. -%% -%% @spec terminate(Reason, State) -> void() -%% @end -%%-------------------------------------------------------------------- -terminate(_Reason, #client_state{socket = Socket, ssl = Ssl}) -> - case Socket of - undefined -> - ok; - _ -> - fusco_sock:close(Socket, Ssl), - ok - end. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Convert process state when code is changed -%% -%% @spec code_change(OldVsn, State, Extra) -> {ok, NewState} -%% @end -%%-------------------------------------------------------------------- -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%============================================================================== -%% Internal functions -%%============================================================================== -%%------------------------------------------------------------------------------ -%% @private -%% @doc This function creates a new socket connection if needed, and it also -%% handles the proxy connection. -%% @end -%%------------------------------------------------------------------------------ -send_request(#client_state{attempts = 0} = State) -> - {reply, {error, connection_closed}, State}; -send_request(#client_state{socket = undefined} = State) -> - % if we dont get a keep alive from the previous request, the socket is undefined. - case connect_socket(State) of - {ok, NewState} -> - send_request(NewState); - {Error, NewState} -> - {reply, Error, NewState} - end; -send_request(#client_state{socket = Socket, ssl = Ssl, request = Request, - attempts = Attempts, recv_timeout = RecvTimeout} = State) -> - Out = os:timestamp(), - %If we have a timeout set then we need to ensure a timeout on sending too - fusco_sock:setopts(Socket, [{send_timeout, RecvTimeout}, {send_timeout_close, true}], Ssl), - case fusco_sock:send(Socket, Request, Ssl) of - ok -> - read_response(State#client_state{out_timestamp = Out}); - {error, closed} -> - fusco_sock:close(Socket, Ssl), - send_request(State#client_state{socket = undefined, attempts = Attempts - 1}); - {error, _Reason} -> - fusco_sock:close(Socket, Ssl), - {reply, {error, connection_closed}, State#client_state{socket = undefined}} - end. - -%%------------------------------------------------------------------------------ -%% @private -%%------------------------------------------------------------------------------ -request_first_destination(#client_state{proxy = #fusco_url{} = Proxy}) -> - {Proxy#fusco_url.host, Proxy#fusco_url.port, Proxy#fusco_url.is_ssl}; -request_first_destination(#client_state{host = Host, port = Port, ssl = Ssl}) -> - {Host, Port, Ssl}. - -%%------------------------------------------------------------------------------ -%% @private -%%------------------------------------------------------------------------------ -read_proxy_connect_response(#client_state{recv_timeout = RecvTimeout} = State) -> - Socket = State#client_state.socket, - ProxyIsSsl = (State#client_state.proxy)#fusco_url.is_ssl, - case fusco_protocol:recv(Socket, ProxyIsSsl, RecvTimeout) of - #response{status_code = <<$1,_,_>>} -> - %% RFC 2616, section 10.1: - %% A client MUST be prepared to accept one or more - %% 1xx status responses prior to a regular - %% response, even if the client does not expect a - %% 100 (Continue) status message. Unexpected 1xx - %% status responses MAY be ignored by a user agent. - read_proxy_connect_response(State); - #response{status_code = <<$2,_,_>>} -> - %% RFC2817, any 2xx code means success. - ConnectOptions = State#client_state.connect_options, - SslOptions = State#client_state.proxy_ssl_options, - Timeout = State#client_state.connect_timeout, - case ssl:connect(Socket, SslOptions ++ ConnectOptions, Timeout) of - {ok, SslSocket} -> - {ok, SslSocket}; - {error, Reason} -> - fusco_sock:close(State#client_state.socket, State#client_state.ssl), - {error, {proxy_connection_failed, Reason}} - end; - #response{status_code = StatusCode, reason = Reason} -> - {error, {proxy_connection_refused, StatusCode, Reason}}; - {error, closed} -> - fusco_sock:close(Socket, ProxyIsSsl), - {error, proxy_connection_closed}; - {error, Reason} -> - {error, {proxy_connection_failed, Reason}} - end. - -%%------------------------------------------------------------------------------ -%% @private -%% @doc @TODO This does not handle redirects at the moment. -%% @end -%%------------------------------------------------------------------------------ --spec read_response(#client_state{}) -> {any(), socket()} | no_return(). -read_response(#client_state{socket = Socket, ssl = Ssl, use_cookies = UseCookies, - connection_header = ConHdr, cookies = Cookies, - requester = From, out_timestamp = Out, attempts = Attempts, - recv_timeout = RecvTimeout} = State) -> - case fusco_protocol:recv(Socket, Ssl, RecvTimeout) of - #response{status_code = <<$1,_,_>>} -> - %% RFC 2616, section 10.1: - %% A client MUST be prepared to accept one or more - %% 1xx status responses prior to a regular - %% response, even if the client does not expect a - %% 100 (Continue) status message. Unexpected 1xx - %% status responses MAY be ignored by a user agent. - read_response(State); - #response{version = Vsn, cookies = NewCookies, connection = Connection, - status_code = Status, reason = Reason, headers = Headers, - body = Body, size = Size, in_timestamp = In}-> - gen_server:reply( - From, - {ok, {{Status, Reason}, Headers, Body, Size, - timer:now_diff(In, Out)}}), - case maybe_close_socket(Connection, State, Vsn, ConHdr) of - undefined -> - case UseCookies of - true -> - {noreply, State#client_state{socket = undefined, - cookies = fusco_lib:update_cookies(NewCookies, Cookies), - in_timestamp = In}}; - false -> - {noreply, State#client_state{socket = undefined}} - end; - _ -> - case UseCookies of - true -> - {noreply, State#client_state{cookies = fusco_lib:update_cookies(NewCookies, Cookies), - in_timestamp = In}}; - _ -> - {noreply, State} - end - end; - {error, closed} -> - % Either we only noticed that the socket was closed after we - % sent the request, the server closed it just after we put - % the request on the wire or the server has some isses and is - % closing connections without sending responses. - % If this the first attempt to send the request, we will try again. - fusco_sock:close(Socket, Ssl), - send_request(State#client_state{socket = undefined, attempts = Attempts - 1}); - {error, Reason} -> - fusco_sock:close(Socket, Ssl), - {reply, {error, Reason}, State#client_state{socket = undefined}} - end. - -%%------------------------------------------------------------------------------ -%% @private -%%------------------------------------------------------------------------------ -maybe_close_socket(<<"close">>, #client_state{socket = Socket} = State, {1, 1}, _) -> - fusco_sock:close(Socket, State#client_state.ssl), - undefined; -maybe_close_socket(_, #client_state{socket = Socket}, {1, 1}, undefined) -> - Socket; -maybe_close_socket(_, #client_state{socket = Socket} = State, {1, 1}, ConHdr) -> - ClientConnection = fusco_lib:is_close(ConHdr), - if - ClientConnection -> - fusco_sock:close(Socket, State#client_state.ssl), - undefined; - (not ClientConnection) -> - Socket - end; -maybe_close_socket(<<"keep-alive">>, #client_state{socket = Socket}, _, undefined) -> - Socket; -maybe_close_socket(C, #client_state{socket = Socket} = State, _, _) - when C =/= <<"keep-alive">> -> - fusco_sock:close(Socket, State#client_state.ssl), - undefined; -maybe_close_socket(_, #client_state{socket = Socket} = State, _, ConHdr) -> - ClientConnection = fusco_lib:is_close(ConHdr), - if - ClientConnection -> - fusco_sock:close(Socket, State#client_state.ssl), - undefined; - (not ClientConnection) -> - Socket - end. - -%%------------------------------------------------------------------------------ -%% @private -%%------------------------------------------------------------------------------ --spec is_ipv6_host(host()) -> boolean(). -is_ipv6_host(Host) -> - case inet_parse:address(Host) of - {ok, {_, _, _, _, _, _, _, _}} -> - true; - {ok, {_, _, _, _}} -> - false; - _ -> - % Prefer IPv4 over IPv6. - case inet:getaddr(Host, inet) of - {ok, _} -> - false; - _ -> - case inet:getaddr(Host, inet6) of - {ok, _} -> - true; - _ -> - false - end - end - end. - -% What about the timeout? -%%------------------------------------------------------------------------------ -%% @private -%% Creates a new socket. -%% @end -%%------------------------------------------------------------------------------ -connect_socket(State) -> - case ensure_proxy_tunnel(new_socket(State), State) of - {ok, Socket, _} -> - {ok, State#client_state{socket = Socket}}; - Error -> - {Error, State} - end. - -%%------------------------------------------------------------------------------ -%% @private -%% @doc Creates a new socket using the options included in the client state. -%% end -%%------------------------------------------------------------------------------ -new_socket(#client_state{connect_timeout = Timeout, connect_options = ConnectOptions, - on_connect = OnConnectFun} = State) -> - {Host, Port, Ssl} = request_first_destination(State), - ConnectOptions2 = case (not lists:member(inet, ConnectOptions)) andalso - (not lists:member(inet6, ConnectOptions)) andalso - is_ipv6_host(Host) of - true -> - [inet6 | ConnectOptions]; - false -> - ConnectOptions - end, - SocketOptions = [binary, {packet, raw}, {nodelay, true}, {reuseaddr, true}, - {active, false} | ConnectOptions2], - Reply = connect(Host, Port, SocketOptions, Timeout, Ssl), - OnConnectFun(Reply), - Reply. - -connect(Host, Port, SocketOptions, Timeout, Ssl) -> - TimeB = os:timestamp(), - try fusco_sock:connect(Host, Port, SocketOptions, Timeout, Ssl) of - {ok, Socket} -> - TimeA = os:timestamp(), - ConnectionTime = timer:now_diff(TimeA, TimeB), - {ok, Socket, ConnectionTime}; - {error, etimedout} -> - %% TCP stack decided to give up - {error, connect_timeout}; - {error, timeout} -> - {error, connect_timeout}; - {error, 'record overflow'} -> - {error, ssl_error}; - {error, _} = Error -> - Error - catch - exit:{{{badmatch, {error, {asn1, _}}}, _}, _} -> - {error, ssl_decode_error}; - Type:Error -> - error_logger:error_msg("Socket connection error: ~p ~p, ~p", - [Type, Error, erlang:get_stacktrace()]), - {error, connection_error} - end. - -ensure_proxy_tunnel({error, _} = Error, _State) -> - Error; -ensure_proxy_tunnel({ok, Socket}, #client_state{proxy = #fusco_url{user = User, - password = Passwd, - is_ssl = Ssl}, - host = DestHost, port = Port} = State) -> - %% Proxy tunnel connection http://tools.ietf.org/html/rfc2817#section-5.2 - %% Draft http://www.web-cache.com/Writings/Internet-Drafts/draft-luotonen-web-proxy-tunneling-01.txt - %% IPv6 address literals are enclosed by square brackets (RFC2732) - Host = [fusco_lib:maybe_ipv6_enclose(DestHost), $:, integer_to_list(Port)], - ConnectRequest = [ - <<"CONNECT ">>, Host, <<" HTTP/1.1">>, ?HTTP_LINE_END, - <<"Host: ">>, Host, ?HTTP_LINE_END, - case User of - [] -> - []; - _ -> - [<<"Proxy-Authorization: Basic ">>, - base64:encode(User ++ ":" ++ Passwd), ?HTTP_LINE_END] - end, - ?HTTP_LINE_END], - case fusco_sock:send(Socket, ConnectRequest, Ssl) of - ok -> - read_proxy_connect_response(State#client_state{socket = Socket}); - {error, closed} -> - fusco_sock:close(Socket, Ssl), - {error, proxy_connection_closed}; - {error, _Reason} -> - fusco_sock:close(Socket, Ssl), - {error, proxy_connection_closed} - end; -ensure_proxy_tunnel(Socket, _State) -> - Socket. - -%%------------------------------------------------------------------------------ -%% @private -%%------------------------------------------------------------------------------ --spec verify_options(options()) -> ok | any(). -verify_options([{connect_timeout, infinity} | Options]) -> - verify_options(Options); -verify_options([{connect_timeout, MS} | Options]) - when is_integer(MS), MS >= 0 -> - verify_options(Options); -verify_options([{connect_options, List} | Options]) when is_list(List) -> - verify_options(Options); -verify_options([{proxy, List} | Options]) when is_list(List) -> - verify_options(Options); -verify_options([{proxy_ssl_options, List} | Options]) when is_list(List) -> - verify_options(Options); -verify_options([{use_cookies, B} | Options]) when is_boolean(B) -> - verify_options(Options); -verify_options([{on_connect, F} | Options]) when is_function(F) -> - verify_options(Options); -verify_options([Option | _Rest]) -> - erlang:error({bad_option, Option}); -verify_options([]) -> - ok. - -delete_expired_cookies(#client_state{use_cookies = false}) -> - []; -delete_expired_cookies(#client_state{in_timestamp = undefined, - cookies = Cookies}) -> - Cookies; -delete_expired_cookies(#client_state{in_timestamp = In, - cookies = Cookies}) -> - fusco_lib:delete_expired_cookies(Cookies, In). diff --git a/ejabberd_auth_http/deps/fusco/src/fusco_binary.erl b/ejabberd_auth_http/deps/fusco/src/fusco_binary.erl deleted file mode 100644 index c6587a1..0000000 --- a/ejabberd_auth_http/deps/fusco/src/fusco_binary.erl +++ /dev/null @@ -1,14 +0,0 @@ --module(fusco_binary). - --ifdef(no_binary_to_integer). - --export([binary_to_integer/1, - integer_to_binary/1]). - -binary_to_integer(B) -> - catch list_to_integer(binary_to_list(B)). - -integer_to_binary(I) -> - catch list_to_binary(integer_to_list(I)). - --endif. diff --git a/ejabberd_auth_http/deps/fusco/src/fusco_cp.erl b/ejabberd_auth_http/deps/fusco/src/fusco_cp.erl deleted file mode 100644 index d1e6946..0000000 --- a/ejabberd_auth_http/deps/fusco/src/fusco_cp.erl +++ /dev/null @@ -1,219 +0,0 @@ -%%% ---------------------------------------------------------------------------- -%%% @copyright (C) 2013, Erlang Solutions Ltd -%%% @author Diana Parra Corbacho -%%% @doc Fusco Client Pool -%%% -%%% Pool of clients connected to the same server. Clients do not share state -%%% Recommended for BOSH where connections do not share cookies or any other -%%% headers state -%%% -%%% @end -%%%----------------------------------------------------------------------------- --module(fusco_cp). - --behaviour(gen_server). - -%% API --export([start/3, - start_link/3, - get_client/1, - free_client/2, - stop/1 - ]). - --export([request/7]). - -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - --define(SERVER, ?MODULE). - --record(state, {destination, - options, - max, - total, - free, - busy, - queue - }). - -%%%=================================================================== -%%% API -%%%=================================================================== -start(Destination, Options, MaxClients) -> - verify_max(MaxClients), - gen_server:start(?MODULE, [Destination, Options, MaxClients], []). - -start_link(Destination, Options, MaxClients) -> - verify_max(MaxClients), - gen_server:start_link(?MODULE, [Destination, Options, MaxClients], []). - -get_client(Pool) -> - try - gen_server:call(Pool, get_client) - catch - exit:{timeout, _} -> - {error, timeout} - end. - -free_client(Pool, Client) -> - gen_server:cast(Pool, {free_client, Client}). - -stop(Pool) -> - gen_server:cast(Pool, stop). - -request(Pool, Path, Method, Hdrs, Body, SendRetry, Timeout) -> - case get_client(Pool) of - {error, _} = Error -> - Error; - Client -> - Reply = fusco:request(Client, Path, Method, Hdrs, Body, SendRetry, - Timeout), - free_client(Pool, Client), - Reply - end. -%%%=================================================================== -%%% gen_server callbacks -%%%=================================================================== - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Initializes the server -%% -%% @spec init(Args) -> {ok, State} | -%% {ok, State, Timeout} | -%% ignore | -%% {stop, Reason} -%% @end -%%-------------------------------------------------------------------- -init([Destination, Options, MaxClients]) -> - process_flag(trap_exit, true), - {ok, #state{destination = Destination, - options = Options, - total = 0, - max = MaxClients, - free = [], - busy = [], - queue = queue:new() - }, 0}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Handling call messages -%% -%% @spec handle_call(Request, From, State) -> -%% {reply, Reply, State} | -%% {reply, Reply, State, Timeout} | -%% {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, Reply, State} | -%% {stop, Reason, State} -%% @end -%%-------------------------------------------------------------------- -handle_call(get_client, _From, State = #state{free = [Client | Free], - busy = Busy}) -> - {reply, Client, State#state{free = Free, - busy = [Client | Busy]}}; -handle_call(get_client, _From, State = #state{destination = Destination, - options = Options, - free = [], - max = M, - total = T, - busy = Busy}) - when M > T -> - {ok, Pid} = fusco:start_link(Destination, Options), - {reply, Pid, State#state{total = T + 1, - busy = [Pid | Busy]}}; -handle_call(get_client, From, State = #state{free = [], - max = M, - total = T, - queue = Queue}) - when M == T -> - {noreply, State#state{queue = queue:in(From, Queue)}}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Handling cast messages -%% -%% @spec handle_cast(Msg, State) -> {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} -%% @end -%%-------------------------------------------------------------------- -handle_cast({free_client, Pid}, State = #state{free = Free, - busy = Busy, - queue = Queue}) -> - case queue:is_empty(Queue) of - true -> - {noreply, State#state{free = [Pid | Free], - busy = lists:delete(Pid, Busy)}}; - false -> - {{value, From}, Q2} = queue:out(Queue), - gen_server:reply(From, Pid), - {noreply, State#state{queue = Q2}} - end; -handle_cast(stop, State) -> - {stop, normal, State}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Handling all non call/cast messages -%% -%% @spec handle_info(Info, State) -> {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} -%% @end -%%-------------------------------------------------------------------- -handle_info({'EXIT', From, _Reason}, State = #state{free = Free, - busy = Busy, - total = Total}) -> - {noreply, State#state{free = lists:delete(From, Free), - busy = lists:delete(From, Busy), - total = Total - 1}}; -handle_info(timeout, #state{free = [], busy = [], - destination = Destination, - options = Options} = State) -> - {ok, Pid} = fusco:start_link(Destination, Options), - {noreply, State#state{free = [Pid], total = 1}}; -handle_info(_Info, State) -> - {noreply, State}. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% This function is called by a gen_server when it is about to -%% terminate. It should be the opposite of Module:init/1 and do any -%% necessary cleaning up. When it returns, the gen_server terminates -%% with Reason. The return value is ignored. -%% -%% @spec terminate(Reason, State) -> void() -%% @end -%%-------------------------------------------------------------------- -terminate(_Reason, #state{free = Free, busy = Busy}) -> - [fusco:disconnect(F) || F <- Free], - [fusco:disconnect(B) || B <- Busy], - ok. - -%%-------------------------------------------------------------------- -%% @private -%% @doc -%% Convert process state when code is changed -%% -%% @spec code_change(OldVsn, State, Extra) -> {ok, NewState} -%% @end -%%-------------------------------------------------------------------- -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%%=================================================================== -%%% Internal functions -%%%=================================================================== -verify_max(Integer) when is_integer(Integer), Integer > 0 -> - ok; -verify_max(_) -> - throw(invalid_parameter). diff --git a/ejabberd_auth_http/deps/fusco/src/fusco_lib.erl b/ejabberd_auth_http/deps/fusco/src/fusco_lib.erl deleted file mode 100644 index 17ab859..0000000 --- a/ejabberd_auth_http/deps/fusco/src/fusco_lib.erl +++ /dev/null @@ -1,498 +0,0 @@ -%%%----------------------------------------------------------------------------- -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Oscar Hellström -%%% @author Diana Parra Corbacho -%%% @author Ramon Lastres Guerrero -%%% @doc This module implements various library functions used in fusco -%%% -%%% @end -%%%----------------------------------------------------------------------------- --module(fusco_lib). --copyright("2013, Erlang Solutions Ltd."). - --export([parse_url/1, - format_request/6, - header_value/2, - update_cookies/2, - delete_expired_cookies/2, - to_lower/1, - get_value/2, - get_value/3, - host_header/2, - is_close/1, - maybe_ipv6_enclose/1]). - --include("fusco_types.hrl"). --include("fusco.hrl"). - --define(HTTP_LINE_END, <<"\r\n">>). - -%%============================================================================== -%% Exported functions -%%============================================================================== - -%%------------------------------------------------------------------------------ -%% @spec header_value(Header, Headers) -> undefined | term() -%% Header = string() -%% Headers = [{header(), term()}] -%% Value = term() -%% @doc -%% Returns the value associated with the `Header' in `Headers'. -%% `Header' must be a lowercase string, since every header is mangled to -%% check the match. -%% @end -%%------------------------------------------------------------------------------ --spec header_value(string(), headers()) -> undefined | term(). -header_value(Hdr, Hdrs) -> - %% TODO ensure headers and values are stripped - case lists:keyfind(Hdr, 1, Hdrs) of - false -> - undefined; - {Hdr, Value} -> - Value - end. - -%%------------------------------------------------------------------------------ -%% @spec (URL) -> #fusco_url{} -%% URL = string() -%% @doc -%% @end -%%------------------------------------------------------------------------------ --spec parse_url(string()) -> #fusco_url{}. -parse_url(URL) -> - % XXX This should be possible to do with the re module? - {Scheme, CredsHostPortPath} = split_scheme(URL), - {User, Passwd, HostPortPath} = split_credentials(CredsHostPortPath), - {Host, PortPath} = split_host(HostPortPath, []), - {Port, Path} = split_port(Scheme, PortPath, []), - #fusco_url{host = fusco_lib:to_lower(Host), port = Port, path = Path, - user = User, password = Passwd, is_ssl = (Scheme =:= https)}. - -%%------------------------------------------------------------------------------ -%% @spec (Path, Method, Headers, Host, Body, Cookies) -> -%% Request -%% Path = iolist() -%% Method = atom() | string() -%% Headers = [{atom() | string(), string()}] -%% Host = string() -%% Body = iolist() -%% Cookies = [#fusco_cookie{}] -%% @doc -%% @end -%%------------------------------------------------------------------------------ --spec format_request(iolist(), method(), headers(), string(), iolist(), - {boolean(), [#fusco_cookie{}]}) -> {iodata(), iodata()}. -format_request(Path, Method, Hdrs, Host, Body, Cookies) -> - {AllHdrs, ConHdr} = - add_mandatory_hdrs(Path, Hdrs, Host, Body, Cookies), - {[Method, <<" ">>, Path, <<" HTTP/1.1">>, ?HTTP_LINE_END, AllHdrs, - ?HTTP_LINE_END, Body], ConHdr}. - -%%------------------------------------------------------------------------------ -%% @private -%% @doc Updated the state of the cookies. after we receive a response. -%% @end -%%------------------------------------------------------------------------------ --spec update_cookies(headers(), [#fusco_cookie{}]) -> [#fusco_cookie{}]. -update_cookies([], []) -> - []; -update_cookies([], StateCookies) -> - StateCookies; -update_cookies(ReceivedCookies, []) -> - ReceivedCookies; -update_cookies(ReceivedCookies, StateCookies) -> - %% substitute the cookies with the same name, add the others, delete. - - %% http://tools.ietf.org/search/rfc6265#section-4.1.2 - %% If a user agent receives a Set-Cookie response header whose NAME is - %% the same as a pre-existing cookie, and whose Domain and Path - %% attribute values exactly (string) match those of a pre-existing - %% cookie, the new cookie supersedes the old. - lists:foldl(fun(NewCookie, Acc) -> - OldCookie = - lists:keyfind(NewCookie#fusco_cookie.name, - #fusco_cookie.name, Acc), - replace_or_add_cookie(OldCookie, NewCookie, Acc) - end, StateCookies, ReceivedCookies). - -%% http://tools.ietf.org/search/rfc6265#section-4.1.2 -replace_or_add_cookie(false, NewCookie, List) -> - %% Add new cookie - [NewCookie | List]; -replace_or_add_cookie(#fusco_cookie{domain = Domain, path = Path}, - #fusco_cookie{domain = Domain, - path = Path} = NewCookie, List) -> - %% Replace previous cookie - lists:keystore(NewCookie#fusco_cookie.name, #fusco_cookie.name, List, - NewCookie); -replace_or_add_cookie(_, NewCookie, List) -> - %% Add new cookie, path and/or domain are different - [NewCookie | List]. - -%%------------------------------------------------------------------------------ -%% @doc Converts characters in a string ro lower case. -%% @end -%%------------------------------------------------------------------------------ --spec to_lower(string()) -> string(). -to_lower(String) when is_list(String) -> - [char_to_lower(X) || X <- String]. - -bin_to_lower(Bin) -> - << <<(char_to_lower(B))>> || <> <= Bin >>. - -%%------------------------------------------------------------------------------ -%% @doc Compares header values to pre-defined values -%% Faster than string:to_lower and then compare -%% @end -%%------------------------------------------------------------------------------ -is_close(<<"close">>) -> - true; -is_close(<<"Close">>) -> - true; -is_close(<<"keep-alive">>) -> - false; -is_close(<<"Keep-Alive">>) -> - false; -is_close(C) -> - is_close(C, "close"). - -is_close(<>, [C | Rest2]) -> - is_close(Rest1, Rest2); -is_close(<>, [C2 | Rest2]) -> - case close_to_lower(C1) == C2 of - true -> - is_close(Rest1, Rest2); - false -> - false - end; -is_close(<<>>, _) -> - false; -is_close(_, []) -> - false. - -close_to_lower($C) -> - $c; -close_to_lower($L) -> - $l; -close_to_lower($O) -> - $o; -close_to_lower($S) -> - $s; -close_to_lower($E) -> - $e; -close_to_lower(C) -> - C. - -%%------------------------------------------------------------------------------ -%% @doc Gets value from tuple list -%% @end -%%------------------------------------------------------------------------------ --spec get_value(Key, List) -> term() when - Key :: term(), - List :: [term()]. -get_value(Key, List) -> - case lists:keyfind(Key, 1, List) of - {Key, Value} -> - Value; - false -> - undefined - end. - -%%------------------------------------------------------------------------------ -%% @doc Gets value from tuple list. If it is not present, returns default value. -%% @end -%%------------------------------------------------------------------------------ --spec get_value(Key, List, Default) -> term() when - Key :: term(), - List :: [term()], - Default :: term(). -get_value(Key, List, Default) -> - case lists:keyfind(Key, 1, List) of - {Key, Value} -> - Value; - false -> - Default - end. - -%%------------------------------------------------------------------------------ -%% @private -%% @doc Delete the cookies that are expired (check max-age and expire fields). -%% @end -%%------------------------------------------------------------------------------ --spec delete_expired_cookies([#fusco_cookie{}], erlang:timestamp()) -> [#fusco_cookie{}]. -delete_expired_cookies([], _InTimestamp) -> - []; -delete_expired_cookies(Cookies, InTimestamp) -> - [ X || X <- Cookies, not expires(X, InTimestamp)]. - -%%============================================================================== -%% Internal functions -%%============================================================================== -%% http://tools.ietf.org/search/rfc6265#section-4.1.2.2 -%% The Max-Age attribute indicates the maximum lifetime of the cookie, -%% represented as the number of seconds until the cookie expires. -%% -%% If a cookie has both the Max-Age and the Expires attribute, -%% the Max-Age attribute has precedence and controls the expiration date of the -%% cookie. If a cookie has neither the Max-Age nor the Expires attribute, -%% the user agent will retain the cookie until "the current session is over" -expires(#fusco_cookie{max_age = 0}, _) -> - true; -expires(#fusco_cookie{max_age = Max}, InTimestamp) when Max =/= undefined -> - timer:now_diff(os:timestamp(), InTimestamp) > Max; -expires(#fusco_cookie{expires = Exp}, _) when Exp =/= undefined -> - calendar:universal_time() > Exp; -expires(_, _) -> - false. - -%%------------------------------------------------------------------------------ -%% @private -%%------------------------------------------------------------------------------ -split_scheme("http://" ++ HostPortPath) -> - {http, HostPortPath}; -split_scheme("https://" ++ HostPortPath) -> - {https, HostPortPath}. - -%%------------------------------------------------------------------------------ -%% @private -%%------------------------------------------------------------------------------ -split_credentials(CredsHostPortPath) -> - case string:tokens(CredsHostPortPath, "@") of - [HostPortPath] -> - {"", "", HostPortPath}; - [Creds, HostPortPath] -> - % RFC1738 (section 3.1) says: - % "The user name (and password), if present, are followed by a - % commercial at-sign "@". Within the user and password field, any ":", - % "@", or "/" must be encoded." - % The mentioned encoding is the "percent" encoding. - case string:tokens(Creds, ":") of - [User] -> - % RFC1738 says ":password" is optional - {http_uri:decode(User), "", HostPortPath}; - [User, Passwd] -> - {http_uri:decode(User), http_uri:decode(Passwd), HostPortPath} - end - end. - -%%------------------------------------------------------------------------------ -%% @private -%% @doc -%% @end -%%------------------------------------------------------------------------------ --spec split_host(string(), string()) -> {string(), string()}. -split_host("[" ++ Rest, []) -> - % IPv6 address literals are enclosed by square brackets (RFC2732) - case string:str(Rest, "]") of - 0 -> - split_host(Rest, "["); - N -> - {IPv6Address, "]" ++ PortPath0} = lists:split(N - 1, Rest), - case PortPath0 of - ":" ++ PortPath -> - {IPv6Address, PortPath}; - _ -> - {IPv6Address, PortPath0} - end - end; -split_host([$: | PortPath], Host) -> - {lists:reverse(Host), PortPath}; -split_host([$/ | _] = PortPath, Host) -> - {lists:reverse(Host), PortPath}; -split_host([$? | _] = Query, Host) -> - %% The query string follows the hostname, without a slash. The - %% path is empty, but for HTTP an empty path is equivalent to "/" - %% (RFC 3986, section 6.2.3), so let's add the slash ourselves. - {lists:reverse(Host), "/" ++ Query}; -split_host([H | T], Host) -> - split_host(T, [H | Host]); -split_host([], Host) -> - {lists:reverse(Host), []}. - -%%------------------------------------------------------------------------------ -%% @private -%% @doc -%% @end -%%------------------------------------------------------------------------------ -split_port(http, [$/ | _] = Path, []) -> - {80, Path}; -split_port(https, [$/ | _] = Path, []) -> - {443, Path}; -split_port(http, [], []) -> - {80, "/"}; -split_port(https, [], []) -> - {443, "/"}; -split_port(_, [], Port) -> - {list_to_integer(lists:reverse(Port)), "/"}; -split_port(_,[$/ | _] = Path, Port) -> - {list_to_integer(lists:reverse(Port)), Path}; -split_port(Scheme, [P | T], Port) -> - split_port(Scheme, T, [P | Port]). - -%%------------------------------------------------------------------------------ -%% @private -%% @doc -%% @end -%%------------------------------------------------------------------------------ --spec add_mandatory_hdrs(string(), headers(), host(), - iolist(), {boolean(), [#fusco_cookie{}]}) -> {iodata(), iodata()}. -add_mandatory_hdrs(_Path, Hdrs, Host, Body, {_, []}) -> - add_headers(Hdrs, Body, Host, undefined, []); -add_mandatory_hdrs(_Path, Hdrs, Host, Body, {false, _}) -> - add_headers(Hdrs, Body, Host, undefined, []); -add_mandatory_hdrs(Path, Hdrs, Host, Body, {true, Cookies}) -> - Result = {ContentHdrs, ConHdr} = - add_headers(Hdrs, Body, Host, undefined, []), - - %% http://tools.ietf.org/search/rfc6265#section-4.1.2.4 - %% only include cookies if the cookie path is a prefix of the request path - %% TODO optimize cookie handling - case lists:filter( - fun(#fusco_cookie{path_tokens = undefined}) -> - true; - (#fusco_cookie{path_tokens = CookiePath}) -> - SubPath = binary:split(Path, <<"/">>, [global]), - is_prefix(CookiePath, SubPath) - end, Cookies) - of - [] -> - Result; - IncludeCookies -> - {add_cookie_headers(ContentHdrs, IncludeCookies), ConHdr} - end. - -%%------------------------------------------------------------------------------ -%% @private -%%------------------------------------------------------------------------------ -%% http://tools.ietf.org/search/rfc6265#section-4.2.1 -add_cookie_headers(Hdrs, Cookies) -> - [[<<"Cookie: ">>, make_cookie_string(Cookies, []), ?HTTP_LINE_END] - | Hdrs]. - -%%------------------------------------------------------------------------------ -%% @private -%%------------------------------------------------------------------------------ -make_cookie_string([], Acc) -> - Acc; -make_cookie_string([Cookie | Rest], []) -> - make_cookie_string(Rest, cookie_string(Cookie)); -make_cookie_string([Cookie | Rest], Acc) -> - make_cookie_string(Rest, [cookie_string(Cookie), "; " | Acc]). - -%%------------------------------------------------------------------------------ -%% @private -%%------------------------------------------------------------------------------ -cookie_string(#fusco_cookie{name = Name, value = Value}) -> - [Name, <<"=">>, Value]. - -%%------------------------------------------------------------------------------ -%% @private -%% Host header: http://tools.ietf.org/html/rfc2616#section-14.23 -%%------------------------------------------------------------------------------ -add_headers([{H, V} | T], undefined, undefined, Connection, Acc) - when Connection =/= undefined -> - add_headers(T, undefined, undefined, Connection, - [[H, <<": ">>, V, ?HTTP_LINE_END] | Acc]); -add_headers([{H, V} | T], Body, Host, Connection, Acc) -> - case bin_to_lower(H) of - <<"connection">> -> - add_headers(T, Body, Host, V, - [[H, <<": ">>, V, ?HTTP_LINE_END] | Acc]); - <<"host">> -> - add_headers(T, Body, undefined, Connection, - [[H, <<": ">>, V, ?HTTP_LINE_END] | Acc]); - <<"content-length">> -> - add_headers(T, undefined, Host, Connection, - [[H, <<": ">>, V, ?HTTP_LINE_END] | Acc]); - _ -> - add_headers(T, Body, Host, Connection, - [[H, <<": ">>, V, ?HTTP_LINE_END] | Acc]) - end; -add_headers([], undefined, Host, Connection, Headers) -> - case Host of - undefined -> - {Headers, Connection}; - _ -> - {[[<<"Host: ">>, Host, ?HTTP_LINE_END] | Headers], Connection} - end; -add_headers([], Body, Host, Connection, Headers) -> - ContentLength = integer_to_list(iolist_size(Body)), - case ContentLength > 0 of - true -> - add_headers([], undefined, Host, Connection, - [[<<"Content-Length: ">>, ContentLength, ?HTTP_LINE_END] - | Headers]); - _ -> - add_headers([], undefined, Host, Connection, Headers) - end. - -%%------------------------------------------------------------------------------ -%% @doc -%% @end -%%------------------------------------------------------------------------------ --spec host_header(host(), port_num()) -> any(). -host_header(Host, 80) -> maybe_ipv6_enclose(Host); -% When proxying after an HTTP CONNECT session is established, squid doesn't -% like the :443 suffix in the Host header. -host_header(Host, 443) -> maybe_ipv6_enclose(Host); -host_header(Host, Port) -> [maybe_ipv6_enclose(Host), $:, integer_to_list(Port)]. - -%%------------------------------------------------------------------------------ -%% @private -%% @doc -%% @end -%%------------------------------------------------------------------------------ --spec maybe_ipv6_enclose(host()) -> host(). -maybe_ipv6_enclose(Host) -> - case inet_parse:address(Host) of - {ok, {_, _, _, _, _, _, _, _}} -> - % IPv6 address literals are enclosed by square brackets (RFC2732) - [$[, Host, $]]; - _ -> - Host - end. - -%%------------------------------------------------------------------------------ -%% @private -%% @doc -%% @end -%%------------------------------------------------------------------------------ -char_to_lower($A) -> $a; -char_to_lower($B) -> $b; -char_to_lower($C) -> $c; -char_to_lower($D) -> $d; -char_to_lower($E) -> $e; -char_to_lower($F) -> $f; -char_to_lower($G) -> $g; -char_to_lower($H) -> $h; -char_to_lower($I) -> $i; -char_to_lower($J) -> $j; -char_to_lower($K) -> $k; -char_to_lower($L) -> $l; -char_to_lower($M) -> $m; -char_to_lower($N) -> $n; -char_to_lower($O) -> $o; -char_to_lower($P) -> $p; -char_to_lower($Q) -> $q; -char_to_lower($R) -> $r; -char_to_lower($S) -> $s; -char_to_lower($T) -> $t; -char_to_lower($U) -> $u; -char_to_lower($V) -> $v; -char_to_lower($W) -> $w; -char_to_lower($X) -> $x; -char_to_lower($Y) -> $y; -char_to_lower($Z) -> $z; -char_to_lower(Ch) -> Ch. - -is_prefix([<<>>], _) -> - true; -is_prefix([H | T1], [H | T2]) -> - is_prefix(T1, T2); -is_prefix([], _) -> - true; -is_prefix(_, []) -> - false; -is_prefix(_, _) -> - false. - diff --git a/ejabberd_auth_http/deps/fusco/src/fusco_protocol.erl b/ejabberd_auth_http/deps/fusco/src/fusco_protocol.erl deleted file mode 100644 index d30baf3..0000000 --- a/ejabberd_auth_http/deps/fusco/src/fusco_protocol.erl +++ /dev/null @@ -1,567 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 2013, Erlang Solutions Ltd -%%% @author Diana Corbacho -%%% @doc -%%% -%%% @end -%%%============================================================================= --module(fusco_protocol). --copyright("2013, Erlang Solutions Ltd."). - --include("fusco.hrl"). - --define(SIZE(Data, Response), Response#response{size = Response#response.size + byte_size(Data)}). --define(RECEPTION(Data, Response), Response#response{size = byte_size(Data), - in_timestamp = os:timestamp()}). --define(TOUT, 1000). -%% Latency is here defined as the time from the start of packet transmission to the start of packet reception - -%% API --export([recv/2, recv/3, - decode_cookie/1]). - -%% TEST --export([decode_header_value/5, decode_header_value/6, - decode_header/3, decode_header/4]). - -%% TODO handle partial downloads - -recv(Socket, Ssl) -> - recv(Socket, Ssl, infinity). - -recv(Socket, Ssl, Timeout) -> - case fusco_sock:recv(Socket, Ssl, Timeout) of - {ok, Data} -> - decode_status_line(<< Data/binary >>, - ?RECEPTION(Data, #response{socket = Socket, ssl = Ssl}), Timeout); - {error, Reason} -> - {error, Reason} - end. - -decode_status_line(<<"HTTP/1.0\s",C1,C2,C3,$\s,Rest/bits>>, Response, Timeout) -> - decode_reason_phrase(Rest, <<>>, Response#response{version = {1,0}, - status_code = <>}, Timeout); -decode_status_line(<<"HTTP/1.1\s",C1,C2,C3,$\s,Rest/bits>>, Response, Timeout) -> - decode_reason_phrase(Rest, <<>>, Response#response{version = {1,1}, - status_code = <>}, Timeout); -decode_status_line(Bin, Response = #response{size = Size}, Timeout) when Size < 13 -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_status_line(<>, ?SIZE(Data, Response), Timeout); - {error, Reason} -> - {error, Reason} - end; -decode_status_line(_, _, _) -> - {error, status_line}. - -decode_reason_phrase(<<>>, Acc, Response, Timeout) -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_reason_phrase(Data, Acc, ?SIZE(Data, Response), Timeout); - {error, Reason} -> - {error, Reason} - end; -decode_reason_phrase(<<$\r>>, Acc, Response, Timeout) -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_reason_phrase(<<$\r, Data/binary>>, Acc, ?SIZE(Data, Response), Timeout); - {error, Reason} -> - {error, Reason} - end; -decode_reason_phrase(<<$\n, Rest/bits>>, Acc, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{reason = Acc}, Timeout); -decode_reason_phrase(<<$\r,$\n, Rest/bits>>, Acc, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{reason = Acc}, Timeout); -decode_reason_phrase(<>, Acc, Response, Timeout) -> - decode_reason_phrase(Rest, <>, Response, Timeout). - -decode_header(Data, Acc, Response) -> - decode_header(Data, Acc, Response, infinity). - -decode_header(<<>>, Acc, Response, Timeout) -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_header(Data, Acc, ?SIZE(Data, Response), Timeout); - {error, closed} -> - case Acc of - <<>> -> - decode_body(<<>>, Response, Timeout); - _ -> - {error, closed} - end; - {error, Reason} -> - {error, Reason} - end; -decode_header(<<$\r>>, Acc, Response, Timeout) -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_header(<<$\r, Data/binary>>, Acc, ?SIZE(Data, Response), Timeout); - {error, Reason} -> - {error, Reason} - end; -decode_header(<<$\s, Rest/bits>>, Acc, Response, Timeout) -> - decode_header(Rest, Acc, Response, Timeout); -decode_header(<<$:, Rest/bits>>, Header, Response, Timeout) -> - decode_header_value_ws(Rest, Header, Response, Timeout); -decode_header(<<$\n, Rest/bits>>, <<>>, Response, Timeout) -> - decode_body(Rest, Response, Timeout); -decode_header(<<$\r, $\n, Rest/bits>>, <<>>, Response, Timeout) -> - decode_body(Rest, Response, Timeout); -decode_header(<<$\r, $\n, _Rest/bits>>, _, _Response, _Timeout) -> - {error, header}; -decode_header(<<$A, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$B, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$C, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$D, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$E, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$F, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$G, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$H, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$I, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$J, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$K, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$L, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$M, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$N, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$O, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$P, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$Q, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$R, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$S, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$T, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$U, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$V, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$W, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$X, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$Y, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<<$Z, Rest/bits>>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout); -decode_header(<>, Header, Response, Timeout) -> - decode_header(Rest, <
>, Response, Timeout). - -decode_header_value_ws(<<$\s, Rest/bits>>, H, S, Timeout) -> - decode_header_value_ws(Rest, H, S, Timeout); -decode_header_value_ws(<<$\t, Rest/bits>>, H, S, Timeout) -> - decode_header_value_ws(Rest, H, S, Timeout); -decode_header_value_ws(Rest, <<"connection">> = H, S, Timeout) -> - decode_header_value_lc(Rest, H, <<>>, <<>>, S, Timeout); -decode_header_value_ws(Rest, <<"transfer-encoding">> = H, S, Timeout) -> - decode_header_value_lc(Rest, H, <<>>, <<>>, S, Timeout); -decode_header_value_ws(Rest, H, S, Timeout) -> - decode_header_value(Rest, H, <<>>, <<>>, S, Timeout). - -decode_header_value(Data, H, V, T, Response) -> - decode_header_value(Data, H, V, T, Response, infinity). - -decode_header_value(<<>>, H, V, T, Response, Timeout) -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_header_value(Data, H, V, T, ?SIZE(Data, Response), Timeout); - {error, Reason} -> - {error, Reason} - end; -decode_header_value(<<$\r>>, H, V, T, Response, Timeout) -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_header_value(<<$\r, Data/binary>>, H, V, T, ?SIZE(Data, Response), Timeout); - {error, Reason} -> - {error, Reason} - end; -decode_header_value(<<$\n, Rest/bits>>, <<"content-length">> = H, V, _T, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{headers = [{H, V} | Response#response.headers], - content_length = binary_to_integer(V)}, Timeout); -decode_header_value(<<$\n, Rest/bits>>, <<"set-cookie">> = H, V, _T, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{cookies = [decode_cookie(V) - | Response#response.cookies], - headers = [{H, V} | Response#response.headers]}, Timeout); -decode_header_value(<<$\n, Rest/bits>>, H, V, _T, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{headers = [{H, V} | Response#response.headers]}, Timeout); -decode_header_value(<<$\r, $\n, Rest/bits>>, <<"set-cookie">> = H, V, _T, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{cookies = [decode_cookie(V) - | Response#response.cookies], - headers = [{H, V} | Response#response.headers]}, Timeout); -decode_header_value(<<$\r,$\n, Rest/bits>>, <<"content-length">> = H, V, _T, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{headers = [{H, V} | Response#response.headers], - content_length = binary_to_integer(V)}, Timeout); -decode_header_value(<<$\r, $\n, Rest/bits>>, H, V, _T, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{headers = [{H, V} | Response#response.headers]}, Timeout); -decode_header_value(<<$\s, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value(Rest, H, V, <>, Response, Timeout); -decode_header_value(<<$\t, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value(Rest, H, V, <>, Response, Timeout); -decode_header_value(<>, H, V, <<>>, Response, Timeout) -> - decode_header_value(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value(<>, H, V, T, Response, Timeout) -> - decode_header_value(Rest, H, <>, <<>>, Response, Timeout). - -decode_header_value_lc(<<>>, H, V, T, Response, Timeout) -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_header_value_lc(Data, H, V, T, ?SIZE(Data, Response), Timeout); - {error, Reason} -> - {error, Reason} - end; -decode_header_value_lc(<<$\r>>, H, V, T, Response, Timeout) -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_header_value_lc(<<$\r, Data/binary>>, H, V, T, ?SIZE(Data, Response), Timeout); - {error, Reason} -> - {error, Reason} - end; -decode_header_value_lc(<<$\n, Rest/bits>>, <<"transfer-encoding">> = H, V, _T, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{headers = [{H, V} | Response#response.headers], - transfer_encoding = V}, Timeout); -decode_header_value_lc(<<$\n, Rest/bits>>, H, V, _T, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{headers = [{H, V} | Response#response.headers], - connection = V}, Timeout); -decode_header_value_lc(<<$\r, $\n, Rest/bits>>, <<"transfer-encoding">> = H, V, _T, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{headers = [{H, V} | Response#response.headers], - transfer_encoding = V}, Timeout); -decode_header_value_lc(<<$\r, $\n, Rest/bits>>, H, V, _T, Response, Timeout) -> - decode_header(Rest, <<>>, Response#response{headers = [{H, V} | Response#response.headers], - connection = V}, Timeout); -decode_header_value_lc(<<$\s, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, V, <>, Response, Timeout); -decode_header_value_lc(<<$\t, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, V, <>, Response, Timeout); -decode_header_value_lc(<<$A, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$B, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$C, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$D, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$E, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$F, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$G, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$H, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$I, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$J, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$K, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$L, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$M, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$N, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$O, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$P, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$Q, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$R, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$S, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$T, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$U, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$V, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$W, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$X, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$Y, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<<$Z, Rest/bits>>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout); -decode_header_value_lc(<>, H, V, T, Response, Timeout) -> - decode_header_value_lc(Rest, H, <>, <<>>, Response, Timeout). - -%% RFC 6265 -%% TODO decode cookie values, this only accepts 'a=b' -decode_cookie(Cookie) -> - decode_cookie_name(Cookie, <<>>). - -decode_cookie_name(<<$\s, Rest/bits>>, N) -> - decode_cookie_name(Rest, N); -decode_cookie_name(<<$\t, Rest/bits>>, N) -> - decode_cookie_name(Rest, N); -decode_cookie_name(<<$=, Rest/bits>>, N) -> - decode_cookie_value(Rest, N, <<>>); -decode_cookie_name(<>, N) -> - decode_cookie_name(Rest, <>). - -decode_cookie_value(<<$\s, Rest/bits>>, N, V) -> - decode_cookie_value(Rest, N, V); -decode_cookie_value(<<$\t, Rest/bits>>, N, V) -> - decode_cookie_value(Rest, N, V); -decode_cookie_value(<<$;, Rest/bits>>, N, V) -> - decode_cookie_av_ws(Rest, #fusco_cookie{name = N, value = V}); -decode_cookie_value(<>, N, V) -> - decode_cookie_value(Rest, N, <>); -decode_cookie_value(<<>>, N, V) -> - #fusco_cookie{name = N, value = V}. - -decode_cookie_av_ws(<<$\s, Rest/bits>>, C) -> - decode_cookie_av_ws(Rest, C); -decode_cookie_av_ws(<<$\t, Rest/bits>>, C) -> - decode_cookie_av_ws(Rest, C); -%% We are only interested on Expires, Max-Age, Path, Domain -decode_cookie_av_ws(<<$e, Rest/bits>>, C) -> - decode_cookie_av(Rest, C, <<$e>>); -decode_cookie_av_ws(<<$E, Rest/bits>>, C) -> - decode_cookie_av(Rest, C, <<$e>>); -decode_cookie_av_ws(<<$m, Rest/bits>>, C) -> - decode_cookie_av(Rest, C, <<$m>>); -decode_cookie_av_ws(<<$M, Rest/bits>>, C) -> - decode_cookie_av(Rest, C, <<$m>>); -decode_cookie_av_ws(<<$p, Rest/bits>>, C) -> - decode_cookie_av(Rest, C, <<$p>>); -decode_cookie_av_ws(<<$P, Rest/bits>>, C) -> - decode_cookie_av(Rest, C, <<$p>>); -decode_cookie_av_ws(<<$d, Rest/bits>>, C) -> - decode_cookie_av(Rest, C, <<$d>>); -decode_cookie_av_ws(<<$D, Rest/bits>>, C) -> - decode_cookie_av(Rest, C, <<$d>>); -decode_cookie_av_ws(Rest, C) -> - ignore_cookie_av(Rest, C). - -ignore_cookie_av(<<$;, Rest/bits>>, Co) -> - decode_cookie_av_ws(Rest, Co); -ignore_cookie_av(<<_, Rest/bits>>, Co) -> - ignore_cookie_av(Rest, Co); -ignore_cookie_av(<<>>, Co) -> - Co. - -%% Match only uppercase chars on Expires, Max-Age, Path, Domain -decode_cookie_av(<<$=, Rest/bits>>, Co, AV) -> - decode_cookie_av_value(Rest, Co, AV, <<>>); -decode_cookie_av(<<$D, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$O, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$N, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$E, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$X, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$P, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$I, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$R, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$S, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$M, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$A, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$G, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$T, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$H, Rest/bits>>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<$;, Rest/bits>>, Co, _AV) -> - decode_cookie_av_ws(Rest, Co); -decode_cookie_av(<>, Co, AV) -> - decode_cookie_av(Rest, Co, <>); -decode_cookie_av(<<>>, Co, _AV) -> - ignore_cookie_av(<<>>, Co). - -decode_cookie_av_value(<<>>, Co, <<"path">>, Value) -> - Co#fusco_cookie{path_tokens = binary:split(Value, <<"/">>, [global]), - path = Value}; -decode_cookie_av_value(<<>>, Co, <<"max-age">>, Value) -> - Co#fusco_cookie{max_age = max_age(Value)}; -decode_cookie_av_value(<<>>, Co, <<"expires">>, Value) -> - Co#fusco_cookie{expires = expires(Value)}; -decode_cookie_av_value(<<>>, Co, <<"domain">>, Value) -> - Co#fusco_cookie{domain = Value}; -decode_cookie_av_value(<<$;, Rest/bits>>, Co, <<"path">>, Value) -> - Path = binary:split(Value, <<"/">>, [global]), - decode_cookie_av_ws(Rest, Co#fusco_cookie{path_tokens = Path, - path = Value}); -decode_cookie_av_value(<<$;, Rest/bits>>, Co, <<"max-age">>, Value) -> - decode_cookie_av_ws(Rest, Co#fusco_cookie{ - max_age = max_age(Value)}); -decode_cookie_av_value(<<$;, Rest/bits>>, Co, <<"expires">>, Value) -> - %% TODO parse expires - decode_cookie_av_ws(Rest, Co#fusco_cookie{expires = expires(Value)}); -decode_cookie_av_value(<<$;, Rest/bits>>, Co, <<"domain">>, Value) -> - decode_cookie_av_ws(Rest, Co#fusco_cookie{domain = Value}); -decode_cookie_av_value(<<$;, Rest/bits>>, Co, _, _) -> - decode_cookie_av_ws(Rest, Co); -decode_cookie_av_value(<>, Co, AV, Value) -> - decode_cookie_av_value(Rest, Co, AV, <>). - - -decode_body(<<>>, Response = #response{status_code = <<$1, _, _>>, - transfer_encoding = TE}, _Timeout) - when TE =/= <<"chunked">> -> - return(<<>>, Response); -decode_body(<<$\r, $\n, Rest/bits>>, Response, Timeout) -> - decode_body(Rest, Response, Timeout); -decode_body(Rest, Response = #response{status_code = <<$1, _, _>>, - transfer_encoding = TE}, Timeout) - when TE =/= <<"chunked">> -> - decode_status_line(Rest, #response{socket = Response#response.socket, - ssl = Response#response.ssl, - in_timestamp = Response#response.in_timestamp}, Timeout); -decode_body(Rest, Response = #response{transfer_encoding = <<"chunked">>}, Timeout) -> - decode_chunked_body(Rest, <<>>, <<>>, Response, Timeout); -decode_body(Rest, Response, Timeout) -> - case byte_size(Rest) >= Response#response.content_length of - true -> - return(Rest, Response); - false -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_body(<>, ?SIZE(Data, Response), Timeout); - _ -> - %% NOTE: Return what we have so far - return(Rest, Response) - end - end. - -download_chunked_body(Rest, Acc, Size, Response, Timeout) -> - case fusco_sock:recv(Response#response.socket, Response#response.ssl, Timeout) of - {ok, Data} -> - decode_chunked_body(<>, Acc, Size, - ?SIZE(Data, Response), Timeout); - _ -> - return(Acc, Response) - end. - -decode_chunked_body(<<$0,$\r,$\n,$\r,$\n>>, Acc, _, Response, _Timeout) -> - return(Acc, Response); -decode_chunked_body(<<$0, Rest/bits>> = R, Acc, Size, Response, Timeout) - when is_binary(Size), byte_size(Rest) < 4 -> - download_chunked_body(R, Acc, Size, Response, Timeout); -decode_chunked_body(<<$\r>> = R, Acc, Size, Response, Timeout) when is_binary(Size) -> - download_chunked_body(R, Acc, Size, Response, Timeout); -decode_chunked_body(<<$\r,$\n, Rest/bits>>, Acc, <<>>, Response, Timeout) -> - decode_chunked_body(Rest, Acc, <<>>, Response, Timeout); -decode_chunked_body(<<$\r,$\n, Rest/bits>>, Acc, Size, Response, Timeout) when is_binary(Size) -> - IntSize = erlang:binary_to_integer(Size, 16), - decode_chunked_body(Rest, Acc, IntSize, Response, Timeout); -decode_chunked_body(<>, Acc, Size, Response, Timeout) when is_binary(Size) -> - decode_chunked_body(Rest, Acc, <>, Response, Timeout); -decode_chunked_body(<<>> = R, Acc, Size, Response, Timeout) when is_binary(Size) -> - download_chunked_body(R, Acc, Size, Response, Timeout); -decode_chunked_body(Rest, Acc, Size, Response, Timeout) when is_integer(Size) -> - case byte_size(Rest) of - S when S == Size -> - decode_chunked_body(<<>>, <>, <<>>, Response, Timeout); - S when S < Size -> - download_chunked_body(Rest, Acc, Size, Response, Timeout); - S when S > Size -> - Current = binary:part(Rest, 0, Size), - Next = binary:part(Rest, Size, S - Size), - decode_chunked_body(Next, <>, <<>>, Response, Timeout) - end. - -return(Body, Response) -> - Response#response{body = Body}. - -max_age(Value) -> - binary_to_integer(Value) * 1000000. - -%% http://tools.ietf.org/html/rfc2616#section-3.3.1 -%% Supports some non-standard datetime (Tomcat) Tue, 06-Nov-1994 08:49:37 GMT -expires(<<_,_,_,$,,$\s,D1,D2,$\s,M1,M2,M3,$\s,Y1,Y2,Y3,Y4,$\s,Rest/bits>>) -> - expires(Rest, {list_to_integer([Y1,Y2,Y3,Y4]),month(<>),list_to_integer([D1,D2])}); -expires(<<_,_,_,$\s,Mo1,Mo2,Mo3,$\s,D1,D2,$\s,H1,H2,$:,M1,M2,$:,S1,S2,$\s,Y1,Y2,Y3,Y4,_Rest/bits>>) -> - {{list_to_integer([Y1,Y2,Y3,Y4]),month(<>),list_to_integer([D1,D2])}, - {list_to_integer([H1,H2]), list_to_integer([M1,M2]), list_to_integer([S1,S2])}}; -expires(<<_,_,_,$,,$\s,Rest/bits>>) -> - expires(Rest); -expires(<<"Monday",$,,$\s,Rest/bits>>) -> - expires(Rest); -expires(<<"Tuesday",$,,$\s,Rest/bits>>) -> - expires(Rest); -expires(<<"Wednesday",$,,$\s,Rest/bits>>) -> - expires(Rest); -expires(<<"Thursday",$,,$\s,Rest/bits>>) -> - expires(Rest); -expires(<<"Friday",$,,$\s,Rest/bits>>) -> - expires(Rest); -expires(<<"Saturday",$,,$\s,Rest/bits>>) -> - expires(Rest); -expires(<<"Sunday",$,,$\s,Rest/bits>>) -> - expires(Rest); -expires(<>) -> - expires(Rest, {list_to_integer([Y1,Y2,Y3,Y4]),month(<>),list_to_integer([D1,D2])}); -expires(<>) -> - %% http://tools.ietf.org/html/rfc2616#section-19.3 - %% HTTP/1.1 clients and caches SHOULD assume that an RFC-850 date - %% which appears to be more than 50 years in the future is in fact - %% in the past (this helps solve the "year 2000" problem). - expires(Rest, {to_year([Y3, Y4]),month(<>),list_to_integer([D1,D2])}). - -to_year(List) -> - Int = list_to_integer(List), - {Y, _, _} = date(), - case (2000 + Int - Y) > 50 of - true -> - 1900 + Int; - false -> - 2000 + Int - end. - -expires(<>, Date) -> - {Date, {list_to_integer([H1,H2]), list_to_integer([M1,M2]), list_to_integer([S1,S2])}}. - -month(<<$J,$a,$n>>) -> - 1; -month(<<$F,$e,$b>>) -> - 2; -month(<<$M,$a,$r>>) -> - 3; -month(<<$A,$p,$r>>) -> - 4; -month(<<$M,$a,$y>>) -> - 5; -month(<<$J,$u,$n>>) -> - 6; -month(<<$J,$u,$l>>) -> - 7; -month(<<$A,$u,$g>>) -> - 8; -month(<<$S,$e,$p>>) -> - 9; -month(<<$O,$c,$t>>) -> - 10; -month(<<$N,$o,$v>>) -> - 11; -month(<<$D,$e,$c>>) -> - 12. diff --git a/ejabberd_auth_http/deps/fusco/src/fusco_sock.erl b/ejabberd_auth_http/deps/fusco/src/fusco_sock.erl deleted file mode 100644 index 411b692..0000000 --- a/ejabberd_auth_http/deps/fusco/src/fusco_sock.erl +++ /dev/null @@ -1,123 +0,0 @@ -%%%----------------------------------------------------------------------------- -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Oscar Hellström -%%% @author Diana Parra Corbacho -%%% @doc This module implements wrappers for socket operations. -%%% -%%% Makes it possible to have the same interface to ssl and tcp sockets. -%%% @end -%%%----------------------------------------------------------------------------- --module(fusco_sock). - --export([connect/5, - recv/2, - recv/3, - send/3, - close/2, - setopts/3]). - --include("fusco_types.hrl"). - -%%============================================================================== -%% Exported functions -%%============================================================================== - -%%------------------------------------------------------------------------------ -%% @spec (Host, Port, Options, Timeout, SslFlag) -> {ok, Socket} | {error, Reason} -%% Host = string() | ip_address() -%% Port = integer() -%% Options = [{atom(), term()} | atom()] -%% Timeout = infinity | integer() -%% SslFlag = boolean() -%% Socket = socket() -%% Reason = atom() -%% @doc -%% Connects to `Host' and `Port'. -%% Will use the `ssl' module if `SslFlag' is `true' and gen_tcp otherwise. -%% `Options' are the normal `gen_tcp' or `ssl' Options. -%% @end -%%------------------------------------------------------------------------------ --spec connect(host(), integer(), socket_options(), timeout(), boolean()) -> - {ok, socket()} | {error, atom()}. -connect(Host, Port, Options, Timeout, true) -> - ssl:connect(Host, Port, Options, Timeout); -connect(Host, Port, Options, Timeout, false) -> - gen_tcp:connect(Host, Port, Options, Timeout). - -%%------------------------------------------------------------------------------ -%% @spec (Socket, SslFlag) -> {ok, Data} | {error, Reason} -%% Socket = socket() -%% Length = integer() -%% SslFlag = boolean() -%% Data = term() -%% Reason = atom() -%% @doc -%% Reads available bytes from `Socket'. -%% Will block untill data is available on the socket and return the first -%% packet. -%% @end -%%------------------------------------------------------------------------------ --spec recv(socket(), boolean()) -> - {ok, any()} | {error, atom()} | {error, {http_error, string()}}. -recv(Socket, true) -> - ssl:recv(Socket, 0); -recv(Socket, false) -> - prim_inet:recv(Socket, 0). - --spec recv(socket(), boolean(), timeout()) -> - {ok, any()} | {error, atom()} | {error, {http_error, string()}}. -recv(Socket, true, Timeout) -> - ssl:recv(Socket, 0, Timeout); -recv(Socket, false, Timeout) -> - prim_inet:recv(Socket, 0, Timeout). - -%%------------------------------------------------------------------------------ -%% @spec (Socket, Data, SslFlag) -> ok | {error, Reason} -%% Socket = socket() -%% Data = iolist() -%% SslFlag = boolean() -%% Reason = atom() -%% @doc -%% Sends data on a socket. -%% Will use the `ssl' module if `SslFlag' is set to `true', otherwise the -%% gen_tcp module. -%% @end -%%------------------------------------------------------------------------------ --spec send(socket(), iolist() | binary(), boolean()) -> ok | {error, atom()}. -send(Socket, Request, true) -> - ssl:send(Socket, Request); -send(Socket, Request, false) -> - prim_inet:send(Socket, Request, []). - -%%------------------------------------------------------------------------------ -%% @spec (Socket, SslFlag) -> ok | {error, Reason} -%% Socket = socket() -%% SslFlag = boolean() -%% Reason = atom() -%% @doc -%% Closes a socket. -%% @end -%%------------------------------------------------------------------------------ --spec close(socket(), boolean()) -> ok | {error, atom()}. -close(Socket, true) -> - ssl:close(Socket); -close(Socket, false) -> - gen_tcp:close(Socket). - -%%------------------------------------------------------------------------------ -%% @spec (Socket, Opts, SslFlag) -> ok | {error, Reason} -%% Socket = socket() -%% Opts = list() -%% SslFlag = boolean() -%% Reason = atom() -%% @doc -%% Sets options for a socket. -%% Will use the `ssl' module if `SslFlag' is set to `true', otherwise the -%% inets module. -%% @end -%%------------------------------------------------------------------------------ --spec setopts(socket(), list(), boolean()) -> ok | {error, atom()}. -setopts(Socket, Opts, true) -> - ssl:setopts(Socket, Opts); -setopts(Socket, Opts, false) -> - inet:setopts(Socket, Opts). diff --git a/ejabberd_auth_http/deps/fusco/test/crt.pem b/ejabberd_auth_http/deps/fusco/test/crt.pem deleted file mode 100644 index 0eb9674..0000000 --- a/ejabberd_auth_http/deps/fusco/test/crt.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICqzCCAhQCCQCDYWGxYNaErjANBgkqhkiG9w0BAQUFADCBmTELMAkGA1UEBhMC -VUsxDzANBgNVBAgTBkVybGFuZzEPMA0GA1UEBxMGTG9uZG9uMSwwKgYDVQQKEyNF -cmxhbmcgVHJhaW5pbmcgYW5kIENvbnN1bHRpbmcgTHRkLjEPMA0GA1UEAxMGbGh0 -dHBjMSkwJwYJKoZIhvcNAQkBFhpjb2RlQGVybGFuZy1jb25zdWx0aW5nLmNvbTAe -Fw0wOTA2MDYxNjA2MThaFw0xMDA2MDYxNjA2MThaMIGZMQswCQYDVQQGEwJVSzEP -MA0GA1UECBMGRXJsYW5nMQ8wDQYDVQQHEwZMb25kb24xLDAqBgNVBAoTI0VybGFu -ZyBUcmFpbmluZyBhbmQgQ29uc3VsdGluZyBMdGQuMQ8wDQYDVQQDEwZsaHR0cGMx -KTAnBgkqhkiG9w0BCQEWGmNvZGVAZXJsYW5nLWNvbnN1bHRpbmcuY29tMIGfMA0G -CSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6YrA5HIBj817qplKlRaU3dkCnnZtKS666 -lRbqsdj3Fug7ezANmUrUZIGMTDOAwYg3E2JPAL1VOiPmi/ENlanLTyOp2SkqYLfR -59Z5wr1nE/iAC+es7WT2OPjXG7MIBvnM7FNpHY17F4MM0FWWm+LJyJRucUZHL964 -nw0c2xZ3fwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAHRPJK72okG7u//YgJ1zIHzi -P8xtoUqwRikNNK1Zf1//xrgMFdsX4M7ZrX+SJ5ArXXpvy8iUbx81m9w+tuEyqdnl -VbBherAqLi2XmwJFu2n6TIfJB2eUjZg95lUbIJsNuiqL05/LNthFdkVAvyi8nTC4 -KAqPDQhDdvpmaBZDKE1L ------END CERTIFICATE----- diff --git a/ejabberd_auth_http/deps/fusco/test/fusco_cp_tests.erl b/ejabberd_auth_http/deps/fusco/test/fusco_cp_tests.erl deleted file mode 100644 index c8be7c5..0000000 --- a/ejabberd_auth_http/deps/fusco/test/fusco_cp_tests.erl +++ /dev/null @@ -1,57 +0,0 @@ -%%% ---------------------------------------------------------------------------- -%%% @copyright (C) 2013, Erlang Solutions Ltd -%%% @author Diana Parra Corbacho -%%% @doc Fusco Client Pool tests -%%% @end -%%%----------------------------------------------------------------------------- --module(fusco_cp_tests). - --include_lib("eunit/include/eunit.hrl"). - --define(POOL, fusco_pool). - -client_pool_test_() -> - {foreach, - fun() -> - {ok, Pid} = fusco_cp:start({"127.0.0.1", 5050, false}, [], 3), - erlang:register(?POOL, Pid), - Pid - end, - fun(Pid) -> - fusco_cp:stop(Pid) - end, - [ - {timeout, 60000, {"Get client", fun get_client/0}}, - {"Free client", fun free_client/0}, - {"Unblock client", fun unblock_client/0} - ] - }. - -get_client() -> - ?assertEqual(true, is_pid(fusco_cp:get_client(?POOL))), - ?assertEqual(true, is_pid(fusco_cp:get_client(?POOL))), - ?assertEqual(true, is_pid(fusco_cp:get_client(?POOL))), - ?assertEqual({error, timeout}, fusco_cp:get_client(?POOL)). - -free_client() -> - Pid = fusco_cp:get_client(?POOL), - ?assertEqual(true, is_pid(Pid)), - ?assertEqual(ok, fusco_cp:free_client(?POOL, Pid)), - ?assertEqual(Pid, fusco_cp:get_client(?POOL)). - -unblock_client() -> - Client = fusco_cp:get_client(?POOL), - ?assertEqual(true, is_pid(Client)), - ?assertEqual(true, is_pid(fusco_cp:get_client(?POOL))), - ?assertEqual(true, is_pid(fusco_cp:get_client(?POOL))), - To = self(), - spawn(fun() -> - Pid = fusco_cp:get_client(?POOL), - To ! {client, Pid} - end), - ?assertEqual(ok, fusco_cp:free_client(?POOL, Client)), - ?assertEqual({client, Client}, receive - {client, _} = R -> - R - end). - diff --git a/ejabberd_auth_http/deps/fusco/test/fusco_lib_tests.erl b/ejabberd_auth_http/deps/fusco/test/fusco_lib_tests.erl deleted file mode 100644 index d23cac8..0000000 --- a/ejabberd_auth_http/deps/fusco/test/fusco_lib_tests.erl +++ /dev/null @@ -1,207 +0,0 @@ -%%%----------------------------------------------------------------------------- -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Oscar Hellström -%%% @author Diana Parra Corbacho -%%% @doc -%%% @end -%%%----------------------------------------------------------------------------- --module(fusco_lib_tests). --copyright("2013, Erlang Solutions Ltd."). - --include("../include/fusco_types.hrl"). --include("../include/fusco.hrl"). --include_lib("eunit/include/eunit.hrl"). - -parse_url_test_() -> - [ - ?_assertEqual(#fusco_url{ - host = "host", - port = 80, - path = "/", - is_ssl = false, - user = "", - password = "" - }, - fusco_lib:parse_url("http://host")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 80, - path = "/", - is_ssl = false, - user = "", - password = "" - }, - fusco_lib:parse_url("http://host/")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 443, - path = "/", - is_ssl = true, - user = "", - password = "" - }, - fusco_lib:parse_url("https://host")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 443, - path = "/", - is_ssl = true, - user = "", - password = "" - }, - fusco_lib:parse_url("https://host/")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 180, - path = "/", - is_ssl = false, - user = "", - password = "" - }, - fusco_lib:parse_url("http://host:180")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 180, - path = "/", - is_ssl = false, - user = "", - password = "" - }, - fusco_lib:parse_url("http://host:180/")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 180, - path = "/foo", - is_ssl = false, - user = "", - password = "" - }, - fusco_lib:parse_url("http://host:180/foo")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 180, - path = "/foo/bar", - is_ssl = false, - user = "", - password = "" - }, - fusco_lib:parse_url("http://host:180/foo/bar")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 180, - path = "/foo/bar", - is_ssl = false, - user = "joe", - password = "erlang" - }, - fusco_lib:parse_url("http://joe:erlang@host:180/foo/bar")), - - - ?_assertEqual(#fusco_url{ - host = "host", - port = 180, - path = "/foo/bar", - is_ssl = false, - user = "joe", - password = "erl@ng" - }, - fusco_lib:parse_url("http://joe:erl%40ng@host:180/foo/bar")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 180, - path = "/foo/bar", - is_ssl = false, - user = "joe", - password = "" - }, - fusco_lib:parse_url("http://joe@host:180/foo/bar")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 180, - path = "/foo/bar", - is_ssl = false, - user = "", - password = "" - }, - fusco_lib:parse_url("http://@host:180/foo/bar")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 180, - path = "/foo/bar", - is_ssl = false, - user = "joe:arm", - password = "erlang" - }, - fusco_lib:parse_url("http://joe%3Aarm:erlang@host:180/foo/bar")), - - ?_assertEqual(#fusco_url{ - host = "host", - port = 180, - path = "/foo/bar", - is_ssl = false, - user = "joe:arm", - password = "erlang/otp" - }, - fusco_lib:parse_url("http://joe%3aarm:erlang%2Fotp@host:180/foo/bar")), - - ?_assertEqual(#fusco_url{ - host = "::1", - port = 80, - path = "/foo/bar", - is_ssl = false, - user = "", - password = "" - }, - fusco_lib:parse_url("http://[::1]/foo/bar")), - - ?_assertEqual(#fusco_url{ - host = "::1", - port = 180, - path = "/foo/bar", - is_ssl = false, - user = "", - password = "" - }, - fusco_lib:parse_url("http://[::1]:180/foo/bar")), - - ?_assertEqual(#fusco_url{ - host = "::1", - port = 180, - path = "/foo/bar", - is_ssl = false, - user = "joe", - password = "erlang" - }, - fusco_lib:parse_url("http://joe:erlang@[::1]:180/foo/bar")), - - ?_assertEqual(#fusco_url{ - host = "1080:0:0:0:8:800:200c:417a", - port = 180, - path = "/foo/bar", - is_ssl = false, - user = "joe", - password = "erlang" - }, - fusco_lib:parse_url("http://joe:erlang@[1080:0:0:0:8:800:200C:417A]:180/foo/bar")), - - ?_assertEqual(#fusco_url{ - host = "www.example.com", - port = 80, - path = "/?a=b", - is_ssl = false, - user = "", - password = "" - }, - fusco_lib:parse_url("http://www.example.com?a=b")) - ]. diff --git a/ejabberd_auth_http/deps/fusco/test/fusco_protocol_SUITE.erl b/ejabberd_auth_http/deps/fusco/test/fusco_protocol_SUITE.erl deleted file mode 100644 index cdfc9de..0000000 --- a/ejabberd_auth_http/deps/fusco/test/fusco_protocol_SUITE.erl +++ /dev/null @@ -1,38 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Diana Corbacho -%%% @doc -%%% @end -%%%============================================================================= --module(fusco_protocol_SUITE). --copyright("2013, Erlang Solutions Ltd."). - --compile(export_all). - -all() -> - [prop_http_response_close_connection, - prop_http_response_keep_alive, - prop_chunked_http_response_keep_alive]. - -%%============================================================================== -%% Test cases -%%============================================================================== -prop_http_response_close_connection(_) -> - do_prop(prop_http_response_close_connection). - -prop_http_response_keep_alive(_) -> - do_prop(prop_http_response_keep_alive). - -prop_chunked_http_response_keep_alive(_) -> - do_prop(prop_chunked_http_response_keep_alive). - -%%============================================================================== -%% Internal functions -%%============================================================================== -do_prop(Case) -> - case eqc:counterexample(erlang:apply(fusco_protocol_eqc, Case, [])) of - true -> - true; - Value -> - exit(Value) - end. diff --git a/ejabberd_auth_http/deps/fusco/test/fusco_protocol_eqc.erl b/ejabberd_auth_http/deps/fusco/test/fusco_protocol_eqc.erl deleted file mode 100644 index e2f8aa3..0000000 --- a/ejabberd_auth_http/deps/fusco/test/fusco_protocol_eqc.erl +++ /dev/null @@ -1,173 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Diana Corbacho -%%% @doc -%%% @end -%%%============================================================================= --module(fusco_protocol_eqc). --copyright("2013, Erlang Solutions Ltd."). - --include_lib("eqc/include/eqc.hrl"). --include("fusco.hrl"). - --export([prop_http_response_close_connection/0, - prop_http_response_keep_alive/0, - prop_chunked_http_response_keep_alive/0]). - -%%============================================================================== -%% Quickcheck generators -%%============================================================================== -valid_http_message() -> - ?LET({StatusLine, Headers, Cookies}, - {http_eqc_gen:status_line(), http_eqc_gen:headers(), - list(http_eqc_gen:set_cookie())}, - ?LET(Body, http_eqc_encoding:body(StatusLine), - {StatusLine, http_eqc_encoding:add_content_length(Headers, Body), - Cookies, Body})). - -valid_http_chunked_message() -> - ?LET({StatusLine, Headers, Cookies}, - {http_eqc_gen:status_line(), http_eqc_gen:headers(), - list(http_eqc_gen:set_cookie())}, - ?LET(Body, http_eqc_gen:chunked_body(), - {StatusLine, http_eqc_encoding:add_transfer_encoding( - Headers, <<"chunked">>), - Cookies, Body})). - -%%============================================================================== -%% Quickcheck properties -%%============================================================================== -prop_http_response_close_connection() -> - %% Connection is closed just after send the response - prop_http_response(close). - -prop_http_response_keep_alive() -> - %% Connection stays open after send the response - prop_http_response(keepalive). - -prop_chunked_http_response_keep_alive() -> - %% Connection stays open after send the response - prop_chunked_http_response(keepalive). - -prop_http_response(ConnectionState) -> - eqc:numtests( - 500, - ?FORALL(ValidMessage, valid_http_message(), - decode_valid_message(ConnectionState, ValidMessage))). - -decode_valid_message(ConnectionState, {StatusLine, Headers, Cookies, Body}) -> - Msg = http_eqc_encoding:build_valid_response(StatusLine, Headers, Cookies, Body), - L = {_, _, Socket} = - test_utils:start_listener({fragmented, Msg}, ConnectionState), - test_utils:send_message(Socket), - Recv = fusco_protocol:recv(Socket, false), - test_utils:stop_listener(L), - Expected = expected_output(StatusLine, Headers, Cookies, Body, Msg), - Cleared = clear_record(clear_connection(Recv)), - ?WHENFAIL(io:format("Message:~n=======~n~s~n=======~nResponse:" - " ~p~nCleared: ~p~nExpected: ~p~n", - [binary:list_to_bin(Msg), Recv, Cleared, Expected]), - case Cleared of - Expected -> - true; - _ -> - false - end). - -prop_chunked_http_response(ConnectionState) -> - eqc:numtests( - 500, - ?FORALL(ValidMessage, valid_http_chunked_message(), - decode_valid_message(ConnectionState, ValidMessage))). - -%%============================================================================== -%% Internal functions -%%============================================================================== -expected_output({HttpVersion, StatusCode, Reason}, Headers, Cookies, Body, Msg) -> - Version = http_version(HttpVersion), - OCookies = [{Name, list_to_binary(http_eqc_encoding:build_cookie(Cookie))} - || {Name, Cookie} <- Cookies], - LowerHeaders = lists:reverse(headers_to_lower(Headers ++ OCookies)), - CookiesRec = output_cookies(Cookies), - #response{version = Version, - status_code = StatusCode, - reason = Reason, - cookies = CookiesRec, - headers = LowerHeaders, - connection = to_lower(proplists:get_value(<<"connection">>, - LowerHeaders)), - body = expected_body(Body), - content_length = content_length(Body), - transfer_encoding = to_lower(proplists:get_value(<<"transfer-encoding">>, - LowerHeaders)), - size = byte_size(list_to_binary(Msg))}. - -expected_body(Body) when is_binary(Body) -> - Body; -expected_body(List) -> - list_to_binary([Bin || {_, Bin} <- List]). - -content_length(Body) when is_binary(Body) -> - byte_size(Body); -content_length(_) -> - 0. - -output_cookies(Cookies) -> - output_cookies(Cookies, []). - -output_cookies([{_SetCookie, {{K, V}, Avs}} | Rest], Acc) -> - MaxAge = output_max_age(proplists:get_value(<<"Max-Age">>, Avs)), - Path = proplists:get_value(<<"Path">>, Avs), - PathTokens = case Path of - Bin when is_binary(Bin) -> - binary:split(Bin, <<"/">>, [global]); - undefined -> - undefined - end, - Expires = http_eqc_encoding:expires_datetime(proplists:get_value(<<"Expires">>, Avs)), - Cookie = #fusco_cookie{name = K, value = V, max_age = MaxAge, path = Path, - path_tokens = PathTokens, - expires = Expires, - domain = proplists:get_value(<<"Domain">>, Avs)}, - output_cookies(Rest, [Cookie | Acc]); -output_cookies([], Acc) -> - Acc. - -output_max_age(undefined) -> - undefined; -output_max_age(Age) -> - list_to_integer(binary_to_list(Age)) * 1000000. - -clear_record(Response) when is_record(Response, response) -> - Response#response{socket = undefined, - ssl = undefined, - in_timestamp = undefined}; -clear_record(Error) -> - Error. - -clear_connection(Response) when is_record(Response, response) -> - Response#response{connection = to_lower(Response#response.connection)}; -clear_connection(Error) -> - Error. - -http_version(<<"HTTP/1.1">>) -> - {1, 1}; -http_version(<<"HTTP/1.0">>) -> - {1, 0}. - -headers_to_lower(Headers) -> - [begin - He = to_lower(H), - case He of - LH when LH == <<"connection">>; LH == <<"transfer-encoding">> -> - {He, to_lower(V)}; - _ -> - {He, V} - end - end || {H, V} <- Headers]. - -to_lower(undefined) -> - undefined; -to_lower(Bin) -> - list_to_binary(string:to_lower(binary_to_list(Bin))). - diff --git a/ejabberd_auth_http/deps/fusco/test/fusco_protocol_tests.erl b/ejabberd_auth_http/deps/fusco/test/fusco_protocol_tests.erl deleted file mode 100644 index bc00682..0000000 --- a/ejabberd_auth_http/deps/fusco/test/fusco_protocol_tests.erl +++ /dev/null @@ -1,66 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Diana Corbacho -%%% @doc -%%% @end -%%%============================================================================= --module(fusco_protocol_tests). --copyright("2013, Erlang Solutions Ltd."). - --include_lib("eunit/include/eunit.hrl"). --include("fusco.hrl"). - --export([test_decode_header/0]). - -fusco_protocol_test_() -> - [{"HTTP version", ?_test(http_version())}, - {"Cookies", ?_test(cookies())}, - {"Decode header", ?_test(decode_header())}]. - -http_version() -> - L = {_, _, Socket} = test_utils:start_listener(cookie_message()), - test_utils:send_message(Socket), - ?assertMatch(#response{version = {1,1}, - status_code = <<"200">>, - reason = <<"OK">>, - body = <<"Great success!">>}, - fusco_protocol:recv(Socket, false)), - test_utils:stop_listener(L). - -cookies() -> - L = {_, _, Socket} = test_utils:start_listener(cookie_message()), - test_utils:send_message(Socket), - Recv = fusco_protocol:recv(Socket, false), - test_utils:stop_listener(L), - ?assertMatch(#response{version = {1,1}, - status_code = <<"200">>, - reason = <<"OK">>, - headers = [{<<"set-cookie">>,<<"name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT">>}, - {<<"set-cookie">>,<<"name=value">>} | _], - body = <<"Great success!">>}, - Recv). - -decode_header() -> - ?assertMatch(#response{ - headers = [{<<"set-cookie">>,<<"name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT">>}, - {<<"set-cookie">>,<<"name=value">>}, - {<<"content-length">>, <<"14">>}, - {<<"content-type">>,<<"text/plain">>}], - body = <<"Great success!">>}, - test_decode_header()). - -test_decode_header() -> - fusco_protocol:decode_header(header(), <<>>, #response{}). - -header() -> - <<"Content-type: text/plain\r\nContent-length: 14\r\nSet-Cookie: name=value\r\nSet-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT\r\n\r\nGreat success!">>. - -cookie_message() -> - [ - "HTTP/1.1 200 OK\r\n" - "Content-type: text/plain\r\nContent-length: 14\r\n" - "Set-Cookie: name=value\r\n" - "Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT\r\n" - "\r\n" - "Great success!" - ]. diff --git a/ejabberd_auth_http/deps/fusco/test/fusco_tests.erl b/ejabberd_auth_http/deps/fusco/test/fusco_tests.erl deleted file mode 100644 index b008b72..0000000 --- a/ejabberd_auth_http/deps/fusco/test/fusco_tests.erl +++ /dev/null @@ -1,201 +0,0 @@ -%%% ---------------------------------------------------------------------------- -%%% Copyright (c) 2009, Erlang Training and Consulting Ltd. -%%% All rights reserved. -%%% -%%% Redistribution and use in source and binary forms, with or without -%%% modification, are permitted provided that the following conditions are met: -%%% * Redistributions of source code must retain the above copyright -%%% notice, this list of conditions and the following disclaimer. -%%% * Redistributions in binary form must reproduce the above copyright -%%% notice, this list of conditions and the following disclaimer in the -%%% documentation and/or other materials provided with the distribution. -%%% * Neither the name of Erlang Training and Consulting Ltd. nor the -%%% names of its contributors may be used to endorse or promote products -%%% derived from this software without specific prior written permission. -%%% -%%% THIS SOFTWARE IS PROVIDED BY Erlang Training and Consulting Ltd. ''AS IS'' -%%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -%%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -%%% ARE DISCLAIMED. IN NO EVENT SHALL Erlang Training and Consulting Ltd. BE -%%% LIABLE SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -%%% BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -%%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -%%% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -%%% ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -%%% ---------------------------------------------------------------------------- - -%%% @author Oscar Hellström --module(fusco_tests). - --export([test_no/2]). - --include_lib("eunit/include/eunit.hrl"). - -test_no(N, Tests) -> - setelement(2, Tests, - setelement(4, element(2, Tests), - lists:nth(N, element(4, element(2, Tests))))). - -%%% Eunit setup stuff - -start_app() -> - [application:start(App) || App <- apps()]. - -apps() -> - [crypto, asn1, public_key, ssl]. - -stop_app(_) -> - [application:stop(App) || App <- lists:reverse(apps())]. - -tcp_test_() -> - {inorder, - {setup, fun start_app/0, fun stop_app/1, [ - ?_test(get_with_connect_options()), - ?_test(no_content_length()), - ?_test(no_content_length_1_0()), - ?_test(pre_1_1_server_connection()), - ?_test(pre_1_1_server_keep_alive()), - ?_test(post_100_continue()), - ?_test(request_timeout()), - ?_test(trailing_space_header()), - ?_test(closed_after_timeout()) - ]} - }. - -options_test() -> - invalid_options(). - -get_with_connect_options() -> - {ok, _, _, Port} = webserver:start(gen_tcp, [fun webserver_utils:empty_body/5]), - URL = url(Port), - Options = [{connect_options, [{ip, {127, 0, 0, 1}}, {port, 0}]}], - {ok, Client} = fusco:start(URL, Options), - {ok, Response} = fusco:request(Client, <<"/empty">>, "GET", [], [], 1, 1000), - ?assertEqual({<<"200">>, <<"OK">>}, status(Response)), - ?assertEqual(<<>>, body(Response)). - -no_content_length() -> - {ok, _, _, Port} = webserver:start(gen_tcp, [fun webserver_utils:no_content_length/5]), - URL = url(Port), - {ok, Client} = fusco:start(URL, []), - {ok, Response} = fusco:request(Client, <<"/no_cl">>, "GET", [], [], 1000), - ?assertEqual({<<"200">>, <<"OK">>}, status(Response)), - ?assertEqual(list_to_binary(webserver_utils:default_string()), body(Response)). - -no_content_length_1_0() -> - {ok, _, _, Port} = webserver:start(gen_tcp, [fun webserver_utils:no_content_length_1_0/5]), - URL = url(Port), - {ok, Client} = fusco:start(URL, []), - {ok, Response} = fusco:request(Client, <<"/no_cl">>, "GET", [], [], 1000), - ?assertEqual({<<"200">>, <<"OK">>}, status(Response)), - ?assertEqual(list_to_binary(webserver_utils:default_string()), body(Response)). - -%% Check the header value is trimming spaces on header values -%% which can cause crash in fusco_client:body_type when Content-Length -%% is converted from list to integer -trailing_space_header() -> - {ok, _, _, Port} = webserver:start(gen_tcp, [fun webserver_utils:trailing_space_header/5]), - URL = url(Port), - {ok, Client} = fusco:start(URL, []), - {ok, Response} = fusco:request(Client, <<"/no_cl">>, "GET", [], [], 1000), - Headers = headers(Response), - ContentLength = fusco_lib:header_value(<<"content-length">>, Headers), - ?assertEqual(<<"14">>, ContentLength). - -pre_1_1_server_connection() -> - {ok, _, _, Port} = webserver:start(gen_tcp, [fun webserver_utils:pre_1_1_server/5]), - URL = url(Port), - Body = pid_to_list(self()), - {ok, Client} = fusco:start(URL, []), - {ok, _} = fusco:request(Client, <<"/close">>, "PUT", [], Body, 1000), - % Wait for the server to see that socket has been closed. - % The socket should be closed by us since the server responded with a - % 1.0 version, and not the Connection: keep-alive header. - receive closed -> ok end. - -pre_1_1_server_keep_alive() -> - {ok, _, _, Port} = webserver:start(gen_tcp, - [ - fun webserver_utils:pre_1_1_server_keep_alive/5, - fun webserver_utils:pre_1_1_server/5 - ]), - URL = url(Port), - Body = pid_to_list(self()), - {ok, Client} = fusco:start(URL, []), - {ok, Response1} = fusco:request(Client, <<"/close">>, "GET", [], [], 1000), - {ok, Response2} = fusco:request(Client, <<"/close">>, "PUT", [], Body, 1000), - ?assertEqual({<<"200">>, <<"OK">>}, status(Response1)), - ?assertEqual({<<"200">>, <<"OK">>}, status(Response2)), - ?assertEqual(list_to_binary(webserver_utils:default_string()), body(Response1)), - ?assertEqual(list_to_binary(webserver_utils:default_string()), body(Response2)), - % Wait for the server to see that socket has been closed. - % The socket should be closed by us since the server responded with a - % 1.0 version, and not the Connection: keep-alive header. - receive closed -> ok end. - -post_100_continue() -> - {ok, _, _, Port} = webserver:start(gen_tcp, [fun webserver_utils:copy_body_100_continue/5]), - URL = url(Port), - {X, Y, Z} = now(), - Body = [ - "This is a rather simple post :)", - integer_to_list(X), - integer_to_list(Y), - integer_to_list(Z) - ], - {ok, Client} = fusco:start(URL, []), - {ok, Response} = fusco:request(Client, <<"/post">>, "POST", [], Body, 1000), - {StatusCode, ReasonPhrase} = status(Response), - ?assertEqual(<<"200">>, StatusCode), - ?assertEqual(<<"OK">>, ReasonPhrase), - ?assertEqual(iolist_to_binary(Body), body(Response)). - -request_timeout() -> - {ok, _, _, Port} = webserver:start(gen_tcp, [fun webserver_utils:very_slow_response/5]), - URL = url(Port), - {ok, Client} = fusco:start(URL, []), - ?assertEqual({error, timeout}, fusco:request(Client, <<"/slow">>, "GET", [], [], 50)). - -invalid_options() -> - URL = url(5050), - ?assertError({bad_option, bad_option}, - fusco:start(URL, [bad_option, {foo, bar}])), - ?assertError({bad_option, {foo, bar}}, - fusco:start(URL, [{foo, bar}, bad_option])). - -closed_after_timeout() -> - {ok, _, _, Port} = webserver:start(gen_tcp, [fun webserver_utils:no_response/5, stay_open]), - URL = url(Port), - {ok, Client} = fusco:start(URL, []), - fusco:request(Client, <<"/slow">>, "GET", [], [], 50), - fusco:disconnect(Client), - wait_for_exit(10, Client), - ?assertEqual(false,erlang:is_process_alive(Client)). - -wait_for_exit(0, _) -> - ok; -wait_for_exit(N, Proc) -> - timer:sleep(50), - case is_process_alive(Proc) of - false -> - ok; - true -> - wait_for_exit(N - 1, Proc) - end. - -url(Port) -> - url(inet, Port). - -url(inet, Port) -> - "http://localhost:" ++ integer_to_list(Port); -url(inet6, Port) -> - "http://[::1]:" ++ integer_to_list(Port). - -status({Status, _, _, _, _}) -> - Status. - -body({_, _, Body, _, _}) -> - Body. - -headers({_, Headers, _, _, _}) -> - Headers. diff --git a/ejabberd_auth_http/deps/fusco/test/fusco_tests_SUITE.erl b/ejabberd_auth_http/deps/fusco/test/fusco_tests_SUITE.erl deleted file mode 100644 index 9176a0d..0000000 --- a/ejabberd_auth_http/deps/fusco/test/fusco_tests_SUITE.erl +++ /dev/null @@ -1,102 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Diana Corbacho -%%% @doc -%%% @end -%%%============================================================================= --module(fusco_tests_SUITE). --copyright("2013, Erlang Solutions Ltd."). - --include_lib("common_test/include/ct.hrl"). - --compile(export_all). - -all() -> - [{group, ipv4}, {group, ipv6}, {group, ipv4ssl}, {group, ipv6ssl}, - {group, independent}]. - -init_per_group(ipv4, Config) -> - [{fusco_parameters, {"127.0.0.1", inet, false}} | Config]; -init_per_group(ipv6, Config) -> - [{fusco_parameters, {"::1", inet6, false}} | Config]; -init_per_group(ipv4ssl, Config) -> - [ok = application:start(App) || App <- apps()], - [{fusco_parameters, {"127.0.0.1", inet, true}} | Config]; -init_per_group(ipv6ssl, Config) -> - [ok = application:start(App) || App <- apps()], - [{fusco_parameters, {"::1", inet6, true}} | Config]; -init_per_group(independent, Config) -> - [{fusco_parameters, {"127.0.0.1", inet, false}} | Config]. - -end_per_group(ipv4, _Config) -> - ok; -end_per_group(ipv6, _Config) -> - ok; -end_per_group(ipv4ssl, _Config) -> - [application:stop(App) || App <- lists:reverse(apps())], - ok; -end_per_group(ipv6ssl, _Config) -> - [application:stop(App) || App <- lists:reverse(apps())], - ok; -end_per_group(independent, _Config) -> - ok. - -apps() -> - [asn1, crypto, public_key, ssl, fusco]. - -groups() -> - [{ipv4, [], all_tests()}, - {ipv6, [], all_tests()}, - {ipv4ssl, [], all_tests()}, - {ipv6ssl, [], all_tests()}, - {independent, [], independent_tests()}]. - -all_tests() -> - [prop_http_request, prop_persistent_connection, prop_reconnect, - prop_client_close_connection, prop_connection_refused]. - -independent_tests() -> - [prop_http_request_cookie_path, prop_http_request_supersede_cookie, - prop_http_request_max_age, prop_http_request_expires]. - -%%============================================================================== -%% Test cases -%%============================================================================== -prop_http_request(Config) -> - do_prop(prop_http_request_per_family, Config). - -prop_persistent_connection(Config) -> - do_prop(prop_persistent_connection_per_family, Config). - -prop_reconnect(Config) -> - do_prop(prop_reconnect_per_family, Config). - -prop_client_close_connection(Config) -> - do_prop(prop_client_close_connection_per_family, Config). - -prop_connection_refused(Config) -> - do_prop(prop_connection_refused_per_family, Config). - -prop_http_request_cookie_path(Config) -> - do_prop(prop_http_request_cookie_path, Config). - -prop_http_request_supersede_cookie(Config) -> - do_prop(prop_http_request_supersede_cookie, Config). - -prop_http_request_max_age(Config) -> - do_prop(prop_http_request_max_age, Config). - -prop_http_request_expires(Config) -> - do_prop(prop_http_request_expires, Config). - -%%============================================================================== -%% Internal functions -%%============================================================================== -do_prop(Case, Config) -> - {Ip, Family, Ssl} = ?config(fusco_parameters, Config), - case eqc:counterexample(erlang:apply(fusco_tests_eqc, Case, [Ip, Family, Ssl])) of - true -> - true; - Value -> - exit(Value) - end. diff --git a/ejabberd_auth_http/deps/fusco/test/fusco_tests_eqc.erl b/ejabberd_auth_http/deps/fusco/test/fusco_tests_eqc.erl deleted file mode 100644 index e7002c5..0000000 --- a/ejabberd_auth_http/deps/fusco/test/fusco_tests_eqc.erl +++ /dev/null @@ -1,676 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Diana Corbacho -%%% @doc -%%% @end -%%%============================================================================= --module(fusco_tests_eqc). --copyright("2013, Erlang Solutions Ltd."). - --include_lib("eqc/include/eqc.hrl"). --include("fusco.hrl"). - --define(TWO_OK, <<"HTTP/1.1 200 OK\r\n\r\n">>). --define(FOUR_BAD_REQUEST, <<"HTTP/1.1 400 Bad Request\r\n">>). --define(TWO_OK(V), case V of - undefined -> - ?TWO_OK; - _ -> - <<"HTTP/1.1 200 OK\r\nConnection: ", - V/binary,"\r\n\r\n">> - end). - --export([prop_http_request_per_family/3, - prop_persistent_connection_per_family/3, - prop_reconnect_per_family/3, - prop_client_close_connection_per_family/3, - prop_connection_refused_per_family/3, - prop_http_request_cookie_path/3, - prop_http_request_supersede_cookie/3, - prop_http_request_max_age/3, - prop_http_request_expires/3]). - -%%============================================================================== -%% Quickcheck generators -%%============================================================================== -valid_http_request() -> - ?LET({RequestLine, Headers}, - {http_eqc_gen:request_line(), http_eqc_gen:request_headers()}, - ?LET(Body, http_eqc_encoding:body(any), - {RequestLine, http_eqc_encoding:add_content_length(Headers, Body), - Body})). - -valid_http_response() -> - ?LET({StatusLine, Headers}, - {status_line(), http_eqc_gen:headers()}, - ?LET(Body, http_eqc_encoding:body(StatusLine), - {StatusLine, Headers, Body} - ) - ). - -status_line() -> - %% Discard CONTINUE for cookie testing, client waits for next messages - ?SUCHTHAT({_, S, _}, http_eqc_gen:status_line(), - not lists:member(S, [<<"100">>, <<"101">>])). - -token() -> - non_empty(list(choose($A, $z))). - -path() -> - ?LET({Path, Slash}, {non_empty(list(token())), slash()}, - Path ++ Slash). - -domain() -> - ?LET(Domain, path(), list_to_binary(string:join(Domain, "."))). - -slash() -> - oneof([["/"], []]). - -subpath(Path, true) -> - ?LET({Length, Slash}, {choose(1, length(Path)), slash()}, - begin - {H, _} = lists:split(Length, Path), - case lists:last(H) of - "/" -> - H; - _ -> - H ++ Slash - end - end); -subpath(Path, false) -> - ?SUCHTHAT(SubPath, path(), hd(SubPath) =/= hd(Path)). - -max_age() -> - %% Make cookie expire on nat/0 and not expire on largeint/0 - %% Otherwise, in black box testing we lose the control to make cookie - %% expire on values near the current time. It needs unit testing - %% to verify the expiration is precise. - ?LET({Expires, MaxAge}, - oneof([{true, nat()}, {false, largeint()}]), - case MaxAge of - 0 -> - {true, MaxAge}; - _ -> - {Expires, abs(MaxAge)} - end). - -past() -> - ?SUCHTHAT(Date, http_eqc_gen:sane_cookie_date(), is_past(Date)). - -future() -> - ?SUCHTHAT(Date, http_eqc_gen:sane_cookie_date(), is_future(Date)). - -expires() -> - oneof([{true, past()}, {false, future()}]). - -set_cookie(Path) -> - {<<"Set-Cookie">>, {http_eqc_gen:cookie_pair(), - [{<<"Path">>, encode_path(Path)}]}}. - -set_cookie(Path, MaxAge) when is_integer(MaxAge) -> - {<<"Set-Cookie">>, {http_eqc_gen:cookie_pair(), - [{<<"Path">>, encode_path(Path)}, - {<<"Max-Age">>, integer_to_binary(MaxAge)}]}}; -set_cookie(Path, Expires) -> - {<<"Set-Cookie">>, - {http_eqc_gen:cookie_pair(), - [{<<"Path">>, encode_path(Path)}, - {<<"Expires">>, Expires}]}}. - -set_cookie(Path, Domain, Name, Value) -> - {<<"Set-Cookie">>, {{Name, Value}, [{<<"Path">>, encode_path(Path)}, - {<<"Domain">>, Domain}]}}. - -cookie_path() -> - %% Cookie rejected if the value for the Path attribute - %% is not a prefix of the requested-URI - ?LET({Path, IsSubPath}, {path(), bool()}, - ?LET(SubPath, subpath(Path, IsSubPath), - ?LET(Cookie, set_cookie(SubPath), - {Cookie, encode_path(Path), IsSubPath} - ) - ) - ). - -cookie_max_age() -> - %% Path is needed in the test setup to ensure cookie is not rejected - ?LET({Path, {Expires, MaxAge}}, {path(), max_age()}, - ?LET(Cookie, set_cookie(Path, MaxAge), - {Cookie, encode_path(Path), Expires, MaxAge} - ) - ). - -cookie_expires() -> - %% Path is needed in the test setup to ensure cookie is not rejected - ?LET({Path, {Expires, Date}}, {path(), expires()}, - ?LET(Cookie, set_cookie(Path, Date), - {Cookie, encode_path(Path), Expires} - ) - ). - -maybe_different_cookie_data(true, Path, Domain, Name) -> - {Path, Domain, Name}; -maybe_different_cookie_data(false, Path, Domain, Name) -> - %% Generates a combination of 1 or more mutations on Path, Domain and Name - ?LET([ChangePath, ChangeDomain, ChangeName], - ?SUCHTHAT(V, vector(3, bool()), - lists:any(fun(X) -> X == true end, V)), - {change_path(ChangePath, Path), - change_domain(ChangeDomain, Domain), - change_name(ChangeName, Name)} - ). - -change_path(false, Path) -> - Path; -change_path(true, Path) -> - ?SUCHTHAT(P, path(), hd(P) =/= hd(Path)). - -change_domain(false, Domain) -> - Domain; -change_domain(true, Domain) -> - ?SUCHTHAT(D, domain(), D =/= Domain). - -change_name(false, Name) -> - Name; -change_name(true, Name) -> - ?SUCHTHAT(N, http_eqc_gen:small_valid_bin(), N =/= Name). - -%%============================================================================== -%% Quickcheck properties -%%============================================================================== -prop_http_request_per_family(Host, Family, Ssl) -> - eqc:numtests( - 500, - ?FORALL({{Method, Uri, _Version}, Headers, Body} = Msg, - valid_http_request(), - begin - Module = select_module(Ssl), - {ok, Listener, LS, Port} = - webserver:start(Module, [validate_msg(Msg)], Family), - {ok, Client} = fusco:start({Host, Port, Ssl}, []), - {ok, {Status, _, _, _, _}} - = fusco:request(Client, Uri, Method, Headers, Body, 10000), - ok = fusco:disconnect(Client), - webserver:stop(Module, Listener, LS), - Expected = {<<"200">>, <<"OK">>}, - ?WHENFAIL(io:format("Status: ~p~nExpected: ~p~n", - [Status, Expected]), - case Status of - Expected -> - true; - _ -> - false - end) - end)). - -prop_persistent_connection_per_family(Host, Family, Ssl) -> - %% Fusco must keep the connection alive and be able to reconnect - %% Individual properties defined for reconnect and keep-alive - ?FORALL( - Msgs, - non_empty(list({valid_http_request(), http_eqc_gen:connection_header()})), - begin - Module = select_module(Ssl), - {ok, Listener, LS, Port} = - webserver:start(Module, - [reply_msg(?TWO_OK(ConHeader)) || {_, ConHeader} <- Msgs], - Family), - {ok, Client} = fusco:start({Host, Port, Ssl}, []), - Replies = lists:map(fun({{{Method, Uri, _Version}, Headers, Body}, _}) -> - fusco:request(Client, Uri, Method, Headers, Body, 10000) - end, Msgs), - ok = fusco:disconnect(Client), - webserver:stop(Module, Listener, LS), - ?WHENFAIL(io:format("Replies: ~p~nExpected: 200 OK~n", [Replies]), - lists:all(fun({ok, {{<<"200">>, <<"OK">>}, _, _, _, _}}) -> - true; - (_) -> - false - end, Replies)) - end). - -prop_reconnect_per_family(Host, Family, Ssl) -> - %% Connection is always closed in the server and fusco must reconnect - eqc:numtests( - 50, - ?FORALL( - Msgs, - non_empty(list(valid_http_request())), - begin - Module = select_module(Ssl), - {ok, Listener, LS, Port} = - webserver:start(Module, - [reply_and_close_msg(?TWO_OK) || _ <- Msgs], - Family), - {ok, Client} = fusco:start({Host, Port, Ssl}, []), - Replies = lists:map(fun({{Method, Uri, _Version}, Headers, Body}) -> - Hdrs = lists:keydelete(<<"Connection">>, 1, Headers), - fusco:request(Client, Uri, Method, Hdrs, Body, 10000) - end, Msgs), - ok = fusco:disconnect(Client), - webserver:stop(Module, Listener, LS), - ?WHENFAIL(io:format("Replies: ~p~nExpected: 200 OK~n", [Replies]), - lists:all(fun({ok, {{<<"200">>, <<"OK">>}, _, _, _, _}}) -> - true; - (_) -> - false - end, Replies)) - end)). - -prop_client_close_connection_per_family(Host, Family, Ssl) -> - %% Fusco must close the connection if requested by the server - eqc:numtests( - 25, - ?FORALL({{{Method, Uri, _Version}, Headers, Body}, Connection}, - {valid_http_request(), http_eqc_gen:connection_header()}, - begin - Id = erlang:now(), - Module = select_module(Ssl), - {ok, Listener, LS, Port} = - webserver:start(Module, - [reply_msg_and_check(Id, ?TWO_OK(Connection))], - Family), - {ok, Client} = fusco:start({Host, Port, Ssl}, []), - {ok, {Status, _, _, _, _}} - = fusco:request(Client, Uri, Method, Headers, Body, 10000), - Closed = receive - {Id, closed} -> - true - after 1000 -> - false - end, - ok = fusco:disconnect(Client), - webserver:stop(Module, Listener, LS), - Expected = {<<"200">>, <<"OK">>}, - MustClose = must_close(Headers, Connection), - ?WHENFAIL(io:format("Connection: ~p~nStatus: ~p~nExpected:" - " ~p~nMust close: ~p~nClosed: ~p~n", - [Connection, Status, Expected, MustClose, Closed]), - case Status of - Expected -> - MustClose == Closed; - _ -> - false - end) - end)). - -prop_connection_refused_per_family(Host, Family, Ssl) -> - eqc:numtests(1, - begin - Module = select_module(Ssl), - {ok, Listener, LS, Port} = - webserver:start(Module, [reply_msg(<<>>)], Family), - webserver:stop(Module, Listener, LS), - {ok, Client} = fusco:start({Host, Port, Ssl}, []), - Reply = fusco:connect(Client), - Expected = {error, econnrefused}, - ?WHENFAIL(io:format("Reply: ~p~nExpected: ~p~n", - [Reply, Expected]), - case Reply of - Expected -> - true; - _ -> - false - end) - end). - -%% Cookie rejected if the value for the Path attribute -%% is not a prefix of the requested-URI -prop_http_request_cookie_path(Host, Family, Ssl) -> - ?FORALL( - {Request, {Cookie, Path, IsSubPath}, - {{_, Status, Reason}, _, _} = Response}, - {valid_http_request(), cookie_path(), valid_http_response()}, - begin - ResponseBin = build_response(Response, [Cookie]), - ValidationFun = validate_cookie(ResponseBin, fun check_cookie_deleted/3, - [not IsSubPath, Cookie]), - Responses = - send_cookie_requests(Host, Ssl, Family, ValidationFun, Path, Request, - [<<"first">>, <<"second">>], 0), - check_responses(Status, Reason, Responses) - end - ). - -%% Supersed old cookie if Name is the same as existing cookie, -%% and Domain and Path exactly match pre-existing ones -prop_http_request_supersede_cookie(Host, Family, Ssl) -> - ?FORALL( - {Request, Path, Domain, {Name, Value}, Supersede, - {{_, Status, Reason}, _, _} = Response}, - {valid_http_request(), path(), domain(), http_eqc_gen:cookie_pair(), - bool(), valid_http_response()}, - %% Generate a second cookie that could supersed or not the previous one - %% Uses 'Supersede' as generation parameter - ?LET( - {{SPath, SDomain, SName}, SValue}, - {maybe_different_cookie_data(Supersede, Path, Domain, Name), - ?SUCHTHAT(V, http_eqc_gen:small_valid_bin(), V =/= Value)}, - begin - FirstCookie = set_cookie(Path, Domain, Name, Value), - SecondCookie = set_cookie(SPath, SDomain, SName, SValue), - FirstServerResponse = build_response(Response, [FirstCookie]), - SecondServerResponse = build_response(Response, [SecondCookie]), - ValidationFun = validate_cookie_supersede( - FirstServerResponse, SecondServerResponse, - Supersede, {Name, Value, encode_path(Path), Domain}, - {SName, SValue, encode_path(SPath), SDomain}), - %% Three requests to supersede the value - %% First get cookie - %% Second get second cookie - %% Third checks received cookies - Responses = - send_cookie_requests(Host, Ssl, Family, ValidationFun, - encode_path(Path), Request, - [<<"first">>, <<"second">>, <<"third">>], 0), - check_responses(Status, Reason, Responses) - end - ) - ). - -prop_http_request_max_age(Host, Family, Ssl) -> - eqc:numtests( - 25, - ?FORALL( - {Request, {Cookie, Path, Expires, MaxAge}, - {{_, Status, Reason}, _, _} = Response}, - {valid_http_request(), cookie_max_age(), valid_http_response()}, - begin - ResponseBin = build_response(Response, [Cookie]), - ValidationFun = validate_cookie(ResponseBin, fun check_cookie_deleted/3, - [Expires, Cookie]), - WaitTime = expiration_time(Expires, MaxAge), - Responses = - send_cookie_requests(Host, Ssl, Family, ValidationFun, Path, - Request, [<<"first">>, <<"second">>], - WaitTime), - check_responses(Status, Reason, Responses) - end - ) - ). - -prop_http_request_expires(Host, Family, Ssl) -> - ?FORALL( - {Request, {Cookie, Path, Expires}, - {{_, Status, Reason}, _, _} = Response}, - {valid_http_request(), cookie_expires(), valid_http_response()}, - begin - ResponseBin = build_response(Response, [Cookie]), - ValidationFun = validate_cookie(ResponseBin, fun check_cookie_deleted/3, - [Expires, Cookie]), - Responses = - send_cookie_requests(Host, Ssl, Family, ValidationFun, Path, - Request, [<<"first">>, <<"second">>], 0), - check_responses(Status, Reason, Responses) - end - ). -%%============================================================================== -%% Internal functions -%%============================================================================== -validate_msg({{_Method, _Uri, _Version}, SentHeaders, SentBody}) -> - fun(Module, Socket, _Request, GotHeaders, GotBody) when SentBody == GotBody -> - case validate_headers(SentBody, GotHeaders, SentHeaders) of - true -> - Module:send(Socket, ?TWO_OK); - false -> - Module:send(Socket, ?FOUR_BAD_REQUEST) - end; - (Module, Socket, _Request, _GotHeaders, _) -> - Module:send(Socket, ?FOUR_BAD_REQUEST) - end. - -validate_cookie(Response, Fun, Params) -> - fun(Module, Socket, _Request, Headers, _Body) -> - case proplists:get_value("Test", Headers) of - "first" -> - Module:send(Socket, Response); - "second" -> - case erlang:apply(Fun, [Headers | Params]) of - true -> - Module:send(Socket, ?TWO_OK); - false -> - Module:send(Socket, ?FOUR_BAD_REQUEST) - end - end - end. - -validate_cookie_supersede(FirstResponse, SecondResponse, Supersede, FirstPair, - SecondPair) -> - fun(Module, Socket, _Request, Headers, _Body) -> - case proplists:get_value("Test", Headers) of - "first" -> - Module:send(Socket, FirstResponse); - "second" -> - Module:send(Socket, SecondResponse); - "third" -> - case check_cookie_supersede(Headers, Supersede, FirstPair, SecondPair) of - true -> - Module:send(Socket, ?TWO_OK); - false -> - Module:send(Socket, ?FOUR_BAD_REQUEST) - end - end - end. - -build_cookie(N, V) -> - binary_to_list(< - build_cookie(N, V) == proplists:get_value("Cookie", Headers). - -%% http://tools.ietf.org/search/rfc6265#section-4.1.2 -check_cookie_supersede(Headers, true, {Name, _, _, _}, {_, NewValue, _, _}) -> - build_cookie(Name, NewValue) == proplists:get_value("Cookie", Headers); -check_cookie_supersede(Headers, false, {Name, Value, Path, _}, - {NewName, NewValue, Path, _}) -> - lists:sort([build_cookie(Name, Value), build_cookie(NewName, NewValue)]) - == lists:sort(string:tokens(proplists:get_value("Cookie", Headers), "; ")); -check_cookie_supersede(Headers, false, {Name, Value, _, _}, _) -> - build_cookie(Name, Value) - == proplists:get_value("Cookie", Headers). - -verify_host(GotHeaders, SentHeaders) -> - %% Host must be added by the client if it is not part of the headers list - %% http://tools.ietf.org/html/rfc2616#section-14.23 - Key = "host", - case lists:keytake(Key, 1, GotHeaders) of - {value, {_, Value}, NewGotHeaders} -> - case lists:keytake(Key, 1, SentHeaders) of - %% The user sent the 'Host' header, value must match - {value, {_, Value}, NewSentHeaders} -> - {NewGotHeaders, NewSentHeaders}; - false -> - {NewGotHeaders, SentHeaders}; - _ -> - false - end; - false -> - false - end. - -verify_content_length(Body, GotHeaders, SentHeaders) -> - %% Must be updated when the code supports transfer-encoding - %% http://tools.ietf.org/html/rfc2616#section-14.13 - Key = "content-length", - ContentLength = iolist_size(Body), - {NewGotHeaders, GotContentLength} - = case lists:keytake(Key, 1, GotHeaders) of - {value, {_, Value}, H} -> - {H, list_to_integer(Value)}; - false -> - {GotHeaders, 0} - end, - case ContentLength == GotContentLength of - true -> - {NewGotHeaders, lists:keydelete(Key, 1, SentHeaders)}; - false -> - false - end. - -validate_headers(Body, GotHeaders, SentHeaders) -> - CleanGotHeaders = lists:keysort(1, [{string:to_lower(K), V} - || {K, V} <- GotHeaders]), - CleanSentHeaders = lists:keysort(1, [{string:to_lower(binary_to_list(K)), - binary_to_list(V)} - || {K, V} <- SentHeaders]), - case verify_host(CleanGotHeaders, CleanSentHeaders) of - false -> - false; - {GotHeaders1, Headers1} -> - case verify_content_length(Body, GotHeaders1, Headers1) of - false -> - false; - {GotHeaders2, Headers2} -> - GotHeaders2 == Headers2 - end - end. - -reply_msg(Msg) -> - fun(Module, Socket, _Request, _Headers, _Body) -> - Module:send(Socket, Msg) - end. - -reply_msg_and_check(Id, Msg) -> - Parent = self(), - fun(Module, Socket, _Request, _Headers, _Body) -> - Module:send(Socket, Msg), - case Module:recv(Socket, 0) of - {error, closed} -> - Parent ! {Id, closed}; - _ -> - ok - end - end. - -reply_and_close_msg(Msg) -> - fun(Module, Socket, _Request, _Headers, _Body) -> - Module:send(Socket, Msg), - Module:close(Socket) - end. - -must_close(Headers, Connection) -> - case proplists:get_value(<<"Connection">>, Headers) of - <<"close">> -> - true; - _ -> - case Connection of - <<"close">> -> - true; - _ -> - false - end - end. - -select_module(Ssl) -> - case Ssl of - true -> - ssl; - false -> - gen_tcp - end. - -encode_path(Path) -> - case lists:split(length(Path) - 1, Path) of - {P, ["/"]} -> - list_to_binary(["/", string:join(P, "/"), "/"]); - _ -> - list_to_binary(["/", string:join(Path, "/")]) - end. - -build_response({StatusLine, Headers, Body}, Cookies) -> - http_eqc_encoding:build_valid_response( - StatusLine, - http_eqc_encoding:add_content_length(Headers, Body), - Cookies, Body). - -send_cookie_requests(Host, Ssl, Family, ValidationFun, Path, - {{Method, _Uri, _Version}, Headers, Body}, - RequestTags, WaitTime) -> - Module = select_module(Ssl), - {ok, Listener, LS, Port} = - webserver:start(Module, [ValidationFun], Family), - {ok, Client} = fusco:start({Host, Port, Ssl}, [{use_cookies, true}]), - %% Use header "test" to distinguish requests in the server side - Responses = lists:map( - fun(Header) -> - {ok, {Response, _, _, _, _}} - = fusco:request(Client, Path, Method, - [{<<"test">>, Header} | Headers], - Body, 10000), - timer:sleep(WaitTime), - Response - end, RequestTags), - ok = fusco:disconnect(Client), - webserver:stop(Module, Listener, LS), - Responses. - -expiration_time(Expires, MaxAge) -> - case Expires of - true -> - MaxAge*1000; - false -> - 0 - end. - -check_responses(Status, Reason, [First, Second]) -> - Expected = {Status, Reason}, - ?WHENFAIL(io:format("First: ~p~nExpected: ~p~nSecond: ~p~n", - [First, Expected, Second]), - {First, Second} == {Expected, {<<"200">>, <<"OK">>}} - ); -check_responses(Status, Reason, [First, Second, Third]) -> - Expected = {Status, Reason}, - ?WHENFAIL(io:format("First: ~p~nSecond: ~p~nExpected: ~p~nThird ~p~n", - [First, Second, Expected, Third]), - {First, Second, Third} - == {Expected, Expected, {<<"200">>, <<"OK">>}} - ). - -diff(A, A) -> - eq; -diff(A, B) when A < B -> - lt; -diff(_, _) -> - gt. - -is_past(DateTime) -> - {Date, {H, M, _}} = http_eqc_encoding:expires_datetime(DateTime), - case diff(Date, date()) of - lt -> - true; - gt -> - false; - eq -> - {HH, MM, _} = time(), - %% Set 30 min margin, safe side - case diff((HH*60+MM) - (H*60+M), 30) of - gt -> - true; - eq -> - true; - lt -> - false - end - end. - -is_future(DateTime) -> - {Date, {H, M, _}} = http_eqc_encoding:expires_datetime(DateTime), - case diff(Date, date()) of - gt -> - true; - lt -> - false; - eq -> - {HH, MM, _} = time(), - %% Set 30 min margin, safe side - case diff((H*60+M) - (HH*60+MM), 30) of - gt -> - true; - eq -> - true; - lt -> - false - end - end. diff --git a/ejabberd_auth_http/deps/fusco/test/http_eqc_encoding.erl b/ejabberd_auth_http/deps/fusco/test/http_eqc_encoding.erl deleted file mode 100644 index af570ae..0000000 --- a/ejabberd_auth_http/deps/fusco/test/http_eqc_encoding.erl +++ /dev/null @@ -1,153 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 1999-2014, Erlang Solutions Ltd -%%% @author Diana Corbacho -%%% @doc -%%% @end -%%%============================================================================= --module(http_eqc_encoding). --copyright("2014, Erlang Solutions Ltd."). - --export([add_content_length/2, - add_transfer_encoding/2, - body/1]). - --export([build_valid_response/4, - build_cookie/1, - build_expires_date/1, - expires_datetime/1]). - -%%============================================================================== -%% API -%%============================================================================== -add_content_length(Headers, <<>>) -> - Headers; -add_content_length(Headers, Body) -> - ContentLength = list_to_binary(integer_to_list(byte_size(Body))), - [{<<"Content-Length">>, ContentLength} | Headers]. - -body({_, <<$1, _, _>>, _}) -> - <<>>; -body({_, <<$2,$0,$4>>, _}) -> - <<>>; -body({_, <<$3,$0,$4>>, _}) -> - <<>>; -body(_) -> - http_eqc_gen:body(). - -add_transfer_encoding(Headers, <<>>) -> - Headers; -add_transfer_encoding(Headers, Encoding) -> - lists:keystore(<<"Transfer-Encoding">>, 1, - remove_transfer_encoding(Headers), - {<<"Transfer-Encoding">>, Encoding}). - -build_valid_response({HttpVersion, StatusCode, Reason}, Headers, Cookies, Body) -> - SL = [HttpVersion, sp(), StatusCode, sp(), Reason, crlf()], - HS = [[Name, colon(), Value, crlf()] || {Name, Value} <- Headers], - CS = [[Name, colon(), build_cookie(Cookie), crlf()] || {Name, Cookie} <- Cookies], - [SL, HS ++ CS, crlf(), build_body(Body)]. - -build_cookie({{K, V}, Avs}) -> - CookiePair = [K, eq(), V], - CookieAvs = build_cookie_avs(Avs), - CookiePair ++ CookieAvs. - -build_expires_date({rfc1123date, {Wkday, Date1, Time}}) -> - Date = build_date(Date1), - BTime = build_time(Time), - [Wkday, $,, $\s, Date, $\s, BTime, $\s, "GMT"]; -build_expires_date({rfc850date, {Weekday, Date2, Time}}) -> - Date = build_date(Date2), - BTime = build_time(Time), - [Weekday, $,, $\s, Date, $\s, BTime, $\s, "GMT"]; -build_expires_date({asctimedate, {Wkday, Date3, Time, Year}}) -> - BTime = build_time(Time), - Date = build_date(Date3), - [Wkday, $\s, Date, $\s, BTime, $\s, Year]. - -expires_datetime({rfc1123date, {_, {date1, {Day, Month, Year}}, {H, M, S}}}) -> - {{st_to_int(Year), month(Month), st_to_int(Day)}, - {st_to_int(H), st_to_int(M), st_to_int(S)}}; -expires_datetime({rfc850date, {_, {date2, {Day, Month, Year}}, {H, M, S}}}) -> - {{to_year(Year), month(Month), st_to_int(Day)}, - {st_to_int(H), st_to_int(M), st_to_int(S)}}; -expires_datetime({asctimedate, {_, {date3, {Day, Month}}, {H, M, S}, Year}}) -> - {{st_to_int(Year), month(Month), st_to_int(Day)}, - {st_to_int(H), st_to_int(M), st_to_int(S)}}; -expires_datetime(undefined) -> - undefined. -%%============================================================================== -%% Internal functions -%%============================================================================== -remove_transfer_encoding(Headers) -> - lists:filter(fun({H, _}) -> H =/= <<"Transfer-Encoding">> end, Headers). - -build_body(Body) when is_binary(Body) -> - Body; -build_body(List) -> - list_to_binary( - io_lib:format("~s0\r\n\r\n", - [[io_lib:format("~s\r\n~s\r\n", - [erlang:integer_to_list(Nat, 16), Body]) - || {Nat, Body} <- List]])). - -build_cookie_avs(Avs) -> - build_cookie_avs(Avs, []). - -build_cookie_avs([{<<"Expires">> = K, Date} | Rest], Acc) -> - V = build_expires_date(Date), - build_cookie_avs(Rest, [[semicolon(), sp(), K, eq(), V] | Acc]); -build_cookie_avs([{K, V} | Rest], Acc) -> - build_cookie_avs(Rest, [[semicolon(), sp(), K, eq(), V] | Acc]); -build_cookie_avs([K | Rest], Acc) -> - build_cookie_avs(Rest, [[semicolon(), sp(), K] | Acc]); -build_cookie_avs([], Acc) -> - Acc. - -build_date({date1, {Day, Month, Year}}) -> - [Day, $\s, Month, $\s, Year]; -build_date({date2, {Day, Month, Year}}) -> - [Day, $-, Month, $-, Year]; -build_date({date3, {Day, Month}}) -> - [Month, $\s, Day]. - -build_time({H, M, S}) -> - [H, $:, M, $:, S]. - -colon() -> - <<$:>>. - -semicolon() -> - <<$;>>. - -sp() -> - <<$\s>>. - -crlf() -> - <<$\r,$\n>>. - -eq() -> - <<$=>>. - -months() -> - [{"Jan", 1}, {"Feb", 2}, {"Mar", 3}, {"Apr", 4}, - {"May", 5}, {"Jun", 6}, {"Jul", 7}, {"Aug", 8}, - {"Sep", 9}, {"Oct", 10}, {"Nov", 11}, {"Dec", 12}]. - -st_to_int(L) -> - list_to_integer(L). - -month(Month) -> - proplists:get_value(Month, months()). - -to_year(Year) when length(Year) == 4 -> - st_to_int(Year); -to_year(Year) -> - IntY = list_to_integer(Year), - {Y, _, _} = date(), - case (2000 + IntY - Y) > 50 of - true -> - 1900 + IntY; - false -> - 2000 + IntY - end. diff --git a/ejabberd_auth_http/deps/fusco/test/http_eqc_gen.erl b/ejabberd_auth_http/deps/fusco/test/http_eqc_gen.erl deleted file mode 100644 index 16bf938..0000000 --- a/ejabberd_auth_http/deps/fusco/test/http_eqc_gen.erl +++ /dev/null @@ -1,262 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Diana Corbacho -%%% @doc Quickcheck generators for HTTP messages -%%% @end -%%%============================================================================= --module(http_eqc_gen). --copyright("2013, Erlang Solutions Ltd."). - --include_lib("eqc/include/eqc.hrl"). - --compile(export_all). - -%% RFC 2616 -general_header() -> - [{<<"Cache-Control">>, small_valid_bin()}, - {<<"Connection">>, connection_header()}, - {<<"Date">>, small_valid_bin()}, - {<<"Pragma">>, small_valid_bin()}, - {<<"Trailer">>, small_valid_bin()}, - {<<"Transfer-Encoding">>, small_valid_bin()}, - {<<"Upgrade">>, small_valid_bin()}, - {<<"Via">>, small_valid_bin()}, - {<<"Warning">>, small_valid_bin()}]. - -connection_header() -> - oneof([<<"close">>, <<"keep-alive">>, small_valid_bin()]). - -%% RFC 2616 -entity_header() -> - [{<<"Allow">>, small_valid_bin()}, - {<<"Content-Encoding">>, small_valid_bin()}, - {<<"Content-Language">>, small_valid_bin()}, - {<<"Content-Location">>, small_valid_bin()}, - {<<"Content-MD5">>, small_valid_bin()}, - {<<"Content-Range">>, small_valid_bin()}, - {<<"Content-Type">>, small_valid_bin()}, - {<<"Expires">>, small_valid_bin()}, - {<<"Last-Modified">>, small_valid_bin()}]. - -%% RFC 2616 -response_header() -> - [{<<"Accept-Ranges">>, small_valid_bin()}, - {<<"Age">>, small_valid_bin()}, - {<<"ETag">>, small_valid_bin()}, - {<<"Location">>, small_valid_bin()}, - {<<"Proxy-Authenticate">>, small_valid_bin()}, - {<<"Retry-After">>, small_valid_bin()}, - {<<"Server">>, small_valid_bin()}, - {<<"Vary">>, small_valid_bin()}, - {<<"WWW-Authenticate">>, small_valid_bin()}]. - -%% http://tools.ietf.org/html/rfc2616#section-5.3 -request_header() -> - [{<<"Accept">>, small_valid_bin()}, - {<<"Accept-Charset">>, small_valid_bin()}, - {<<"Accept-Encoding">>, small_valid_bin()}, - {<<"Accept-Language">>, small_valid_bin()}, - {<<"Authorization">>, authorization()}, - {<<"Expect">>, small_valid_bin()}, - {<<"From">>, small_valid_bin()}, - {<<"Host">>, small_valid_bin()}, - {<<"If-Match">>, small_valid_bin()}, - {<<"If-Modified-Since">>, small_valid_bin()}, - {<<"If-None-Match">>, small_valid_bin()}, - {<<"If-Range">>, small_valid_bin()}, - {<<"If-Unmodified-Since">>, small_valid_bin()}, - {<<"Max-Forwards">>, small_valid_bin()}, - {<<"Proxy-Authorization">>, small_valid_bin()}, - {<<"Range">>, small_valid_bin()}, - {<<"Referer">>, small_valid_bin()}, - {<<"TE">>, small_valid_bin()}, - {<<"User-Agent">>, small_valid_bin()} - ]. - -authorization() -> - ?LET({User, Pass}, {small_valid_bin(), small_valid_bin()}, - begin - Encoded = base64:encode(<>), - <<"Basic ", Encoded/binary>> - end). - -header() -> - lists:append([general_header(), entity_header(), response_header()]). - -req_headers() -> - lists:append([general_header(), entity_header(), request_header()]). - -request_headers() -> - ?LET(Headers, list(oneof(req_headers())), Headers). - -headers() -> - ?LET(Headers, list(oneof(header())), Headers). - -http_version() -> - [<<"HTTP/1.0">>, <<"HTTP/1.1">>]. - -informational_code() -> - [{<<"100">>, <<"Continue">>}, - {<<"101">>, <<"Switching protocols">>}]. - -success_code() -> - [{<<"200">>, <<"OK">>}, - {<<"201">>, <<"Created">>}, - {<<"202">>, <<"Accepted">>}, - {<<"203">>, <<"Non-Authoritative Information">>}, - {<<"204">>, <<"No Content">>}, - {<<"205">>, <<"Reset Content">>}, - {<<"206">>, <<"Partial Content">>}]. - -redirection_code() -> - [{<<"300">>, <<"Multiple Choices">>}, - {<<"301">>, <<"Moved Permanently">>}, - {<<"302">>, <<"Found">>}, - {<<"303">>, <<"See Other">>}, - {<<"304">>, <<"Not Modified">>}, - {<<"305">>, <<"Use Proxy">>}, - {<<"307">>, <<"Temporary Redirect">>}]. - -client_error_code() -> - [{<<"400">>, <<"Bad Request">>}, - {<<"401">>, <<"Unauthorized">>}, - {<<"402">>, <<"Payment Required">>}, - {<<"403">>, <<"Forbidden">>}, - {<<"404">>, <<"Not Found">>}, - {<<"405">>, <<"Method Not Allowed">>}, - {<<"406">>, <<"Not Acceptable">>}, - {<<"407">>, <<"Proxy Authentication Required">>}, - {<<"408">>, <<"Request Time-out">>}, - {<<"409">>, <<"Conflict">>}, - {<<"410">>, <<"Gone">>}, - {<<"411">>, <<"Length Required">>}, - {<<"412">>, <<"Precondition Failed">>}, - {<<"413">>, <<"Request Entity Too Large">>}, - {<<"414">>, <<"Request-URI Too Large">>}, - {<<"415">>, <<"Unsupported Media Type">>}, - {<<"416">>, <<"Requested range not satisfiable">>}, - {<<"417">>, <<"Expectation Failed">>}]. - -server_error_code() -> - [{<<"500">>, <<"Internal Server Error">>}, - {<<"501">>, <<"Not Implemented">>}, - {<<"502">>, <<"Bad Gateway">>}, - {<<"503">>, <<"Service Unavailable">>}, - {<<"504">>, <<"Gateway Time-out">>}, - {<<"505">>, <<"HTTP Version not supported">>}]. - -%% RFC 6265 -set_cookie() -> - {<<"Set-Cookie">>, set_cookie_string()}. - -set_cookie_string() -> - {cookie_pair(), cookie_avs()}. - -cookie_pair() -> - {small_valid_bin(), small_valid_bin()}. - -cookie_avs() -> - list(oneof(cookie_av())). - -cookie_av() -> - [{<<"Expires">>, sane_cookie_date()}, - {<<"Max-Age">>, max_age()}, - {<<"Domain">>, small_valid_bin()}, - {<<"Path">>, small_valid_bin()}, - {<<"Secure">>, small_valid_bin()}, - <<"HttpOnly">>, - small_valid_bin() %% extension - ]. - -sane_cookie_date() -> - ?LET(Date, oneof([rfc1123date(), rfc850date(), asctimedate()]), Date). - -max_age() -> - ?LET(Age, ?SUCHTHAT(Nat, nat(), Nat > 0), list_to_binary(integer_to_list(Age))). - -rfc1123date() -> - {rfc1123date, {wkday(), date1(), timeb()}}. - -rfc850date() -> - {rfc850date, {weekday(), date2(), timeb()}}. - -asctimedate() -> - {asctimedate, {wkday(), date3(), timeb(), year4()}}. - -date1() -> - {date1, {day(), month(), year4()}}. - -date2() -> - {date2, {day(), month(), year2()}}. - -date3() -> - {date3, {day(), month()}}. - -timeb() -> - ?LET({H, M, S}, {choose(0, 23), choose(0,59), choose(0, 59)}, - {twod(H), twod(M), twod(S)}). - -twod(Integer) -> - string:right(integer_to_list(Integer), 2, $0). - -day() -> - ?LET(Day, choose(1, 31), twod(Day)). - -year4() -> - ?LET(Year, choose(1983, 2083), integer_to_list(Year)). - -year2() -> - ?LET(Year, choose(0, 99), twod(Year)). - -wkday() -> - ?LET(Wkday, oneof(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]), Wkday). - -weekday() -> - ?LET(Weekday, oneof(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", - "Saturday", "Sunday"]), - Weekday). - -month() -> - ?LET(Month, - oneof(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", - "Oct", "Nov", "Dec"]), - Month). - -status_code() -> - lists:append([informational_code(), success_code(), redirection_code(), - client_error_code(), server_error_code()]). - -status_line() -> - ?LET({HttpVersion, {StatusCode, Reason}}, - {oneof(http_version()), oneof(status_code())}, - {HttpVersion, StatusCode, Reason}). - -http_method() -> - ["OPTIONS", "GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "CONNECT"]. - -request_uri() -> - [<<"*">>, <<"http://www.w3.org/pub/WWW/TheProject.html">>, - <<"/pub/WWW/TheProject.html">>]. - -request_line() -> - ?LET({Method, RequestUri}, - {oneof(http_method()), oneof(request_uri())}, - {Method, RequestUri, "HTTP/1.1"}). - -small_valid_bin() -> - ?LET(String, vector(5, choose($A, $z)), - list_to_binary(String)). - -body() -> - ?LET(String, list(choose($A, $z)), - list_to_binary(String)). - -body(Size) -> - ?LET(String, vector(Size, choose($A, $z)), String). - -chunked_body() -> - ?LET(PosNats, non_empty(list(?SUCHTHAT(Nat, nat(), Nat > 0))), - ?LET(Bins, [body(Size) || Size <- PosNats], - lists:zip(PosNats, Bins) - ) - ). diff --git a/ejabberd_auth_http/deps/fusco/test/key.pem b/ejabberd_auth_http/deps/fusco/test/key.pem deleted file mode 100644 index 3d0de31..0000000 --- a/ejabberd_auth_http/deps/fusco/test/key.pem +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQC6YrA5HIBj817qplKlRaU3dkCnnZtKS666lRbqsdj3Fug7ezAN -mUrUZIGMTDOAwYg3E2JPAL1VOiPmi/ENlanLTyOp2SkqYLfR59Z5wr1nE/iAC+es -7WT2OPjXG7MIBvnM7FNpHY17F4MM0FWWm+LJyJRucUZHL964nw0c2xZ3fwIDAQAB -AoGAWpvnd5w3fl+t4P0CaH43F4NRYyrnd3LberFH9siG5XgpZeE5NyMykZZatE3H -K+zpv3yY6jc909Tz5vxZL3V2mR5r5O8PulteyZ8gHKVMD3c//xhPjcVMOg2j/wB1 -QLDvL8qL7tDv53uYKyy3fVud9ao8xbNtoL+pzpMGE3CdlqECQQDxTyrQ0OE9+/1Q -xM0Oa7b48R3ncL/zv5sXB7Melr2j27CIxm04DXi9CnWVYMvlgWYZ5nBBMOZixTZA -YSq7tkmFAkEAxbuHNGeCSffccv5LsVMIHLRYZr/WBRqkbim8K76XaSD/ao9BR/T/ -ZobOiYTD36eKw4TzKXfKkMiHcPyRGb4qMwJBAIXFmHu4QBWnmy9qWi7TYdSxfh1u -cMsEfkqPFyou8KRkxoGcVrHLLhLGOJb92Sq6yEo1aCeLnzxEDaY094amMC0CQQCo -JlVQJ0YRCQsbb02HOokHgAY9Op4SMRnr5On0eVvhNwJ9590oCBy5X6J8J786jwve -QU1X0lsczKsBVoc+UQ0pAkBO/+utKl2jt0LYHi+ZOsvLgLoYKy7y+304MsId3Hfi -oZpxA0a5ctG1tHpBAjJJfO1at4Dpy67nkQNc3CAhrsSn ------END RSA PRIVATE KEY----- diff --git a/ejabberd_auth_http/deps/fusco/test/test_utils.erl b/ejabberd_auth_http/deps/fusco/test/test_utils.erl deleted file mode 100644 index 1cd75ee..0000000 --- a/ejabberd_auth_http/deps/fusco/test/test_utils.erl +++ /dev/null @@ -1,73 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Diana Corbacho -%%% @doc -%%% @end -%%%============================================================================= --module(test_utils). --copyright("2013, Erlang Solutions Ltd."). - --export([start_listener/1, - start_listener/2, - send_message/1, - stop_listener/1]). - -start_listener(Msg) -> - start_listener(Msg, close). - -start_listener({fragmented, Msg}, ConnectionState) -> - random:seed(erlang:now()), - start_listener(Msg, fun fragmented_user_response/1, ConnectionState); -start_listener(Msg, ConnectionState) -> - start_listener(Msg, fun user_response/1, ConnectionState). - -start_listener(Msg, Fun, ConnectionState) -> - Responders = case ConnectionState of - close -> - [Fun(Msg)]; - keepalive -> - [Fun(Msg), user_response(message())] - end, - {ok, Listener, LS, Port} = webserver:start(gen_tcp, Responders), - {ok, Socket} = gen_tcp:connect("127.0.0.1", Port, [binary, {packet, raw}, - {nodelay, true}, - {reuseaddr, true}, - {active, false}], 5000), - {Listener, LS, Socket}. - -send_message(Socket) -> - gen_tcp:send(Socket, message()). - - -send_fragmented_message(Module, Socket, L) when is_list(L) -> - send_fragmented_message(Module, Socket, list_to_binary(L)); -send_fragmented_message(_, _, <<>>) -> - ok; -send_fragmented_message(Module, Socket, Msg) -> - Length = erlang:byte_size(Msg), - R = random(Length), - Bin = binary:part(Msg, 0, R), - Module:send(Socket, Bin), - send_fragmented_message(Module, Socket, binary:part(Msg, R, erlang:byte_size(Msg) - R)). - -random(Length) when Length =< 5 -> - random:uniform(Length); -random(_Length) -> - random:uniform(5). - -user_response(Message) -> - fun(Module, Socket, _, _, _) -> - Module:send(Socket, Message) - end. - -fragmented_user_response(Message) -> - fun(Module, Socket, _, _, _) -> - send_fragmented_message(Module, Socket, Message) - end. - -message() -> - <<"GET /blabla HTTP/1.1\r\nhost: 127.0.0.1:5050\r\nuser-agent: Cow\r\nAccept: */*\r\n\r\n">>. - -stop_listener({Listener, LS, Socket}) -> - webserver:stop(Listener, LS), - gen_tcp:close(Socket). diff --git a/ejabberd_auth_http/deps/fusco/test/webserver.erl b/ejabberd_auth_http/deps/fusco/test/webserver.erl deleted file mode 100644 index 68a5fc8..0000000 --- a/ejabberd_auth_http/deps/fusco/test/webserver.erl +++ /dev/null @@ -1,147 +0,0 @@ -%%%----------------------------------------------------------------------------- -%%% @copyright (C) 1999-2013, Erlang Solutions Ltd -%%% @author Oscar Hellström -%%% @author Magnus Henoch -%%% @author Diana Parra Corbacho -%%% @doc Simple web server for testing purposes -%%% @end -%%%----------------------------------------------------------------------------- --module(webserver). --copyright("2013, Erlang Solutions Ltd."). - --export([start/2, start/3, stop/2, stop/3]). --export([acceptor/3]). - -start(Module, Responders) -> - start(Module, Responders, inet). - -start(Module, Responders, Family) -> - case get_addr("localhost", Family) of - {ok, Addr} -> - LS = listen(Module, Addr, Family), - Pid = spawn(?MODULE, acceptor, [Module, LS, Responders]), - {ok, Pid, LS, port(Module, LS)}; - Error -> - Error - end. - -stop(Listener, LS) -> - stop(gen_tcp, Listener, LS). - -stop(Module, Listener, LS) -> - (catch exit(kill, Listener)), - Module:close(LS). - -acceptor(Module, ListenSocket, Responders) -> - case accept(Module, ListenSocket) of - error -> - ok; - Socket -> - spawn_link(fun() -> - acceptor(Module, ListenSocket, Responders) - end), - server_loop(Module, Socket, nil, [], Responders) - end. - -server_loop(Module, Socket, _, _, []) -> - Module:close(Socket); -server_loop(Module, Socket, Request, Headers, [H | T] = Responders) -> - receive - stop -> - Module:close(Socket) - after 0 -> - case Module:recv(Socket, 0, 500) of - {ok, {http_request, _, _, _} = NewRequest} -> - server_loop(Module, Socket, NewRequest, Headers, Responders); - {ok, {http_header, _, Field, _, Value}} when is_atom(Field) -> - NewHeaders = [{atom_to_list(Field), Value} | Headers], - server_loop(Module, Socket, Request, NewHeaders, Responders); - {ok, {http_header, _, Field, _, Value}} when is_list(Field) -> - NewHeaders = [{Field, Value} | Headers], - server_loop(Module, Socket, Request, NewHeaders, Responders); - {ok, http_eoh} -> - RequestBody = case proplists:get_value("Content-Length", Headers) of - undefined -> - <<>>; - "0" -> - <<>>; - SLength -> - Length = list_to_integer(SLength), - setopts(Module, Socket, [{packet, raw}]), - {ok, Body} = Module:recv(Socket, Length), - setopts(Module, Socket, [{packet, http}]), - Body - end, - H(Module, Socket, Request, Headers, RequestBody), - case proplists:get_value("Connection", Headers) of - "close" -> - Module:close(Socket); - _ -> - server_loop(Module, Socket, none, [], T) - end; - {error, timeout} -> - server_loop(Module, Socket, Request, Headers, Responders); - {error, closed} -> - Module:close(Socket) - end - end. - -listen(ssl, Addr, Family) -> - Root = code:lib_dir(fusco, test), - Opts = [ - Family, - {packet, http}, - binary, - {active, false}, - {ip, Addr}, - {verify,0}, - {keyfile, filename:join(Root, "key.pem")}, - {certfile, filename:join(Root,"crt.pem")} - ], - {ok, LS} = ssl:listen(0, Opts), - LS; -listen(Module, Addr, Family) -> - {ok, LS} = Module:listen(0, [ - Family, - {packet, http}, - binary, - {active, false}, - {ip, Addr} - ]), - LS. - -get_addr(Host, Family) -> - case inet:getaddr(Host, Family) of - {ok, Addr} -> - {ok, Addr}; - _ -> - {error, family_not_supported} - end. - -accept(ssl, ListenSocket) -> - case ssl:transport_accept(ListenSocket, 1000000) of - {ok, Socket} -> - ok = ssl:ssl_accept(Socket), - Socket; - {error, _} -> - error - end; -accept(Module, ListenSocket) -> - case Module:accept(ListenSocket, 100000) of - {ok, Socket} -> - Socket; - {error, _} -> - error - end. - -setopts(ssl, Socket, Options) -> - ssl:setopts(Socket, Options); -setopts(_, Socket, Options) -> - inet:setopts(Socket, Options). - -port(ssl, Socket) -> - {ok, {_, Port}} = ssl:sockname(Socket), - Port; -port(_, Socket) -> - {ok, Port} = inet:port(Socket), - Port. diff --git a/ejabberd_auth_http/deps/fusco/test/webserver_utils.erl b/ejabberd_auth_http/deps/fusco/test/webserver_utils.erl deleted file mode 100644 index 9480788..0000000 --- a/ejabberd_auth_http/deps/fusco/test/webserver_utils.erl +++ /dev/null @@ -1,88 +0,0 @@ --module(webserver_utils). - --compile(export_all). - --define(DEFAULT_STRING, "Great success!"). - -default_string() -> - ?DEFAULT_STRING. - -empty_body(Module, Socket, _, _, _) -> - Module:send( - Socket, - "HTTP/1.1 200 OK\r\n" - "Content-type: text/plain\r\nContent-length: 0\r\n\r\n" - ). - -copy_body_100_continue(Module, Socket, _, _, Body) -> - Module:send( - Socket, - [ - "HTTP/1.1 100 Continue\r\n\r\n" - "HTTP/1.1 200 OK\r\n" - "Content-type: text/plain\r\nContent-length: " - ++ integer_to_list(size(Body)) ++ "\r\n\r\n", - Body - ] - ). - -pre_1_1_server(Module, Socket, _, _, Body) -> - Pid = list_to_pid(binary_to_list(Body)), - Module:send( - Socket, - "HTTP/1.0 200 OK\r\n" - "Content-type: text/plain\r\nContent-length: 14\r\n\r\n" - ?DEFAULT_STRING - ), - % We didn't signal a connection close, but we want the client to do that - % any way since we're 1.0 now - {error, closed} = Module:recv(Socket, 0), - Pid ! closed, - Module:close(Socket). - -pre_1_1_server_keep_alive(Module, Socket, _, _, _) -> - Module:send( - Socket, - "HTTP/1.0 200 OK\r\n" - "Content-type: text/plain\r\n" - "Connection: Keep-Alive\r\n" - "Content-length: 14\r\n\r\n" - ?DEFAULT_STRING - ). - -very_slow_response(Module, Socket, _, _, _) -> - timer:sleep(1000), - Module:send( - Socket, - "HTTP/1.1 200 OK\r\n" - "Content-type: text/plain\r\nContent-length: 14\r\n\r\n" - ?DEFAULT_STRING - ). - -no_content_length(Module, Socket, _, _, _) -> - Module:send( - Socket, - "HTTP/1.1 200 OK\r\n" - "Content-type: text/plain\r\nConnection: close\r\n\r\n" - ?DEFAULT_STRING - ). - -no_content_length_1_0(Module, Socket, _, _, _) -> - Module:send( - Socket, - "HTTP/1.0 200 OK\r\n" - "Content-type: text/plain\r\n\r\n" - ?DEFAULT_STRING - ). - -trailing_space_header(Module, Socket, _, _, _) -> - Module:send( - Socket, - "HTTP/1.1 200 OK\r\n" - "Content-type: text/plain\r\n" - "Content-Length: 14 \r\n\r\n" - ?DEFAULT_STRING - ). - -no_response(_, _, _, _, _) -> - ok.