Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

uri: isHttps() and isHttp() #1150

Merged
merged 2 commits into from Nov 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 4 additions & 6 deletions client.go
Expand Up @@ -4,7 +4,6 @@ package fasthttp

import (
"bufio"
"bytes"
"crypto/tls"
"errors"
"fmt"
Expand Down Expand Up @@ -464,11 +463,10 @@ func (c *Client) Do(req *Request, resp *Response) error {
host := uri.Host()

isTLS := false
scheme := uri.Scheme()
if bytes.Equal(scheme, strHTTPS) {
if uri.isHttps() {
isTLS = true
} else if !bytes.Equal(scheme, strHTTP) {
return fmt.Errorf("unsupported protocol %q. http and https are supported", scheme)
} else if !uri.isHttp() {
return fmt.Errorf("unsupported protocol %q. http and https are supported", uri.Scheme())
}

startCleaner := false
Expand Down Expand Up @@ -1363,7 +1361,7 @@ func (c *HostClient) doNonNilReqResp(req *Request, resp *Response) (bool, error)
req.secureErrorLogMessage = c.SecureErrorLogMessage
req.Header.secureErrorLogMessage = c.SecureErrorLogMessage

if c.IsTLS != bytes.Equal(req.uri.Scheme(), strHTTPS) {
if c.IsTLS != req.uri.isHttps() {
return false, ErrHostClientRedirectToDifferentScheme
}

Expand Down
5 changes: 2 additions & 3 deletions server_test.go
Expand Up @@ -1158,9 +1158,8 @@ func TestServerServeTLSEmbed(t *testing.T) {
ctx.Error("expecting tls", StatusBadRequest)
return
}
scheme := ctx.URI().Scheme()
if string(scheme) != "https" {
ctx.Error(fmt.Sprintf("unexpected scheme=%q. Expecting %q", scheme, "https"), StatusBadRequest)
if !ctx.URI().isHttps() {
ctx.Error(fmt.Sprintf("unexpected scheme=%q. Expecting %q", ctx.URI().Scheme(), "https"), StatusBadRequest)
return
}
ctx.WriteString("success") //nolint:errcheck
Expand Down
13 changes: 10 additions & 3 deletions uri.go
Expand Up @@ -216,6 +216,14 @@ func (u *URI) SetSchemeBytes(scheme []byte) {
lowercaseBytes(u.scheme)
}

func (u *URI) isHttps() bool {
return bytes.Equal(u.scheme, strHTTPS)
}

func (u *URI) isHttp() bool {
return len(u.scheme) == 0 || bytes.Equal(u.scheme, strHTTP)
}

// Reset clears uri.
func (u *URI) Reset() {
u.pathOriginal = u.pathOriginal[:0]
Expand Down Expand Up @@ -282,14 +290,13 @@ func (u *URI) parse(host, uri []byte, isTLS bool) error {

if len(host) == 0 || bytes.Contains(uri, strColonSlashSlash) {
scheme, newHost, newURI := splitHostURI(host, uri)
u.scheme = append(u.scheme, scheme...)
lowercaseBytes(u.scheme)
u.SetSchemeBytes(scheme)
host = newHost
uri = newURI
}

if isTLS {
u.scheme = append(u.scheme[:0], strHTTPS...)
u.SetSchemeBytes(strHTTPS)
}

if n := bytes.IndexByte(host, '@'); n >= 0 {
Expand Down
23 changes: 23 additions & 0 deletions uri_test.go
Expand Up @@ -310,6 +310,29 @@ func testURIParseScheme(t *testing.T, uri, expectedScheme, expectedHost, expecte
}
}

func TestIsHttp(t *testing.T) {
var u URI
if !u.isHttp() || u.isHttps() {
t.Fatalf("http scheme is assumed by default and not https")
}
u.SetSchemeBytes([]byte{})
if !u.isHttp() || u.isHttps() {
t.Fatalf("empty scheme must be threaten as http and not https")
}
u.SetScheme("http")
if !u.isHttp() || u.isHttps() {
t.Fatalf("scheme must be threaten as http and not https")
}
u.SetScheme("https")
if !u.isHttps() || u.isHttp() {
t.Fatalf("scheme must be threaten as https and not http")
}
u.SetScheme("dav")
if u.isHttps() || u.isHttp() {
t.Fatalf("scheme must be threaten as not http and not https")
}
}

func TestURIParse(t *testing.T) {
t.Parallel()

Expand Down