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 })