func WrapNetworkErrors(host string, err error) error { var innerErr error switch typedErr := err.(type) { case *url.Error: innerErr = typedErr.Err case *websocket.DialError: innerErr = typedErr.Err } if innerErr != nil { switch typedInnerErr := innerErr.(type) { case x509.UnknownAuthorityError: return errors.NewInvalidSSLCert(host, T("unknown authority")) case x509.HostnameError: return errors.NewInvalidSSLCert(host, T("not valid for the requested host")) case x509.CertificateInvalidError: return errors.NewInvalidSSLCert(host, "") case *net.OpError: if typedInnerErr.Op == "dial" { return fmt.Errorf("%s: %s\n%s", T("Error performing request"), err.Error(), T("TIP: If you are behind a firewall and require an HTTP proxy, verify the https_proxy environment variable is correctly set. Else, check your network connection.")) } } } return fmt.Errorf("%s: %s", T("Error performing request"), err.Error()) }
It("tails the app's logs when no flags are given", func() { runCommand("my-app") appGUID, _, _, _ := logsRepo.TailLogsForArgsForCall(0) Expect(app.GUID).To(Equal(appGUID)) Expect(ui.Outputs()).To(ContainSubstrings( []string{"Connected, tailing logs for app", "my-app", "my-org", "my-space", "my-user"}, []string{"Log Line 1"}, )) }) Context("when the loggregator server has an invalid cert", func() { Context("when the skip-ssl-validation flag is not set", func() { It("fails and informs the user about the skip-ssl-validation flag", func() { logsRepo.TailLogsForStub = func(appGUID string, onConnect func(), logChan chan<- logs.Loggable, errChan chan<- error) { errChan <- errors.NewInvalidSSLCert("https://example.com", "it don't work good") } runCommand("my-app") Expect(ui.Outputs()).To(ContainSubstrings( []string{"Received invalid SSL certificate", "https://example.com"}, []string{"TIP"}, )) }) It("informs the user of the error when they include the --recent flag", func() { logsRepo.RecentLogsForReturns(nil, errors.NewInvalidSSLCert("https://example.com", "how does SSL work???")) runCommand("--recent", "my-app") Expect(ui.Outputs()).To(ContainSubstrings( []string{"Received invalid SSL certificate", "https://example.com"},
ItDoesntShowTheTarget() It("clears the entire config", func() { Expect(Config.APIEndpoint()).To(BeEmpty()) Expect(Config.IsSSLDisabled()).To(BeFalse()) Expect(Config.AccessToken()).To(BeEmpty()) Expect(Config.RefreshToken()).To(BeEmpty()) Expect(Config.OrganizationFields().GUID).To(BeEmpty()) Expect(Config.SpaceFields().GUID).To(BeEmpty()) }) }) }) Describe("when there is an invalid SSL cert", func() { BeforeEach(func() { endpointRepo.GetCCInfoReturns(nil, "", errors.NewInvalidSSLCert("https://bobs-burgers.com", "SELF SIGNED SADNESS")) ui.Inputs = []string{"bobs-burgers.com"} }) It("fails and suggests the user skip SSL validation", func() { Expect(ui.Outputs()).To(ContainSubstrings( []string{"FAILED"}, []string{"SSL Cert", "https://bobs-burgers.com"}, []string{"TIP", "login", "--skip-ssl-validation"}, )) }) ItDoesntShowTheTarget() }) })
repoLocator = api.RepositoryLocator{}.SetEndpointRepository(endpointRepo) deps = commandregistry.Dependency{ UI: ui, Config: config, RepoLocator: repoLocator, } cmd = commands.API{}.SetDependency(deps, false).(commands.API) flagContext = flags.NewFlagContext(cmd.MetaData().Flags) }) Context("when the api endpoint's ssl certificate is invalid", func() { It("warns the user and prints out a tip", func() { endpointRepo.GetCCInfoReturns(nil, "", errors.NewInvalidSSLCert("https://buttontomatoes.org", "why? no. go away")) callApi([]string{"https://buttontomatoes.org"}) Expect(runCLIErr).To(HaveOccurred()) Expect(runCLIErr.Error()).To(ContainSubstring("Invalid SSL Cert for https://buttontomatoes.org")) Expect(runCLIErr.Error()).To(ContainSubstring("TIP")) Expect(runCLIErr.Error()).To(ContainSubstring("--skip-ssl-validation")) }) }) Context("when the user does not provide an endpoint", func() { Context("when the endpoint is set in the config", func() { BeforeEach(func() { config.SetAPIEndpoint("https://api.run.pivotal.io") config.SetAPIVersion("2.0") config.SetSSLDisabled(true)