@@ -584,6 +584,47 @@ func TestHttpGetter__XTerraformGetDisabled(t *testing.T) {
584
584
}
585
585
}
586
586
587
+ type testCustomDetector struct {}
588
+
589
+ func (testCustomDetector ) Detect (src , _ string ) (string , bool , error ) {
590
+ if strings .HasPrefix (src , "custom|" ) {
591
+ return "http://" + src [7 :], true , nil
592
+ }
593
+ return "" , false , nil
594
+ }
595
+
596
+ // test a source url with no protocol
597
+ func TestHttpGetter__XTerraformGetDetected (t * testing.T ) {
598
+ ctx , cancel := context .WithCancel (context .Background ())
599
+ defer cancel ()
600
+
601
+ ln := testHttpServerWithXTerraformGetDetected (t )
602
+
603
+ var u url.URL
604
+ u .Scheme = "http"
605
+ u .Host = ln .Addr ().String ()
606
+ u .Path = "/first"
607
+ dst := tempDir (t )
608
+
609
+ c := & Client {
610
+ Ctx : ctx ,
611
+ Src : u .String (),
612
+ Dst : dst ,
613
+ Mode : ClientModeDir ,
614
+ Options : []ClientOption {
615
+ func (c * Client ) error {
616
+ c .Detectors = append (c .Detectors , testCustomDetector {})
617
+ return nil
618
+ },
619
+ },
620
+ }
621
+
622
+ err := c .Get ()
623
+ if err != nil {
624
+ t .Fatal (err )
625
+ }
626
+ }
627
+
587
628
func TestHttpGetter__XTerraformGetProxyBypass (t * testing.T ) {
588
629
ctx , cancel := context .WithCancel (context .Background ())
589
630
defer cancel ()
@@ -696,7 +737,6 @@ func TestHttpGetter__endless_body(t *testing.T) {
696
737
client := & Client {
697
738
Ctx : ctx ,
698
739
Mode : ClientModeFile ,
699
- // Mode: ClientModeDir,
700
740
Getters : map [string ]Getter {
701
741
"http" : httpGetter ,
702
742
},
@@ -770,6 +810,36 @@ func testHttpServerWithXTerraformGetLoop(t *testing.T) net.Listener {
770
810
return ln
771
811
}
772
812
813
+ func testHttpServerWithXTerraformGetDetected (t * testing.T ) net.Listener {
814
+ t .Helper ()
815
+
816
+ ln , err := net .Listen ("tcp" , "127.0.0.1:0" )
817
+ if err != nil {
818
+ t .Fatalf ("err: %s" , err )
819
+ }
820
+
821
+ // This location requires a custom detector to work.
822
+ first := fmt .Sprintf ("custom|%s/archive.tar.gz" , ln .Addr ())
823
+
824
+ mux := http .NewServeMux ()
825
+ mux .HandleFunc ("/first" , func (w http.ResponseWriter , r * http.Request ) {
826
+ w .Header ().Set ("X-Terraform-Get" , first )
827
+ })
828
+ mux .HandleFunc ("/archive.tar.gz" , func (w http.ResponseWriter , r * http.Request ) {
829
+ f , err := ioutil .ReadFile ("testdata/archive.tar.gz" )
830
+ if err != nil {
831
+ t .Fatal (err )
832
+ }
833
+ w .Write (f )
834
+ })
835
+
836
+ var server http.Server
837
+ server .Handler = mux
838
+ go server .Serve (ln )
839
+
840
+ return ln
841
+ }
842
+
773
843
func testHttpServerWithXTerraformGetProxyBypass (t * testing.T ) net.Listener {
774
844
t .Helper ()
775
845
0 commit comments