From ae310a207534b33b7321dd2b9f423a73b1969159 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Mon, 14 Sep 2026 14:28:15 -0300 Subject: Add reusable HTTP transport, serial gateway, and WASM file browser --- test/differential/webfixture/main.go | 83 ++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 test/differential/webfixture/main.go (limited to 'test/differential') diff --git a/test/differential/webfixture/main.go b/test/differential/webfixture/main.go new file mode 100644 index 0000000..9d23399 --- /dev/null +++ b/test/differential/webfixture/main.go @@ -0,0 +1,83 @@ +// Local reference filesystem for HTTP/browser tests. No external target. +package main + +import ( + "fmt" + "github.com/knusbaum/go9p" + "github.com/knusbaum/go9p/fs" + "net" + "os" +) + +type fragmented struct{ net.Conn } + +func (f fragmented) Read(p []byte) (int, error) { + if len(p) > 17 { + p = p[:17] + } + return f.Conn.Read(p) +} +func (f fragmented) Write(p []byte) (int, error) { + total := 0 + for len(p) > 0 { + n := len(p) + if n > 31 { + n = 31 + } + written, err := f.Conn.Write(p[:n]) + total += written + p = p[written:] + if err != nil { + return total, err + } + } + return total, nil +} +func check(err error) { + if err != nil { + panic(err) + } +} +func main() { + tree, root := fs.NewFS("user", "user", 0755) + check(root.AddChild(fs.NewStaticFile(tree.NewStat("hello.txt", "user", "user", 0644), []byte("Hello from 9P.\n")))) + check(root.AddChild(fs.NewStaticFile(tree.NewStat("edit.txt", "user", "user", 0644), []byte("Edit me.\n")))) + large := make([]byte, 180000) + for i := range large { + large[i] = byte(i % 251) + } + check(root.AddChild(fs.NewStaticFile(tree.NewStat("large.bin", "user", "user", 0644), large))) + check(root.AddChild(fs.NewStaticFile(tree.NewStat(".txt", "user", "user", 0644), []byte("Names are text.\n")))) + for _, name := range []string{"app.mjs", "style.css", "client.mjs", "config.json", "cloud9.wasm", "9p", "space #?% ü.txt", "literal%2F.txt", "back\\slash.txt"} { + check(root.AddChild(fs.NewStaticFile(tree.NewStat(name, "user", "user", 0644), []byte("Path: "+name+"\n")))) + } + internal := fs.NewStaticDir(tree.NewStat("_cloud9", "user", "user", 0755)) + check(root.AddChild(internal)) + check(internal.AddChild(fs.NewStaticFile(tree.NewStat("app.mjs", "user", "user", 0644), []byte("Upstream private-looking path.\n")))) + dir := fs.NewStaticDir(tree.NewStat("notes", "user", "user", 0755)) + check(root.AddChild(dir)) + check(dir.AddChild(fs.NewStaticFile(tree.NewStat("café.txt", "user", "user", 0644), []byte("Olá, 世界.\n")))) + for i := 0; i < 150; i++ { + name := fmt.Sprintf("item-%03d.txt", i) + check(dir.AddChild(fs.NewStaticFile(tree.NewStat(name, "user", "user", 0644), nil))) + } + parent := root + for i := 0; i < 18; i++ { + d := fs.NewStaticDir(tree.NewStat("deep", "user", "user", 0755)) + check(parent.AddChild(d)) + parent = d + } + check(parent.AddChild(fs.NewStaticFile(tree.NewStat("end.txt", "user", "user", 0644), []byte("Deep walk.\n")))) + network, address := "tcp", "127.0.0.1:0" + if len(os.Args) == 2 { + network, address = "unix", os.Args[1] + } + listener, err := net.Listen(network, address) + check(err) + fmt.Println(listener.Addr().String()) + for { + conn, err := listener.Accept() + check(err) + go func() { defer conn.Close(); f := fragmented{conn}; _ = go9p.ServeReadWriter(f, f, tree.Server()) }() + } +} -- cgit v1.3