github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/net/http_client_test.go (about)

     1  package net_test
     2  
     3  import (
     4  	"crypto/x509"
     5  	"net"
     6  	"net/http"
     7  	"net/url"
     8  	"syscall"
     9  
    10  	"github.com/cloudfoundry/cli/cf/errors"
    11  	. "github.com/cloudfoundry/cli/cf/net"
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  	"golang.org/x/net/websocket"
    15  )
    16  
    17  var _ = Describe("HTTP Client", func() {
    18  
    19  	Describe("PrepareRedirect", func() {
    20  		It("transfers original headers", func() {
    21  			originalReq, err := http.NewRequest("GET", "http://local.com/foo", nil)
    22  			Expect(err).NotTo(HaveOccurred())
    23  			originalReq.Header.Set("Authorization", "my-auth-token")
    24  			originalReq.Header.Set("Accept", "application/json")
    25  
    26  			redirectReq, err := http.NewRequest("GET", "http://local.com/bar", nil)
    27  			Expect(err).NotTo(HaveOccurred())
    28  
    29  			via := []*http.Request{originalReq}
    30  
    31  			err = PrepareRedirect(redirectReq, via)
    32  
    33  			Expect(err).NotTo(HaveOccurred())
    34  			Expect(redirectReq.Header.Get("Authorization")).To(Equal("my-auth-token"))
    35  			Expect(redirectReq.Header.Get("Accept")).To(Equal("application/json"))
    36  		})
    37  
    38  		It("does not transfer 'Authorization' headers during a redirect to different Host", func() {
    39  			originalReq, err := http.NewRequest("GET", "http://www.local.com/foo", nil)
    40  			Expect(err).NotTo(HaveOccurred())
    41  			originalReq.Header.Set("Authorization", "my-auth-token")
    42  			originalReq.Header.Set("Accept", "application/json")
    43  
    44  			redirectReq, err := http.NewRequest("GET", "http://www.remote.com/bar", nil)
    45  			Expect(err).NotTo(HaveOccurred())
    46  
    47  			via := []*http.Request{originalReq}
    48  
    49  			err = PrepareRedirect(redirectReq, via)
    50  
    51  			Expect(err).NotTo(HaveOccurred())
    52  			Expect(redirectReq.Header.Get("Authorization")).To(Equal(""))
    53  			Expect(redirectReq.Header.Get("Accept")).To(Equal("application/json"))
    54  		})
    55  
    56  		It("does not transfer POST-specific headers", func() {
    57  			originalReq, err := http.NewRequest("POST", "http://local.com/foo", nil)
    58  			Expect(err).NotTo(HaveOccurred())
    59  			originalReq.Header.Set("Content-Type", "application/json")
    60  			originalReq.Header.Set("Content-Length", "100")
    61  
    62  			redirectReq, err := http.NewRequest("GET", "http://local.com/bar", nil)
    63  			Expect(err).NotTo(HaveOccurred())
    64  
    65  			via := []*http.Request{originalReq}
    66  
    67  			err = PrepareRedirect(redirectReq, via)
    68  
    69  			Expect(err).NotTo(HaveOccurred())
    70  			Expect(redirectReq.Header.Get("Content-Type")).To(Equal(""))
    71  			Expect(redirectReq.Header.Get("Content-Length")).To(Equal(""))
    72  		})
    73  
    74  		It("fails after one redirect", func() {
    75  			firstReq, err := http.NewRequest("GET", "http://local.com/foo", nil)
    76  			Expect(err).NotTo(HaveOccurred())
    77  
    78  			secondReq, err := http.NewRequest("GET", "http://local.com/manchu", nil)
    79  			Expect(err).NotTo(HaveOccurred())
    80  
    81  			redirectReq, err := http.NewRequest("GET", "http://local.com/bar", nil)
    82  			redirectReq.Header["Referer"] = []string{"http://local.com"}
    83  			Expect(err).NotTo(HaveOccurred())
    84  
    85  			via := []*http.Request{firstReq, secondReq}
    86  
    87  			err = PrepareRedirect(redirectReq, via)
    88  
    89  			Expect(err).To(HaveOccurred())
    90  		})
    91  	})
    92  
    93  	Describe("WrapNetworkErrors", func() {
    94  		It("replaces http unknown authority errors with InvalidSSLCert errors", func() {
    95  			err, ok := WrapNetworkErrors("example.com", &url.Error{Err: x509.UnknownAuthorityError{}}).(*errors.InvalidSSLCert)
    96  			Expect(ok).To(BeTrue())
    97  			Expect(err).To(HaveOccurred())
    98  		})
    99  
   100  		It("replaces http hostname errors with InvalidSSLCert errors", func() {
   101  			err, ok := WrapNetworkErrors("example.com", &url.Error{Err: x509.HostnameError{}}).(*errors.InvalidSSLCert)
   102  			Expect(ok).To(BeTrue())
   103  			Expect(err).To(HaveOccurred())
   104  		})
   105  
   106  		It("replaces http certificate invalid errors with InvalidSSLCert errors", func() {
   107  			err, ok := WrapNetworkErrors("example.com", &url.Error{Err: x509.CertificateInvalidError{}}).(*errors.InvalidSSLCert)
   108  			Expect(ok).To(BeTrue())
   109  			Expect(err).To(HaveOccurred())
   110  		})
   111  
   112  		It("replaces websocket unknown authority errors with InvalidSSLCert errors", func() {
   113  			err, ok := WrapNetworkErrors("example.com", &websocket.DialError{Err: x509.UnknownAuthorityError{}}).(*errors.InvalidSSLCert)
   114  			Expect(ok).To(BeTrue())
   115  			Expect(err).To(HaveOccurred())
   116  		})
   117  
   118  		It("replaces websocket hostname with InvalidSSLCert errors", func() {
   119  			err, ok := WrapNetworkErrors("example.com", &websocket.DialError{Err: x509.HostnameError{}}).(*errors.InvalidSSLCert)
   120  			Expect(ok).To(BeTrue())
   121  			Expect(err).To(HaveOccurred())
   122  		})
   123  
   124  		It("replaces http websocket certificate invalid errors with InvalidSSLCert errors", func() {
   125  			err, ok := WrapNetworkErrors("example.com", &websocket.DialError{Err: x509.CertificateInvalidError{}}).(*errors.InvalidSSLCert)
   126  			Expect(ok).To(BeTrue())
   127  			Expect(err).To(HaveOccurred())
   128  		})
   129  
   130  		It("provides a nice message for connection errors", func() {
   131  			underlyingErr := syscall.Errno(61)
   132  			err := WrapNetworkErrors("example.com", &url.Error{Err: &net.OpError{Err: underlyingErr}})
   133  			Expect(err.Error()).To(ContainSubstring("Error performing request"))
   134  		})
   135  
   136  		It("wraps other errors in a generic error type", func() {
   137  			err := WrapNetworkErrors("example.com", errors.New("whatever"))
   138  			Expect(err).To(HaveOccurred())
   139  
   140  			_, ok := err.(*errors.InvalidSSLCert)
   141  			Expect(ok).To(BeFalse())
   142  		})
   143  	})
   144  })