@@ -584,6 +584,47 @@ func TestHttpGetter__XTerraformGetDisabled(t *testing.T) {
584584 }
585585}
586586
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+
587628func TestHttpGetter__XTerraformGetProxyBypass (t * testing.T ) {
588629 ctx , cancel := context .WithCancel (context .Background ())
589630 defer cancel ()
@@ -696,7 +737,6 @@ func TestHttpGetter__endless_body(t *testing.T) {
696737 client := & Client {
697738 Ctx : ctx ,
698739 Mode : ClientModeFile ,
699- // Mode: ClientModeDir,
700740 Getters : map [string ]Getter {
701741 "http" : httpGetter ,
702742 },
@@ -770,6 +810,36 @@ func testHttpServerWithXTerraformGetLoop(t *testing.T) net.Listener {
770810 return ln
771811}
772812
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+
773843func testHttpServerWithXTerraformGetProxyBypass (t * testing.T ) net.Listener {
774844 t .Helper ()
775845
0 commit comments