mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-03 01:58:32 +00:00
HTTP: handle "relative" redirects
This commit is contained in:
parent
5bfead1dba
commit
41a6de289f
10
src/netops.c
10
src/netops.c
@ -609,6 +609,9 @@ int gitno_connection_data_from_url(
|
|||||||
data->use_ssl = true;
|
data->use_ssl = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (url[0] == '/')
|
||||||
|
default_port = data->use_ssl ? "443" : "80";
|
||||||
|
|
||||||
if (!default_port) {
|
if (!default_port) {
|
||||||
giterr_set(GITERR_NET, "Unrecognized URL prefix");
|
giterr_set(GITERR_NET, "Unrecognized URL prefix");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -618,6 +621,13 @@ int gitno_connection_data_from_url(
|
|||||||
&data->host, &data->port, &data->user, &data->pass,
|
&data->host, &data->port, &data->user, &data->pass,
|
||||||
url, default_port);
|
url, default_port);
|
||||||
|
|
||||||
|
if (url[0] == '/') {
|
||||||
|
/* Relative redirect; reuse original host name and port */
|
||||||
|
git__free(data->host);
|
||||||
|
data->host = original_host;
|
||||||
|
original_host = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!error) {
|
if (!error) {
|
||||||
const char *path = strchr(url, '/');
|
const char *path = strchr(url, '/');
|
||||||
size_t pathlen = strlen(path);
|
size_t pathlen = strlen(path);
|
||||||
|
@ -125,6 +125,34 @@ void test_network_urlparse__connection_data_http_downgrade(void)
|
|||||||
-1);
|
-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_network_urlparse__connection_data_relative_redirect(void)
|
||||||
|
{
|
||||||
|
cl_git_pass(gitno_connection_data_from_url(&conndata,
|
||||||
|
"http://foo.com/bar/baz/biff", NULL));
|
||||||
|
cl_git_pass(gitno_connection_data_from_url(&conndata,
|
||||||
|
"/zap/baz/biff?bam", NULL));
|
||||||
|
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.user, NULL);
|
||||||
|
cl_assert_equal_p(conndata.pass, NULL);
|
||||||
|
cl_assert_equal_i(conndata.use_ssl, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_network_urlparse__connection_data_relative_redirect_ssl(void)
|
||||||
|
{
|
||||||
|
cl_git_pass(gitno_connection_data_from_url(&conndata,
|
||||||
|
"https://foo.com/bar/baz/biff", NULL));
|
||||||
|
cl_git_pass(gitno_connection_data_from_url(&conndata,
|
||||||
|
"/zap/baz/biff?bam", NULL));
|
||||||
|
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.user, NULL);
|
||||||
|
cl_assert_equal_p(conndata.pass, NULL);
|
||||||
|
cl_assert_equal_i(conndata.use_ssl, true);
|
||||||
|
}
|
||||||
|
|
||||||
/* Run this under valgrind */
|
/* Run this under valgrind */
|
||||||
void test_network_urlparse__connection_data_cleanup(void)
|
void test_network_urlparse__connection_data_cleanup(void)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user