redirect.c 4.97 KB
Newer Older
1 2 3 4 5 6
#include "clar_libgit2.h"
#include "net.h"
#include "netops.h"

static git_net_url conndata;

7
void test_url_redirect__initialize(void)
8 9 10 11
{
	memset(&conndata, 0, sizeof(conndata));
}

12
void test_url_redirect__cleanup(void)
13 14 15 16
{
	git_net_url_dispose(&conndata);
}

17
void test_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", false, "bar/baz"));
23 24 25 26 27 28 29 30
	cl_assert_equal_s(conndata.scheme, "http");
	cl_assert_equal_s(conndata.host, "example.com");
	cl_assert_equal_s(conndata.port, "80");
	cl_assert_equal_s(conndata.path, "/foo/");
	cl_assert_equal_p(conndata.username, NULL);
	cl_assert_equal_p(conndata.password, NULL);
}

31
void test_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", false, "bar/baz"));
37 38 39 40 41 42 43 44
	cl_assert_equal_s(conndata.scheme, "https");
	cl_assert_equal_s(conndata.host, "example.com");
	cl_assert_equal_s(conndata.port, "443");
	cl_assert_equal_s(conndata.path, "/foo/");
	cl_assert_equal_p(conndata.username, NULL);
	cl_assert_equal_p(conndata.password, NULL);
}

45
void test_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", false, "/foo/bar/baz"));
51 52 53 54 55 56 57 58
	cl_assert_equal_s(conndata.scheme, "https");
	cl_assert_equal_s(conndata.host, "example.com");
	cl_assert_equal_s(conndata.port, "443");
	cl_assert_equal_s(conndata.path, "/");
	cl_assert_equal_p(conndata.username, NULL);
	cl_assert_equal_p(conndata.password, NULL);
}

59
void test_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", false, "bar/baz"));
65 66 67 68 69 70 71 72
	cl_assert_equal_s(conndata.scheme, "https");
	cl_assert_equal_s(conndata.host, "example.com");
	cl_assert_equal_s(conndata.port, "443");
	cl_assert_equal_s(conndata.path, "/foo/");
	cl_assert_equal_s(conndata.username, "user/name");
	cl_assert_equal_s(conndata.password, "pass@word%zyx%v");
}

73
void test_url_redirect__redirect_cross_host_allowed(void)
74 75 76 77 78 79 80 81 82 83 84 85 86
{
	cl_git_pass(git_net_url_parse(&conndata,
		"https://bar.com/bar/baz"));
	cl_git_pass(git_net_url_apply_redirect(&conndata,
		"https://foo.com/bar/baz", true, NULL));
	cl_assert_equal_s(conndata.scheme, "https");
	cl_assert_equal_s(conndata.host, "foo.com");
	cl_assert_equal_s(conndata.port, "443");
	cl_assert_equal_s(conndata.path, "/bar/baz");
	cl_assert_equal_p(conndata.username, NULL);
	cl_assert_equal_p(conndata.password, NULL);
}

87
void test_url_redirect__redirect_cross_host_denied(void)
88
{
89 90
	cl_git_pass(git_net_url_parse(&conndata,
		"https://bar.com/bar/baz"));
91
	cl_git_fail_with(git_net_url_apply_redirect(&conndata,
92
		"https://foo.com/bar/baz", false, NULL), -1);
93 94
}

95
void test_url_redirect__redirect_http_downgrade_denied(void)
96
{
97 98
	cl_git_pass(git_net_url_parse(&conndata,
		"https://foo.com/bar/baz"));
99
	cl_git_fail_with(git_net_url_apply_redirect(&conndata,
100
		"http://foo.com/bar/baz", true, NULL), -1);
101 102
}

103
void test_url_redirect__redirect_relative(void)
104
{
105 106
	cl_git_pass(git_net_url_parse(&conndata,
		"http://foo.com/bar/baz/biff"));
107
	cl_git_pass(git_net_url_apply_redirect(&conndata,
108
		"/zap/baz/biff?bam", true, NULL));
109 110 111 112 113 114 115 116
	cl_assert_equal_s(conndata.scheme, "http");
	cl_assert_equal_s(conndata.host, "foo.com");
	cl_assert_equal_s(conndata.port, "80");
	cl_assert_equal_s(conndata.path, "/zap/baz/biff?bam");
	cl_assert_equal_p(conndata.username, NULL);
	cl_assert_equal_p(conndata.password, NULL);
}

117
void test_url_redirect__redirect_relative_ssl(void)
118
{
119 120
	cl_git_pass(git_net_url_parse(&conndata,
		"https://foo.com/bar/baz/biff"));
121
	cl_git_pass(git_net_url_apply_redirect(&conndata,
122
		"/zap/baz/biff?bam", true, NULL));
123 124 125 126 127 128 129
	cl_assert_equal_s(conndata.scheme, "https");
	cl_assert_equal_s(conndata.host, "foo.com");
	cl_assert_equal_s(conndata.port, "443");
	cl_assert_equal_s(conndata.path, "/zap/baz/biff?bam");
	cl_assert_equal_p(conndata.username, NULL);
	cl_assert_equal_p(conndata.password, NULL);
}
130

131
void test_url_redirect__service_query_no_query_params_in_location(void)
132
{
133 134
	cl_git_pass(git_net_url_parse(&conndata,
		"https://foo.com/bar/info/refs?service=git-upload-pack"));
135
	cl_git_pass(git_net_url_apply_redirect(&conndata,
136
		"/baz/info/refs", true, "/info/refs?service=git-upload-pack"));
137 138 139
	cl_assert_equal_s(conndata.path, "/baz");
}

140
void test_url_redirect__service_query_with_query_params_in_location(void)
141
{
142 143
	cl_git_pass(git_net_url_parse(&conndata,
		"https://foo.com/bar/info/refs?service=git-upload-pack"));
144
	cl_git_pass(git_net_url_apply_redirect(&conndata,
145
		"/baz/info/refs?service=git-upload-pack", true, "/info/refs?service=git-upload-pack"));
146 147
	cl_assert_equal_s(conndata.path, "/baz");
}