net/http.Request.URL.Host returns empty string
I was trying to redirect my client to https url. And I tried this:
func index(w http.ResponseWriter, r *http.Request) {
if r.URL.Scheme != "https" {
http.Redirect(w, r, "https://"+r.URL.Host+r.URL.Path, 301)
return
}
//....
}
But it gave me this response:
$ curl -i http://localhost
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=utf-8
Location: https:///
Date: Sat, 24 Nov 2018 20:02:33 GMT
Content-Length: 44
<a href="https:///">Moved Permanently</a>.
The mysterious thing is Location: https:///
this line. And I read the go doc again and found:
// URL specifies either the URI being requested (for server
// requests) or the URL to access (for client requests).
//
// For server requests the URL is parsed from the URI
// supplied on the Request-Line as stored in RequestURI. **For
// most requests, fields other than Path and RawQuery will be
// empty. (See RFC 7230, Section 5.3)**
//
// For client requests, the URL's Host specifies the server to
// connect to, while the Request's Host field optionally
// specifies the Host header value to send in the HTTP
// request.
URL *url.URL
Then I've understood that why it's returning and empty string for r.URL.Host
.
I have also tried r.Header.Get("Host")
and then r.Header.Get("Origin")
. It also gave me an empty string.
Any other way to get the host name?
http url go request
add a comment |
I was trying to redirect my client to https url. And I tried this:
func index(w http.ResponseWriter, r *http.Request) {
if r.URL.Scheme != "https" {
http.Redirect(w, r, "https://"+r.URL.Host+r.URL.Path, 301)
return
}
//....
}
But it gave me this response:
$ curl -i http://localhost
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=utf-8
Location: https:///
Date: Sat, 24 Nov 2018 20:02:33 GMT
Content-Length: 44
<a href="https:///">Moved Permanently</a>.
The mysterious thing is Location: https:///
this line. And I read the go doc again and found:
// URL specifies either the URI being requested (for server
// requests) or the URL to access (for client requests).
//
// For server requests the URL is parsed from the URI
// supplied on the Request-Line as stored in RequestURI. **For
// most requests, fields other than Path and RawQuery will be
// empty. (See RFC 7230, Section 5.3)**
//
// For client requests, the URL's Host specifies the server to
// connect to, while the Request's Host field optionally
// specifies the Host header value to send in the HTTP
// request.
URL *url.URL
Then I've understood that why it's returning and empty string for r.URL.Host
.
I have also tried r.Header.Get("Host")
and then r.Header.Get("Origin")
. It also gave me an empty string.
Any other way to get the host name?
http url go request
1
For // most requests, fields other than Path and RawQuery will be // empty. (See RFC 7230, Section 5.3) this line from godoc describes well that why ther.URL.Host
is empty. But is there any other way to get a non empty host name?
– Anik Hasibul
Nov 24 '18 at 20:19
add a comment |
I was trying to redirect my client to https url. And I tried this:
func index(w http.ResponseWriter, r *http.Request) {
if r.URL.Scheme != "https" {
http.Redirect(w, r, "https://"+r.URL.Host+r.URL.Path, 301)
return
}
//....
}
But it gave me this response:
$ curl -i http://localhost
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=utf-8
Location: https:///
Date: Sat, 24 Nov 2018 20:02:33 GMT
Content-Length: 44
<a href="https:///">Moved Permanently</a>.
The mysterious thing is Location: https:///
this line. And I read the go doc again and found:
// URL specifies either the URI being requested (for server
// requests) or the URL to access (for client requests).
//
// For server requests the URL is parsed from the URI
// supplied on the Request-Line as stored in RequestURI. **For
// most requests, fields other than Path and RawQuery will be
// empty. (See RFC 7230, Section 5.3)**
//
// For client requests, the URL's Host specifies the server to
// connect to, while the Request's Host field optionally
// specifies the Host header value to send in the HTTP
// request.
URL *url.URL
Then I've understood that why it's returning and empty string for r.URL.Host
.
I have also tried r.Header.Get("Host")
and then r.Header.Get("Origin")
. It also gave me an empty string.
Any other way to get the host name?
http url go request
I was trying to redirect my client to https url. And I tried this:
func index(w http.ResponseWriter, r *http.Request) {
if r.URL.Scheme != "https" {
http.Redirect(w, r, "https://"+r.URL.Host+r.URL.Path, 301)
return
}
//....
}
But it gave me this response:
$ curl -i http://localhost
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=utf-8
Location: https:///
Date: Sat, 24 Nov 2018 20:02:33 GMT
Content-Length: 44
<a href="https:///">Moved Permanently</a>.
The mysterious thing is Location: https:///
this line. And I read the go doc again and found:
// URL specifies either the URI being requested (for server
// requests) or the URL to access (for client requests).
//
// For server requests the URL is parsed from the URI
// supplied on the Request-Line as stored in RequestURI. **For
// most requests, fields other than Path and RawQuery will be
// empty. (See RFC 7230, Section 5.3)**
//
// For client requests, the URL's Host specifies the server to
// connect to, while the Request's Host field optionally
// specifies the Host header value to send in the HTTP
// request.
URL *url.URL
Then I've understood that why it's returning and empty string for r.URL.Host
.
I have also tried r.Header.Get("Host")
and then r.Header.Get("Origin")
. It also gave me an empty string.
Any other way to get the host name?
http url go request
http url go request
asked Nov 24 '18 at 20:18
Anik HasibulAnik Hasibul
121112
121112
1
For // most requests, fields other than Path and RawQuery will be // empty. (See RFC 7230, Section 5.3) this line from godoc describes well that why ther.URL.Host
is empty. But is there any other way to get a non empty host name?
– Anik Hasibul
Nov 24 '18 at 20:19
add a comment |
1
For // most requests, fields other than Path and RawQuery will be // empty. (See RFC 7230, Section 5.3) this line from godoc describes well that why ther.URL.Host
is empty. But is there any other way to get a non empty host name?
– Anik Hasibul
Nov 24 '18 at 20:19
1
1
For // most requests, fields other than Path and RawQuery will be // empty. (See RFC 7230, Section 5.3) this line from godoc describes well that why the
r.URL.Host
is empty. But is there any other way to get a non empty host name?– Anik Hasibul
Nov 24 '18 at 20:19
For // most requests, fields other than Path and RawQuery will be // empty. (See RFC 7230, Section 5.3) this line from godoc describes well that why the
r.URL.Host
is empty. But is there any other way to get a non empty host name?– Anik Hasibul
Nov 24 '18 at 20:19
add a comment |
2 Answers
2
active
oldest
votes
Try using r.Host?
The docs say:
// For server requests Host specifies the host on which the URL
// is sought. Per RFC 7230, section 5.4, this is either the value
// of the "Host" header or the host name given in the URL itself.
So Maybe try that?
func index(w http.ResponseWriter, r *http.Request) {
if r.URL.Scheme != "https" {
http.Redirect(w, r, "https://"+r.Host+r.URL.Path, 301)
return
}
//....
}
Thanks it worked, and accepted as answer for answering with example.
– Anik Hasibul
Nov 24 '18 at 20:42
1
For non-proxy requests, r.URL.Scheme is always the empty string. You can reduce the body of the handler to thehttp.Redirect
call.
– ThunderCat
Nov 24 '18 at 22:02
add a comment |
From go doc http.request
:
type Request struct {
...
// For incoming requests, the Host header is promoted to the
// Request.Host field and removed from the Header map.
...
Header Header
...
// For server requests Host specifies the host on which the
// URL is sought. Per RFC 2616, this is either the value of
// the "Host" header or the host name given in the URL itself.
...
Host string
Thus, use r.Host
not r.Header.Get("Host")
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53462002%2fnet-http-request-url-host-returns-empty-string%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Try using r.Host?
The docs say:
// For server requests Host specifies the host on which the URL
// is sought. Per RFC 7230, section 5.4, this is either the value
// of the "Host" header or the host name given in the URL itself.
So Maybe try that?
func index(w http.ResponseWriter, r *http.Request) {
if r.URL.Scheme != "https" {
http.Redirect(w, r, "https://"+r.Host+r.URL.Path, 301)
return
}
//....
}
Thanks it worked, and accepted as answer for answering with example.
– Anik Hasibul
Nov 24 '18 at 20:42
1
For non-proxy requests, r.URL.Scheme is always the empty string. You can reduce the body of the handler to thehttp.Redirect
call.
– ThunderCat
Nov 24 '18 at 22:02
add a comment |
Try using r.Host?
The docs say:
// For server requests Host specifies the host on which the URL
// is sought. Per RFC 7230, section 5.4, this is either the value
// of the "Host" header or the host name given in the URL itself.
So Maybe try that?
func index(w http.ResponseWriter, r *http.Request) {
if r.URL.Scheme != "https" {
http.Redirect(w, r, "https://"+r.Host+r.URL.Path, 301)
return
}
//....
}
Thanks it worked, and accepted as answer for answering with example.
– Anik Hasibul
Nov 24 '18 at 20:42
1
For non-proxy requests, r.URL.Scheme is always the empty string. You can reduce the body of the handler to thehttp.Redirect
call.
– ThunderCat
Nov 24 '18 at 22:02
add a comment |
Try using r.Host?
The docs say:
// For server requests Host specifies the host on which the URL
// is sought. Per RFC 7230, section 5.4, this is either the value
// of the "Host" header or the host name given in the URL itself.
So Maybe try that?
func index(w http.ResponseWriter, r *http.Request) {
if r.URL.Scheme != "https" {
http.Redirect(w, r, "https://"+r.Host+r.URL.Path, 301)
return
}
//....
}
Try using r.Host?
The docs say:
// For server requests Host specifies the host on which the URL
// is sought. Per RFC 7230, section 5.4, this is either the value
// of the "Host" header or the host name given in the URL itself.
So Maybe try that?
func index(w http.ResponseWriter, r *http.Request) {
if r.URL.Scheme != "https" {
http.Redirect(w, r, "https://"+r.Host+r.URL.Path, 301)
return
}
//....
}
answered Nov 24 '18 at 20:36
jrwrenjrwren
12.3k52849
12.3k52849
Thanks it worked, and accepted as answer for answering with example.
– Anik Hasibul
Nov 24 '18 at 20:42
1
For non-proxy requests, r.URL.Scheme is always the empty string. You can reduce the body of the handler to thehttp.Redirect
call.
– ThunderCat
Nov 24 '18 at 22:02
add a comment |
Thanks it worked, and accepted as answer for answering with example.
– Anik Hasibul
Nov 24 '18 at 20:42
1
For non-proxy requests, r.URL.Scheme is always the empty string. You can reduce the body of the handler to thehttp.Redirect
call.
– ThunderCat
Nov 24 '18 at 22:02
Thanks it worked, and accepted as answer for answering with example.
– Anik Hasibul
Nov 24 '18 at 20:42
Thanks it worked, and accepted as answer for answering with example.
– Anik Hasibul
Nov 24 '18 at 20:42
1
1
For non-proxy requests, r.URL.Scheme is always the empty string. You can reduce the body of the handler to the
http.Redirect
call.– ThunderCat
Nov 24 '18 at 22:02
For non-proxy requests, r.URL.Scheme is always the empty string. You can reduce the body of the handler to the
http.Redirect
call.– ThunderCat
Nov 24 '18 at 22:02
add a comment |
From go doc http.request
:
type Request struct {
...
// For incoming requests, the Host header is promoted to the
// Request.Host field and removed from the Header map.
...
Header Header
...
// For server requests Host specifies the host on which the
// URL is sought. Per RFC 2616, this is either the value of
// the "Host" header or the host name given in the URL itself.
...
Host string
Thus, use r.Host
not r.Header.Get("Host")
add a comment |
From go doc http.request
:
type Request struct {
...
// For incoming requests, the Host header is promoted to the
// Request.Host field and removed from the Header map.
...
Header Header
...
// For server requests Host specifies the host on which the
// URL is sought. Per RFC 2616, this is either the value of
// the "Host" header or the host name given in the URL itself.
...
Host string
Thus, use r.Host
not r.Header.Get("Host")
add a comment |
From go doc http.request
:
type Request struct {
...
// For incoming requests, the Host header is promoted to the
// Request.Host field and removed from the Header map.
...
Header Header
...
// For server requests Host specifies the host on which the
// URL is sought. Per RFC 2616, this is either the value of
// the "Host" header or the host name given in the URL itself.
...
Host string
Thus, use r.Host
not r.Header.Get("Host")
From go doc http.request
:
type Request struct {
...
// For incoming requests, the Host header is promoted to the
// Request.Host field and removed from the Header map.
...
Header Header
...
// For server requests Host specifies the host on which the
// URL is sought. Per RFC 2616, this is either the value of
// the "Host" header or the host name given in the URL itself.
...
Host string
Thus, use r.Host
not r.Header.Get("Host")
answered Nov 24 '18 at 20:37
Steffen UllrichSteffen Ullrich
61.7k358100
61.7k358100
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53462002%2fnet-http-request-url-host-returns-empty-string%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
For // most requests, fields other than Path and RawQuery will be // empty. (See RFC 7230, Section 5.3) this line from godoc describes well that why the
r.URL.Host
is empty. But is there any other way to get a non empty host name?– Anik Hasibul
Nov 24 '18 at 20:19