package main import ( "encoding/json" "fmt" "io" "io/fs" "mime/multipart" "net/http" "os" "path/filepath" "strings" "github.com/sethvargo/go-githubactions" ) type AddResponse struct { Bytes int64 Hash string Name string Size string } func main() { // Check inputs path := githubactions.GetInput("path_to_add") if path == "" { githubactions.Fatalf("Missing: path_to_add") } ipfsHost := githubactions.GetInput("ipfs_host") if ipfsHost == "" { githubactions.Fatalf("Missing: ipfs_host") } ipfsPort := githubactions.GetInput("ipfs_port") if ipfsPort == "" { githubactions.Fatalf("Missing: ipfs_port") } token := githubactions.GetInput("ipfs_token") if token == "" { githubactions.Fatalf("Missing: ipfs_token") } targetPath, err := os.Open(path) if err != nil { githubactions.Fatalf("Unable to access path_to_add: %v", err.Error()) } defer targetPath.Close() targetPathInfo, err := targetPath.Stat() if err != nil { githubactions.Fatalf("Unable to access to access path_to_add info: %v", fmt.Errorf("%w", err)) } if !targetPathInfo.IsDir() { githubactions.Fatalf("%v is not a directory", path) } body, writer := io.Pipe() // TODO: URL req, err := http.NewRequest(http.MethodPost, "ipfs.narwhal-frog.ts.net", body) if err != nil { githubactions.Fatalf("Unable to create request: %v", err.Error()) } go func() { defer writer.Close() mwriter := multipart.NewWriter(writer) req.Header.Add("Content-Type", mwriter.FormDataContentType()) err = filepath.Walk(path, func(innerPath string, info fs.FileInfo, err error) error { if err != nil { return err } relativeParh := strings.TrimPrefix(innerPath, path) w, err := mwriter.CreateFormFile("file", relativeParh) if err != nil { return err } in, err := os.Open(innerPath) if err != nil { return err } defer in.Close() if written, err := io.Copy(w, in); err != nil { return fmt.Errorf("error copying %s (%d bytes written): %v", path, written, err) } if err := mwriter.Close(); err != nil { return err } return nil }) if err != nil { githubactions.Fatalf("Unable to create request body : %v", fmt.Errorf("%w", err)) } }() client := &http.Client{} res, err := client.Do(req) resBody, err := io.ReadAll(res.Body) if err != nil { panic(err.Error()) } var ipfsAddResponse AddResponse json.Unmarshal(resBody, &ipfsAddResponse) fmt.Println(ipfsAddResponse.Hash) }