func TestIPNSHostnameRedirect(t *testing.T) { ns := mockNamesys{} ts, n := newTestServerAndNode(t, ns) t.Logf("test server url: %s", ts.URL) defer ts.Close() // create /ipns/example.net/foo/index.html _, dagn1, err := coreunix.AddWrapped(n, strings.NewReader("_"), "_") if err != nil { t.Fatal(err) } _, dagn2, err := coreunix.AddWrapped(n, strings.NewReader("_"), "index.html") if err != nil { t.Fatal(err) } dagn1.AddNodeLink("foo", dagn2) if err != nil { t.Fatal(err) } err = n.DAG.AddRecursive(dagn1) if err != nil { t.Fatal(err) } k, err := dagn1.Key() if err != nil { t.Fatal(err) } t.Logf("k: %s\n", k) ns["/ipns/example.net"] = path.FromString("/ipfs/" + k.String()) // make request to directory containing index.html req, err := http.NewRequest("GET", ts.URL+"/foo", nil) if err != nil { t.Fatal(err) } req.Host = "example.net" res, err := doWithoutRedirect(req) if err != nil { t.Fatal(err) } // expect 302 redirect to same path, but with trailing slash if res.StatusCode != 302 { t.Errorf("status is %d, expected 302", res.StatusCode) } hdr := res.Header["Location"] if len(hdr) < 1 { t.Errorf("location header not present") } else if hdr[0] != "/foo/" { t.Errorf("location header is %v, expected /foo/", hdr[0]) } }
func TestIPNSHostnameBacklinks(t *testing.T) { ns := mockNamesys{} ts, n := newTestServerAndNode(t, ns) t.Logf("test server url: %s", ts.URL) defer ts.Close() // create /ipns/example.net/foo/ _, dagn1, err := coreunix.AddWrapped(n, strings.NewReader("1"), "file.txt") if err != nil { t.Fatal(err) } _, dagn2, err := coreunix.AddWrapped(n, strings.NewReader("2"), "file.txt") if err != nil { t.Fatal(err) } _, dagn3, err := coreunix.AddWrapped(n, strings.NewReader("3"), "file.txt") if err != nil { t.Fatal(err) } dagn2.AddNodeLink("bar", dagn3) dagn1.AddNodeLink("foo", dagn2) if err != nil { t.Fatal(err) } err = n.DAG.AddRecursive(dagn1) if err != nil { t.Fatal(err) } k, err := dagn1.Key() if err != nil { t.Fatal(err) } t.Logf("k: %s\n", k) ns["/ipns/example.net"] = path.FromString("/ipfs/" + k.String()) // make request to directory listing req, err := http.NewRequest("GET", ts.URL+"/foo/", nil) if err != nil { t.Fatal(err) } req.Host = "example.net" res, err := doWithoutRedirect(req) if err != nil { t.Fatal(err) } // expect correct backlinks body, err := ioutil.ReadAll(res.Body) if err != nil { t.Fatalf("error reading response: %s", err) } s := string(body) t.Logf("body: %s\n", string(body)) if !strings.Contains(s, "Index of /foo/") { t.Fatalf("expected a path in directory listing") } if !strings.Contains(s, "<a href=\"/\">") { t.Fatalf("expected backlink in directory listing") } if !strings.Contains(s, "<a href=\"/foo/file.txt\">") { t.Fatalf("expected file in directory listing") } // make request to directory listing req, err = http.NewRequest("GET", ts.URL, nil) if err != nil { t.Fatal(err) } req.Host = "example.net" res, err = doWithoutRedirect(req) if err != nil { t.Fatal(err) } // expect correct backlinks body, err = ioutil.ReadAll(res.Body) if err != nil { t.Fatalf("error reading response: %s", err) } s = string(body) t.Logf("body: %s\n", string(body)) if !strings.Contains(s, "Index of /") { t.Fatalf("expected a path in directory listing") } if !strings.Contains(s, "<a href=\"/\">") { t.Fatalf("expected backlink in directory listing") } if !strings.Contains(s, "<a href=\"/file.txt\">") { t.Fatalf("expected file in directory listing") } // make request to directory listing req, err = http.NewRequest("GET", ts.URL+"/foo/bar/", nil) if err != nil { t.Fatal(err) } req.Host = "example.net" res, err = doWithoutRedirect(req) if err != nil { t.Fatal(err) } // expect correct backlinks body, err = ioutil.ReadAll(res.Body) if err != nil { t.Fatalf("error reading response: %s", err) } s = string(body) t.Logf("body: %s\n", string(body)) if !strings.Contains(s, "Index of /foo/bar/") { t.Fatalf("expected a path in directory listing") } if !strings.Contains(s, "<a href=\"/foo/\">") { t.Fatalf("expected backlink in directory listing") } if !strings.Contains(s, "<a href=\"/foo/bar/file.txt\">") { t.Fatalf("expected file in directory listing") } }