12 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
13 . "github.com/onsi/ginkgo/v2"
14 . "github.com/onsi/gomega"
15 . "github.com/onsi/gomega/gleak"
18const hello = "Hello World!"
20var _ = Describe("Server", func() {
22 handler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
23 rw.Write([]byte(hello))
25 Context("NewServer", func() {
26 type newServerTableInput struct {
29 expectHTTPListener bool
30 expectTLSListener bool
35 DescribeTable("When creating the new server from the options", func(in *newServerTableInput) {
41 l, err := net.Listen("tcp", in.fdAddr)
42 Expect(err).ToNot(HaveOccurred())
43 f, err := l.(*net.TCPListener).File()
44 Expect(err).ToNot(HaveOccurred())
45 in.opts.fdFiles = []*os.File{f}
48 srv, err := NewServer(in.opts)
49 if in.expectedErr != nil {
50 Expect(err).To(MatchError(ContainSubstring(in.expectedErr.Error())))
51 Expect(srv).To(BeNil())
55 Expect(err).ToNot(HaveOccurred())
57 s, ok := srv.(*server)
58 Expect(ok).To(BeTrue())
60 Expect(s.listener != nil).To(Equal(in.expectHTTPListener))
61 if in.expectHTTPListener {
62 Expect(s.listener.Close()).To(Succeed())
64 Expect(s.tlsListener != nil).To(Equal(in.expectTLSListener))
65 if in.expectTLSListener {
66 Expect(s.tlsListener.Close()).To(Succeed())
69 Entry("with a valid non-lowercase fd IPv4 bind address", &newServerTableInput{
75 expectHTTPListener: true,
76 expectTLSListener: false,
77 fdAddr: "127.0.0.1:0",
79 Entry("with a valid fd IPv4 bind address", &newServerTableInput{
85 expectHTTPListener: true,
86 expectTLSListener: false,
87 fdAddr: "127.0.0.1:0",
89 Entry("with a invalid fd named bind address", &newServerTableInput{
92 BindAddress: "fd:hello",
94 expectedErr: fmt.Errorf("error setting up listener: listen (file, %s) failed: listen failed: fd with name is not implemented yet", "hello"),
95 expectHTTPListener: true,
96 expectTLSListener: false,
97 fdAddr: "127.0.0.1:0",
99 Entry("with a invalid fd IPv4 bind address", &newServerTableInput{
104 expectedErr: fmt.Errorf("error setting up listener: listen (file, %d) failed: listen failed: fd outside of range of available file descriptors", 4),
105 expectHTTPListener: true,
106 expectTLSListener: false,
107 fdAddr: "127.0.0.1:0",
109 Entry("with an ipv4 valid http bind address", &newServerTableInput{
112 BindAddress: "127.0.0.1:0",
115 expectHTTPListener: true,
116 expectTLSListener: false,
118 Entry("with an ipv4 valid https bind address, with no TLS config", &newServerTableInput{
121 SecureBindAddress: "127.0.0.1:0",
123 expectedErr: errors.New("error setting up TLS listener: no TLS config provided"),
124 expectHTTPListener: false,
125 expectTLSListener: false,
127 Entry("with an ipv4 valid https bind address, and valid TLS config", &newServerTableInput{
130 SecureBindAddress: "127.0.0.1:0",
132 Key: &ipv4KeyDataSource,
133 Cert: &ipv4CertDataSource,
137 expectHTTPListener: false,
138 expectTLSListener: true,
140 Entry("with a both a fd valid http and ipv4 valid https bind address, and valid TLS config", &newServerTableInput{
144 SecureBindAddress: "127.0.0.1:0",
146 Key: &ipv4KeyDataSource,
147 Cert: &ipv4CertDataSource,
151 expectHTTPListener: true,
152 expectTLSListener: true,
153 fdAddr: "127.0.0.1:0",
155 Entry("with a both a ipv4 valid http and ipv4 valid https bind address, and valid TLS config", &newServerTableInput{
158 BindAddress: "127.0.0.1:0",
159 SecureBindAddress: "127.0.0.1:0",
161 Key: &ipv4KeyDataSource,
162 Cert: &ipv4CertDataSource,
166 expectHTTPListener: true,
167 expectTLSListener: true,
169 Entry("with a \"-\" for the bind address", &newServerTableInput{
175 expectHTTPListener: false,
176 expectTLSListener: false,
178 Entry("with a \"-\" for the secure bind address", &newServerTableInput{
181 SecureBindAddress: "-",
184 expectHTTPListener: false,
185 expectTLSListener: false,
187 Entry("with an ipv4 invalid bind address scheme", &newServerTableInput{
190 BindAddress: "invalid://127.0.0.1:0",
192 expectedErr: errors.New("error setting up listener: listen (invalid, 127.0.0.1:0) failed: listen invalid: unknown network invalid"),
193 expectHTTPListener: false,
194 expectTLSListener: false,
196 Entry("with an ipv4 invalid secure bind address scheme", &newServerTableInput{
199 SecureBindAddress: "invalid://127.0.0.1:0",
201 Key: &ipv4KeyDataSource,
202 Cert: &ipv4CertDataSource,
206 expectHTTPListener: false,
207 expectTLSListener: true,
209 Entry("with an ipv4 invalid bind address port", &newServerTableInput{
212 BindAddress: "127.0.0.1:a",
214 expectedErr: errors.New("error setting up listener: listen (tcp, 127.0.0.1:a) failed: listen tcp: "),
215 expectHTTPListener: false,
216 expectTLSListener: false,
218 Entry("with an ipv4 invalid secure bind address port", &newServerTableInput{
221 SecureBindAddress: "127.0.0.1:a",
223 Key: &ipv4KeyDataSource,
224 Cert: &ipv4CertDataSource,
227 expectedErr: errors.New("error setting up TLS listener: listen (127.0.0.1:a) failed: listen tcp: "),
228 expectHTTPListener: false,
229 expectTLSListener: false,
231 Entry("with an ipv4 invalid TLS key", &newServerTableInput{
234 SecureBindAddress: "127.0.0.1:0",
236 Key: &options.SecretSource{
237 Value: []byte("invalid"),
239 Cert: &ipv4CertDataSource,
242 expectedErr: errors.New("error setting up TLS listener: could not load certificate: could not parse certificate data: tls: failed to find any PEM data in key input"),
243 expectHTTPListener: false,
244 expectTLSListener: false,
246 Entry("with an ipv4 invalid TLS cert", &newServerTableInput{
249 SecureBindAddress: "127.0.0.1:0",
251 Key: &ipv4KeyDataSource,
252 Cert: &options.SecretSource{
253 Value: []byte("invalid"),
257 expectedErr: errors.New("error setting up TLS listener: could not load certificate: could not parse certificate data: tls: failed to find any PEM data in certificate input"),
258 expectHTTPListener: false,
259 expectTLSListener: false,
261 Entry("with an ipv4 address, with no TLS key", &newServerTableInput{
264 SecureBindAddress: "127.0.0.1:0",
266 Cert: &ipv4CertDataSource,
269 expectedErr: errors.New("error setting up TLS listener: could not load certificate: could not load key data: no configuration provided"),
270 expectHTTPListener: false,
271 expectTLSListener: false,
273 Entry("with an ipv4 address, with no TLS cert", &newServerTableInput{
276 SecureBindAddress: "127.0.0.1:0",
278 Key: &ipv4KeyDataSource,
281 expectedErr: errors.New("error setting up TLS listener: could not load certificate: could not load cert data: no configuration provided"),
282 expectHTTPListener: false,
283 expectTLSListener: false,
285 Entry("when the ipv4 bind address is prefixed with the http scheme", &newServerTableInput{
288 BindAddress: "http://127.0.0.1:0",
291 expectHTTPListener: true,
292 expectTLSListener: false,
294 Entry("when the ipv4 secure bind address is prefixed with the https scheme", &newServerTableInput{
297 SecureBindAddress: "https://127.0.0.1:0",
299 Key: &ipv4KeyDataSource,
300 Cert: &ipv4CertDataSource,
304 expectHTTPListener: false,
305 expectTLSListener: true,
307 Entry("with an ipv4 valid https bind address, and valid TLS config with MinVersion", &newServerTableInput{
310 SecureBindAddress: "127.0.0.1:0",
312 Key: &ipv4KeyDataSource,
313 Cert: &ipv4CertDataSource,
314 MinVersion: "TLS1.3",
318 expectHTTPListener: false,
319 expectTLSListener: true,
321 Entry("with an ipv4 valid https bind address, and invalid TLS config with unknown MinVersion", &newServerTableInput{
324 SecureBindAddress: "127.0.0.1:0",
326 Key: &ipv4KeyDataSource,
327 Cert: &ipv4CertDataSource,
328 MinVersion: "TLS1.42",
331 expectedErr: errors.New("error setting up TLS listener: unknown TLS MinVersion config provided"),
332 expectHTTPListener: false,
333 expectTLSListener: true,
335 Entry("with an ipv4 valid https bind address, and valid TLS config with CipherSuites", &newServerTableInput{
338 SecureBindAddress: "127.0.0.1:0",
340 Key: &ipv4KeyDataSource,
341 Cert: &ipv4CertDataSource,
342 CipherSuites: []string{
343 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
344 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
349 expectHTTPListener: false,
350 expectTLSListener: true,
352 Entry("with an ipv4 valid https bind address, and invalid TLS config with unknown CipherSuites", &newServerTableInput{
355 SecureBindAddress: "127.0.0.1:0",
357 Key: &ipv4KeyDataSource,
358 Cert: &ipv4CertDataSource,
359 CipherSuites: []string{
360 "TLS_RSA_WITH_RC4_64_SHA",
361 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
365 expectedErr: errors.New("error setting up TLS listener: could not parse cipher suites: unknown TLS cipher suite name specified \"TLS_RSA_WITH_RC4_64_SHA\""),
366 expectHTTPListener: false,
367 expectTLSListener: true,
369 Entry("with valid fd IPv6 bind address", &newServerTableInput{
375 expectHTTPListener: true,
376 expectTLSListener: false,
380 Entry("with a invalid fd IPv6 bind address", &newServerTableInput{
385 expectedErr: fmt.Errorf("error setting up listener: listen (file, %d) failed: listen failed: fd outside of range of available file descriptors", 4),
386 expectHTTPListener: true,
387 expectTLSListener: false,
390 Entry("with an ipv6 valid http bind address", &newServerTableInput{
393 BindAddress: "[::1]:0",
396 expectHTTPListener: true,
397 expectTLSListener: false,
400 Entry("with an ipv6 valid https bind address, with no TLS config", &newServerTableInput{
403 SecureBindAddress: "[::1]:0",
405 expectedErr: errors.New("error setting up TLS listener: no TLS config provided"),
406 expectHTTPListener: false,
407 expectTLSListener: false,
410 Entry("with an ipv6 valid https bind address, and valid TLS config", &newServerTableInput{
413 SecureBindAddress: "[::1]:0",
415 Key: &ipv6KeyDataSource,
416 Cert: &ipv6CertDataSource,
420 expectHTTPListener: false,
421 expectTLSListener: true,
424 Entry("with a both a fd valid http and ipv6 valid https bind address, and valid TLS config", &newServerTableInput{
428 SecureBindAddress: "[::1]:0",
430 Key: &ipv6KeyDataSource,
431 Cert: &ipv6CertDataSource,
435 expectHTTPListener: true,
436 expectTLSListener: true,
440 Entry("with a both a ipv6 valid http and ipv6 valid https bind address, and valid TLS config", &newServerTableInput{
443 BindAddress: "[::1]:0",
444 SecureBindAddress: "[::1]:0",
446 Key: &ipv6KeyDataSource,
447 Cert: &ipv6CertDataSource,
451 expectHTTPListener: true,
452 expectTLSListener: true,
455 Entry("with an ipv6 invalid bind address scheme", &newServerTableInput{
458 BindAddress: "invalid://[::1]:0",
460 expectedErr: errors.New("error setting up listener: listen (invalid, [::1]:0) failed: listen invalid: unknown network invalid"),
461 expectHTTPListener: false,
462 expectTLSListener: false,
465 Entry("with an ipv6 invalid secure bind address scheme", &newServerTableInput{
468 SecureBindAddress: "invalid://[::1]:0",
470 Key: &ipv6KeyDataSource,
471 Cert: &ipv6CertDataSource,
475 expectHTTPListener: false,
476 expectTLSListener: true,
479 Entry("with an ipv6 invalid bind address port", &newServerTableInput{
482 BindAddress: "[::1]:a",
484 expectedErr: errors.New("error setting up listener: listen (tcp, [::1]:a) failed: listen tcp: "),
485 expectHTTPListener: false,
486 expectTLSListener: false,
489 Entry("with an ipv6 invalid secure bind address port", &newServerTableInput{
492 SecureBindAddress: "[::1]:a",
494 Key: &ipv6KeyDataSource,
495 Cert: &ipv6CertDataSource,
498 expectedErr: errors.New("error setting up TLS listener: listen ([::1]:a) failed: listen tcp: "),
499 expectHTTPListener: false,
500 expectTLSListener: false,
503 Entry("with an ipv6 invalid TLS key", &newServerTableInput{
506 SecureBindAddress: "[::1]:0",
508 Key: &options.SecretSource{
509 Value: []byte("invalid"),
511 Cert: &ipv6CertDataSource,
514 expectedErr: errors.New("error setting up TLS listener: could not load certificate: could not parse certificate data: tls: failed to find any PEM data in key input"),
515 expectHTTPListener: false,
516 expectTLSListener: false,
519 Entry("with an ipv6 invalid TLS cert", &newServerTableInput{
522 SecureBindAddress: "[::1]:0",
524 Key: &ipv6KeyDataSource,
525 Cert: &options.SecretSource{
526 Value: []byte("invalid"),
530 expectedErr: errors.New("error setting up TLS listener: could not load certificate: could not parse certificate data: tls: failed to find any PEM data in certificate input"),
531 expectHTTPListener: false,
532 expectTLSListener: false,
535 Entry("with an ipv6 address, with no TLS key", &newServerTableInput{
538 SecureBindAddress: "[::1]:0",
540 Cert: &ipv6CertDataSource,
543 expectedErr: errors.New("error setting up TLS listener: could not load certificate: could not load key data: no configuration provided"),
544 expectHTTPListener: false,
545 expectTLSListener: false,
548 Entry("with an ipv6 address, with no TLS cert", &newServerTableInput{
551 SecureBindAddress: "[::1]:0",
553 Key: &ipv6KeyDataSource,
556 expectedErr: errors.New("error setting up TLS listener: could not load certificate: could not load cert data: no configuration provided"),
557 expectHTTPListener: false,
558 expectTLSListener: false,
561 Entry("when the ipv6 bind address is prefixed with the http scheme", &newServerTableInput{
564 BindAddress: "http://[::1]:0",
567 expectHTTPListener: true,
568 expectTLSListener: false,
571 Entry("when the ipv6 secure bind address is prefixed with the https scheme", &newServerTableInput{
574 SecureBindAddress: "https://[::1]:0",
576 Key: &ipv6KeyDataSource,
577 Cert: &ipv6CertDataSource,
581 expectHTTPListener: false,
582 expectTLSListener: true,
585 Entry("with an ipv6 valid https bind address, and valid TLS config with MinVersion", &newServerTableInput{
588 SecureBindAddress: "[::1]:0",
590 Key: &ipv6KeyDataSource,
591 Cert: &ipv6CertDataSource,
592 MinVersion: "TLS1.3",
596 expectHTTPListener: false,
597 expectTLSListener: true,
600 Entry("with an ipv6 valid https bind address, and invalid TLS config with unknown MinVersion", &newServerTableInput{
603 SecureBindAddress: "[::1]:0",
605 Key: &ipv6KeyDataSource,
606 Cert: &ipv6CertDataSource,
607 MinVersion: "TLS1.42",
610 expectedErr: errors.New("error setting up TLS listener: unknown TLS MinVersion config provided"),
611 expectHTTPListener: false,
612 expectTLSListener: true,
615 Entry("with an ipv6 valid https bind address, and valid TLS config with CipherSuites", &newServerTableInput{
618 SecureBindAddress: "[::1]:0",
620 Key: &ipv4KeyDataSource,
621 Cert: &ipv4CertDataSource,
622 CipherSuites: []string{
623 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
624 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
629 expectHTTPListener: false,
630 expectTLSListener: true,
633 Entry("with an ipv6 valid https bind address, and invalid TLS config with unknown CipherSuites", &newServerTableInput{
636 SecureBindAddress: "[::1]:0",
638 Key: &ipv4KeyDataSource,
639 Cert: &ipv4CertDataSource,
640 CipherSuites: []string{
641 "TLS_RSA_WITH_RC4_64_SHA",
642 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
646 expectedErr: errors.New("error setting up TLS listener: could not parse cipher suites: unknown TLS cipher suite name specified \"TLS_RSA_WITH_RC4_64_SHA\""),
647 expectHTTPListener: false,
648 expectTLSListener: true,
654 Context("Start", func() {
656 var ctx context.Context
657 var cancel context.CancelFunc
660 ctx, cancel = context.WithCancel(context.Background())
665 Eventually(Goroutines).ShouldNot(HaveLeaked())
669 Context("with an fd ipv4 http server", func() {
670 var listenAddr string
673 l, err := net.Listen("tcp", "127.0.0.1:0")
674 Expect(err).ToNot(HaveOccurred())
675 f, err := l.(*net.TCPListener).File()
676 Expect(err).ToNot(HaveOccurred())
678 srv, err = NewServer(Opts{
681 fdFiles: []*os.File{f},
683 Expect(err).ToNot(HaveOccurred())
685 listenAddr = fmt.Sprintf("http://%s/", l.Addr().String())
688 It("Starts the server and serves the handler", func() {
690 defer GinkgoRecover()
691 Expect(srv.Start(ctx)).To(Succeed())
694 resp, err := httpGet(ctx, listenAddr)
695 Expect(err).ToNot(HaveOccurred())
696 Expect(resp.StatusCode).To(Equal(http.StatusOK))
698 body, err := io.ReadAll(resp.Body)
699 Expect(err).ToNot(HaveOccurred())
700 Expect(string(body)).To(Equal(hello))
703 It("Stops the server when the context is cancelled", func() {
705 defer GinkgoRecover()
706 Expect(srv.Start(ctx)).To(Succeed())
709 _, err := httpGet(ctx, listenAddr)
710 Expect(err).ToNot(HaveOccurred())
714 Eventually(func() error {
715 _, err := httpGet(ctx, listenAddr)
717 }).Should(HaveOccurred())
721 Context("with an ipv4 http server", func() {
722 var listenAddr string
726 srv, err = NewServer(Opts{
728 BindAddress: "127.0.0.1:0",
730 Expect(err).ToNot(HaveOccurred())
732 s, ok := srv.(*server)
733 Expect(ok).To(BeTrue())
735 listenAddr = fmt.Sprintf("http://%s/", s.listener.Addr().String())
738 It("Starts the server and serves the handler", func() {
740 defer GinkgoRecover()
741 Expect(srv.Start(ctx)).To(Succeed())
744 resp, err := httpGet(ctx, listenAddr)
745 Expect(err).ToNot(HaveOccurred())
746 Expect(resp.StatusCode).To(Equal(http.StatusOK))
748 body, err := io.ReadAll(resp.Body)
749 Expect(err).ToNot(HaveOccurred())
750 Expect(string(body)).To(Equal(hello))
753 It("Stops the server when the context is cancelled", func() {
755 defer GinkgoRecover()
756 Expect(srv.Start(ctx)).To(Succeed())
759 _, err := httpGet(ctx, listenAddr)
760 Expect(err).ToNot(HaveOccurred())
764 Eventually(func() error {
765 _, err := httpGet(ctx, listenAddr)
767 }).Should(HaveOccurred())
771 Context("with an ipv4 https server", func() {
772 var secureListenAddr string
776 srv, err = NewServer(Opts{
778 SecureBindAddress: "127.0.0.1:0",
780 Key: &ipv4KeyDataSource,
781 Cert: &ipv4CertDataSource,
784 Expect(err).ToNot(HaveOccurred())
786 s, ok := srv.(*server)
787 Expect(ok).To(BeTrue())
789 secureListenAddr = fmt.Sprintf("https://%s/", s.tlsListener.Addr().String())
792 It("Starts the server and serves the handler", func() {
794 defer GinkgoRecover()
795 Expect(srv.Start(ctx)).To(Succeed())
798 resp, err := httpGet(ctx, secureListenAddr)
799 Expect(err).ToNot(HaveOccurred())
800 Expect(resp.StatusCode).To(Equal(http.StatusOK))
802 body, err := io.ReadAll(resp.Body)
803 Expect(err).ToNot(HaveOccurred())
804 Expect(string(body)).To(Equal(hello))
807 It("Stops the server when the context is cancelled", func() {
809 defer GinkgoRecover()
810 Expect(srv.Start(ctx)).To(Succeed())
813 _, err := httpGet(ctx, secureListenAddr)
814 Expect(err).ToNot(HaveOccurred())
818 Eventually(func() error {
819 _, err := httpGet(ctx, secureListenAddr)
821 }).Should(HaveOccurred())
824 It("Serves the certificate provided", func() {
826 defer GinkgoRecover()
827 Expect(srv.Start(ctx)).To(Succeed())
830 resp, err := httpGet(ctx, secureListenAddr)
831 Expect(err).ToNot(HaveOccurred())
832 Expect(resp.StatusCode).To(Equal(http.StatusOK))
834 Expect(resp.TLS.VerifiedChains).Should(HaveLen(1))
835 Expect(resp.TLS.VerifiedChains[0]).Should(HaveLen(1))
836 Expect(resp.TLS.VerifiedChains[0][0].Raw).Should(Equal(ipv4CertData))
840 Context("with a fd ipv4 http and an ipv4 https server", func() {
841 var listenAddr, secureListenAddr string
844 l, err := net.Listen("tcp", "127.0.0.1:0")
845 Expect(err).ToNot(HaveOccurred())
846 f, err := l.(*net.TCPListener).File()
847 Expect(err).ToNot(HaveOccurred())
849 srv, err = NewServer(Opts{
852 fdFiles: []*os.File{f},
853 SecureBindAddress: "127.0.0.1:0",
855 Key: &ipv4KeyDataSource,
856 Cert: &ipv4CertDataSource,
859 Expect(err).ToNot(HaveOccurred())
861 s, ok := srv.(*server)
862 Expect(ok).To(BeTrue())
864 listenAddr = fmt.Sprintf("http://%s/", l.Addr().String())
865 secureListenAddr = fmt.Sprintf("https://%s/", s.tlsListener.Addr().String())
868 It("Starts the server and serves the handler on http", func() {
870 defer GinkgoRecover()
871 Expect(srv.Start(ctx)).To(Succeed())
874 resp, err := httpGet(ctx, listenAddr)
875 Expect(err).ToNot(HaveOccurred())
876 Expect(resp.StatusCode).To(Equal(http.StatusOK))
878 body, err := io.ReadAll(resp.Body)
879 Expect(err).ToNot(HaveOccurred())
880 Expect(string(body)).To(Equal(hello))
883 It("Starts the server and serves the handler on https", func() {
885 defer GinkgoRecover()
886 Expect(srv.Start(ctx)).To(Succeed())
889 resp, err := httpGet(ctx, secureListenAddr)
890 Expect(err).ToNot(HaveOccurred())
891 Expect(resp.StatusCode).To(Equal(http.StatusOK))
893 body, err := io.ReadAll(resp.Body)
894 Expect(err).ToNot(HaveOccurred())
895 Expect(string(body)).To(Equal(hello))
898 It("Stops both servers when the context is cancelled", func() {
900 defer GinkgoRecover()
901 Expect(srv.Start(ctx)).To(Succeed())
904 _, err := httpGet(ctx, listenAddr)
905 Expect(err).ToNot(HaveOccurred())
906 _, err = httpGet(ctx, secureListenAddr)
907 Expect(err).ToNot(HaveOccurred())
911 Eventually(func() error {
912 _, err := httpGet(ctx, listenAddr)
914 }).Should(HaveOccurred())
915 Eventually(func() error {
916 _, err := httpGet(ctx, secureListenAddr)
918 }).Should(HaveOccurred())
922 Context("with both an ipv4 http and an ipv4 https server", func() {
923 var listenAddr, secureListenAddr string
927 srv, err = NewServer(Opts{
929 BindAddress: "127.0.0.1:0",
930 SecureBindAddress: "127.0.0.1:0",
932 Key: &ipv4KeyDataSource,
933 Cert: &ipv4CertDataSource,
936 Expect(err).ToNot(HaveOccurred())
938 s, ok := srv.(*server)
939 Expect(ok).To(BeTrue())
941 listenAddr = fmt.Sprintf("http://%s/", s.listener.Addr().String())
942 secureListenAddr = fmt.Sprintf("https://%s/", s.tlsListener.Addr().String())
945 It("Starts the server and serves the handler on http", func() {
947 defer GinkgoRecover()
948 Expect(srv.Start(ctx)).To(Succeed())
951 resp, err := httpGet(ctx, listenAddr)
952 Expect(err).ToNot(HaveOccurred())
953 Expect(resp.StatusCode).To(Equal(http.StatusOK))
955 body, err := io.ReadAll(resp.Body)
956 Expect(err).ToNot(HaveOccurred())
957 Expect(string(body)).To(Equal(hello))
960 It("Starts the server and serves the handler on https", func() {
962 defer GinkgoRecover()
963 Expect(srv.Start(ctx)).To(Succeed())
966 resp, err := httpGet(ctx, secureListenAddr)
967 Expect(err).ToNot(HaveOccurred())
968 Expect(resp.StatusCode).To(Equal(http.StatusOK))
970 body, err := io.ReadAll(resp.Body)
971 Expect(err).ToNot(HaveOccurred())
972 Expect(string(body)).To(Equal(hello))
975 It("Stops both servers when the context is cancelled", func() {
977 defer GinkgoRecover()
978 Expect(srv.Start(ctx)).To(Succeed())
981 _, err := httpGet(ctx, listenAddr)
982 Expect(err).ToNot(HaveOccurred())
983 _, err = httpGet(ctx, secureListenAddr)
984 Expect(err).ToNot(HaveOccurred())
988 Eventually(func() error {
989 _, err := httpGet(ctx, listenAddr)
991 }).Should(HaveOccurred())
992 Eventually(func() error {
993 _, err := httpGet(ctx, secureListenAddr)
995 }).Should(HaveOccurred())
999 Context("with an ipv6 http server", func() {
1000 var listenAddr string
1005 srv, err = NewServer(Opts{
1007 BindAddress: "[::1]:0",
1009 Expect(err).ToNot(HaveOccurred())
1011 s, ok := srv.(*server)
1012 Expect(ok).To(BeTrue())
1014 listenAddr = fmt.Sprintf("http://%s/", s.listener.Addr().String())
1017 It("Starts the server and serves the handler", func() {
1019 defer GinkgoRecover()
1020 Expect(srv.Start(ctx)).To(Succeed())
1023 resp, err := httpGet(ctx, listenAddr)
1024 Expect(err).ToNot(HaveOccurred())
1025 Expect(resp.StatusCode).To(Equal(http.StatusOK))
1027 body, err := io.ReadAll(resp.Body)
1028 Expect(err).ToNot(HaveOccurred())
1029 Expect(string(body)).To(Equal(hello))
1032 It("Stops the server when the context is cancelled", func() {
1034 defer GinkgoRecover()
1035 Expect(srv.Start(ctx)).To(Succeed())
1038 _, err := httpGet(ctx, listenAddr)
1039 Expect(err).ToNot(HaveOccurred())
1043 Eventually(func() error {
1044 _, err := httpGet(ctx, listenAddr)
1046 }).Should(HaveOccurred())
1050 Context("with an ipv6 https server", func() {
1051 var secureListenAddr string
1056 srv, err = NewServer(Opts{
1058 SecureBindAddress: "[::1]:0",
1060 Key: &ipv6KeyDataSource,
1061 Cert: &ipv6CertDataSource,
1064 Expect(err).ToNot(HaveOccurred())
1066 s, ok := srv.(*server)
1067 Expect(ok).To(BeTrue())
1069 secureListenAddr = fmt.Sprintf("https://%s/", s.tlsListener.Addr().String())
1072 It("Starts the server and serves the handler", func() {
1074 defer GinkgoRecover()
1075 Expect(srv.Start(ctx)).To(Succeed())
1078 resp, err := httpGet(ctx, secureListenAddr)
1079 Expect(err).ToNot(HaveOccurred())
1080 Expect(resp.StatusCode).To(Equal(http.StatusOK))
1082 body, err := io.ReadAll(resp.Body)
1083 Expect(err).ToNot(HaveOccurred())
1084 Expect(string(body)).To(Equal(hello))
1087 It("Stops the server when the context is cancelled", func() {
1089 defer GinkgoRecover()
1090 Expect(srv.Start(ctx)).To(Succeed())
1093 _, err := httpGet(ctx, secureListenAddr)
1094 Expect(err).ToNot(HaveOccurred())
1098 Eventually(func() error {
1099 _, err := httpGet(ctx, secureListenAddr)
1101 }).Should(HaveOccurred())
1104 It("Serves the certificate provided", func() {
1106 defer GinkgoRecover()
1107 Expect(srv.Start(ctx)).To(Succeed())
1110 resp, err := httpGet(ctx, secureListenAddr)
1111 Expect(err).ToNot(HaveOccurred())
1112 Expect(resp.StatusCode).To(Equal(http.StatusOK))
1114 Expect(resp.TLS.VerifiedChains).Should(HaveLen(1))
1115 Expect(resp.TLS.VerifiedChains[0]).Should(HaveLen(1))
1116 Expect(resp.TLS.VerifiedChains[0][0].Raw).Should(Equal(ipv6CertData))
1120 Context("with an fd ipv6 http and an ipv6 https server", func() {
1121 var listenAddr, secureListenAddr string
1125 l, err := net.Listen("tcp", "[::1]:0")
1126 Expect(err).ToNot(HaveOccurred())
1127 f, err := l.(*net.TCPListener).File()
1128 Expect(err).ToNot(HaveOccurred())
1130 srv, err = NewServer(Opts{
1132 BindAddress: "fd:3",
1133 fdFiles: []*os.File{f},
1134 SecureBindAddress: "[::1]:0",
1136 Key: &ipv6KeyDataSource,
1137 Cert: &ipv6CertDataSource,
1140 Expect(err).ToNot(HaveOccurred())
1142 s, ok := srv.(*server)
1143 Expect(ok).To(BeTrue())
1145 listenAddr = fmt.Sprintf("http://%s/", l.Addr().String())
1146 secureListenAddr = fmt.Sprintf("https://%s/", s.tlsListener.Addr().String())
1149 It("Starts the server and serves the handler on http", func() {
1151 defer GinkgoRecover()
1152 Expect(srv.Start(ctx)).To(Succeed())
1155 resp, err := httpGet(ctx, listenAddr)
1156 Expect(err).ToNot(HaveOccurred())
1157 Expect(resp.StatusCode).To(Equal(http.StatusOK))
1159 body, err := io.ReadAll(resp.Body)
1160 Expect(err).ToNot(HaveOccurred())
1161 Expect(string(body)).To(Equal(hello))
1164 It("Starts the server and serves the handler on https", func() {
1166 defer GinkgoRecover()
1167 Expect(srv.Start(ctx)).To(Succeed())
1170 resp, err := httpGet(ctx, secureListenAddr)
1171 Expect(err).ToNot(HaveOccurred())
1172 Expect(resp.StatusCode).To(Equal(http.StatusOK))
1174 body, err := io.ReadAll(resp.Body)
1175 Expect(err).ToNot(HaveOccurred())
1176 Expect(string(body)).To(Equal(hello))
1179 It("Stops both servers when the context is cancelled", func() {
1181 defer GinkgoRecover()
1182 Expect(srv.Start(ctx)).To(Succeed())
1185 _, err := httpGet(ctx, listenAddr)
1186 Expect(err).ToNot(HaveOccurred())
1187 _, err = httpGet(ctx, secureListenAddr)
1188 Expect(err).ToNot(HaveOccurred())
1192 Eventually(func() error {
1193 _, err := httpGet(ctx, listenAddr)
1195 }).Should(HaveOccurred())
1196 Eventually(func() error {
1197 _, err := httpGet(ctx, secureListenAddr)
1199 }).Should(HaveOccurred())
1203 Context("with both an ipv6 http and an ipv6 https server", func() {
1204 var listenAddr, secureListenAddr string
1209 srv, err = NewServer(Opts{
1211 BindAddress: "[::1]:0",
1212 SecureBindAddress: "[::1]:0",
1214 Key: &ipv6KeyDataSource,
1215 Cert: &ipv6CertDataSource,
1218 Expect(err).ToNot(HaveOccurred())
1220 s, ok := srv.(*server)
1221 Expect(ok).To(BeTrue())
1223 listenAddr = fmt.Sprintf("http://%s/", s.listener.Addr().String())
1224 secureListenAddr = fmt.Sprintf("https://%s/", s.tlsListener.Addr().String())
1227 It("Starts the server and serves the handler on http", func() {
1229 defer GinkgoRecover()
1230 Expect(srv.Start(ctx)).To(Succeed())
1233 resp, err := httpGet(ctx, listenAddr)
1234 Expect(err).ToNot(HaveOccurred())
1235 Expect(resp.StatusCode).To(Equal(http.StatusOK))
1237 body, err := io.ReadAll(resp.Body)
1238 Expect(err).ToNot(HaveOccurred())
1239 Expect(string(body)).To(Equal(hello))
1242 It("Starts the server and serves the handler on https", func() {
1244 defer GinkgoRecover()
1245 Expect(srv.Start(ctx)).To(Succeed())
1248 resp, err := httpGet(ctx, secureListenAddr)
1249 Expect(err).ToNot(HaveOccurred())
1250 Expect(resp.StatusCode).To(Equal(http.StatusOK))
1252 body, err := io.ReadAll(resp.Body)
1253 Expect(err).ToNot(HaveOccurred())
1254 Expect(string(body)).To(Equal(hello))
1257 It("Stops both servers when the context is cancelled", func() {
1259 defer GinkgoRecover()
1260 Expect(srv.Start(ctx)).To(Succeed())
1263 _, err := httpGet(ctx, listenAddr)
1264 Expect(err).ToNot(HaveOccurred())
1265 _, err = httpGet(ctx, secureListenAddr)
1266 Expect(err).ToNot(HaveOccurred())
1270 Eventually(func() error {
1271 _, err := httpGet(ctx, listenAddr)
1273 }).Should(HaveOccurred())
1274 Eventually(func() error {
1275 _, err := httpGet(ctx, secureListenAddr)
1277 }).Should(HaveOccurred())
1282 Context("getNetworkScheme", func() {
1283 DescribeTable("should return the scheme", func(in, expected string) {
1284 Expect(getNetworkScheme(in)).To(Equal(expected))
1286 Entry("ipv4 address with no scheme", "127.0.0.1:0", "tcp"),
1287 Entry("ipv4 address with a tcp scheme", "tcp://127.0.0.1:0", "tcp"),
1288 Entry("ipv4 address with a http scheme", "http://192.168.0.1:1", "tcp"),
1289 Entry("ipv4 address with a unix scheme", "unix://172.168.16.2:2", "unix"),
1290 Entry("ipv4 address with a random scheme", "random://10.10.10.10:10", "random"),
1291 Entry("ipv6 address with no scheme", "[::1]:0", "tcp"),
1292 Entry("ipv6 address with a tcp scheme", "tcp://[::1]:0", "tcp"),
1293 Entry("ipv6 address with a http scheme", "http://[::ffff:c0a8:1]:1", "tcp"),
1294 Entry("ipv6 address with a unix scheme", "unix://[::ffff:aca8:1002]:2", "unix"),
1295 Entry("ipv6 address with a random scheme", "random://[::ffff:a0a:a0a]:10", "random"),
1299 Context("getListenAddress", func() {
1300 DescribeTable("should remove the scheme", func(in, expected string) {
1301 Expect(getListenAddress(in)).To(Equal(expected))
1303 Entry("ipv4 address with no scheme", "127.0.0.1:0", "127.0.0.1:0"),
1304 Entry("ipv4 address with a tcp scheme", "tcp://127.0.0.1:0", "127.0.0.1:0"),
1305 Entry("ipv4 address with a http scheme", "http://192.168.0.1:1", "192.168.0.1:1"),
1306 Entry("ipv4 address with a unix scheme", "unix://172.168.16.2:2", "172.168.16.2:2"),
1307 Entry("ipv4 address with a random scheme", "random://10.10.10.10:10", "10.10.10.10:10"),
1308 Entry("ipv6 address with no scheme", "[::1]:0", "[::1]:0"),
1309 Entry("ipv6 address with a tcp scheme", "tcp://[::1]:0", "[::1]:0"),
1310 Entry("ipv6 address with a http scheme", "http://[::ffff:c0a8:1]:1", "[::ffff:c0a8:1]:1"),
1311 Entry("ipv6 address with a unix scheme", "unix://[::ffff:aca8:1002]:2", "[::ffff:aca8:1002]:2"),
1312 Entry("ipv6 address with a random scheme", "random://[::ffff:a0a:a0a]:10", "[::ffff:a0a:a0a]:10"),
1317func skipDevContainer() {
1318 if os.Getenv("DEVCONTAINER") != "" {
1319 Skip("Skipping testing in DevContainer environment")
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list