]> git.proxmox.com Git - libgit2.git/blob - tests/network/url/redirect.c
2c0b614d995fb54a16dad3e543852ce5525f70bc
[libgit2.git] / tests / network / url / redirect.c
1 #include "clar_libgit2.h"
2 #include "net.h"
3 #include "netops.h"
4
5 static git_net_url conndata;
6
7 void test_network_url_redirect__initialize(void)
8 {
9 memset(&conndata, 0, sizeof(conndata));
10 }
11
12 void test_network_url_redirect__cleanup(void)
13 {
14 git_net_url_dispose(&conndata);
15 }
16
17 void test_network_url_redirect__redirect_http(void)
18 {
19 cl_git_pass(git_net_url_parse(&conndata,
20 "http://example.com/foo/bar/baz"));
21 cl_git_pass(git_net_url_apply_redirect(&conndata,
22 "http://example.com/foo/bar/baz", "bar/baz"));
23 cl_assert_equal_s(conndata.scheme, "http");
24 cl_assert_equal_s(conndata.host, "example.com");
25 cl_assert_equal_s(conndata.port, "80");
26 cl_assert_equal_s(conndata.path, "/foo/");
27 cl_assert_equal_p(conndata.username, NULL);
28 cl_assert_equal_p(conndata.password, NULL);
29 }
30
31 void test_network_url_redirect__redirect_ssl(void)
32 {
33 cl_git_pass(git_net_url_parse(&conndata,
34 "https://example.com/foo/bar/baz"));
35 cl_git_pass(git_net_url_apply_redirect(&conndata,
36 "https://example.com/foo/bar/baz", "bar/baz"));
37 cl_assert_equal_s(conndata.scheme, "https");
38 cl_assert_equal_s(conndata.host, "example.com");
39 cl_assert_equal_s(conndata.port, "443");
40 cl_assert_equal_s(conndata.path, "/foo/");
41 cl_assert_equal_p(conndata.username, NULL);
42 cl_assert_equal_p(conndata.password, NULL);
43 }
44
45 void test_network_url_redirect__redirect_leaves_root_path(void)
46 {
47 cl_git_pass(git_net_url_parse(&conndata,
48 "https://example.com/foo/bar/baz"));
49 cl_git_pass(git_net_url_apply_redirect(&conndata,
50 "https://example.com/foo/bar/baz", "/foo/bar/baz"));
51 cl_assert_equal_s(conndata.scheme, "https");
52 cl_assert_equal_s(conndata.host, "example.com");
53 cl_assert_equal_s(conndata.port, "443");
54 cl_assert_equal_s(conndata.path, "/");
55 cl_assert_equal_p(conndata.username, NULL);
56 cl_assert_equal_p(conndata.password, NULL);
57 }
58
59 void test_network_url_redirect__redirect_encoded_username_password(void)
60 {
61 cl_git_pass(git_net_url_parse(&conndata,
62 "https://user%2fname:pass%40word%zyx%v@example.com/foo/bar/baz"));
63 cl_git_pass(git_net_url_apply_redirect(&conndata,
64 "https://user%2fname:pass%40word%zyx%v@example.com/foo/bar/baz", "bar/baz"));
65 cl_assert_equal_s(conndata.scheme, "https");
66 cl_assert_equal_s(conndata.host, "example.com");
67 cl_assert_equal_s(conndata.port, "443");
68 cl_assert_equal_s(conndata.path, "/foo/");
69 cl_assert_equal_s(conndata.username, "user/name");
70 cl_assert_equal_s(conndata.password, "pass@word%zyx%v");
71 }
72
73 void test_network_url_redirect__redirect_cross_host_denied(void)
74 {
75 cl_git_pass(git_net_url_parse(&conndata, "https://bar.com/bar/baz"));
76 cl_git_fail_with(git_net_url_apply_redirect(&conndata,
77 "https://foo.com/bar/baz", NULL),
78 -1);
79 }
80
81 void test_network_url_redirect__redirect_http_downgrade_denied(void)
82 {
83 cl_git_pass(git_net_url_parse(&conndata, "https://foo.com/bar/baz"));
84 cl_git_fail_with(git_net_url_apply_redirect(&conndata,
85 "http://foo.com/bar/baz", NULL),
86 -1);
87 }
88
89 void test_network_url_redirect__redirect_relative(void)
90 {
91 cl_git_pass(git_net_url_parse(&conndata, "http://foo.com/bar/baz/biff"));
92 cl_git_pass(git_net_url_apply_redirect(&conndata,
93 "/zap/baz/biff?bam", NULL));
94 cl_assert_equal_s(conndata.scheme, "http");
95 cl_assert_equal_s(conndata.host, "foo.com");
96 cl_assert_equal_s(conndata.port, "80");
97 cl_assert_equal_s(conndata.path, "/zap/baz/biff?bam");
98 cl_assert_equal_p(conndata.username, NULL);
99 cl_assert_equal_p(conndata.password, NULL);
100 }
101
102 void test_network_url_redirect__redirect_relative_ssl(void)
103 {
104 cl_git_pass(git_net_url_parse(&conndata, "https://foo.com/bar/baz/biff"));
105 cl_git_pass(git_net_url_apply_redirect(&conndata,
106 "/zap/baz/biff?bam", NULL));
107 cl_assert_equal_s(conndata.scheme, "https");
108 cl_assert_equal_s(conndata.host, "foo.com");
109 cl_assert_equal_s(conndata.port, "443");
110 cl_assert_equal_s(conndata.path, "/zap/baz/biff?bam");
111 cl_assert_equal_p(conndata.username, NULL);
112 cl_assert_equal_p(conndata.password, NULL);
113 }
114
115 void test_network_url_redirect__service_query_no_query_params_in_location(void)
116 {
117 cl_git_pass(git_net_url_parse(&conndata, "https://foo.com/bar/info/refs?service=git-upload-pack"));
118 cl_git_pass(git_net_url_apply_redirect(&conndata,
119 "/baz/info/refs", "/info/refs?service=git-upload-pack"));
120 cl_assert_equal_s(conndata.path, "/baz");
121 }
122
123 void test_network_url_redirect__service_query_with_query_params_in_location(void)
124 {
125 cl_git_pass(git_net_url_parse(&conndata, "https://foo.com/bar/info/refs?service=git-upload-pack"));
126 cl_git_pass(git_net_url_apply_redirect(&conndata,
127 "/baz/info/refs?service=git-upload-pack", "/info/refs?service=git-upload-pack"));
128 cl_assert_equal_s(conndata.path, "/baz");
129 }