Compare commits

...

2 Commits

Author SHA1 Message Date
7030386beb Move ipfsMultipartWriter to package
All checks were successful
Create and publish a Docker image / build-and-push-image (push) Successful in 1m21s
2024-01-08 12:25:24 +01:00
ac318177e9 README 2024-01-08 12:18:48 +01:00
3 changed files with 57 additions and 46 deletions

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# ipfs-node-pin
Pin a directory to an IPFS node through its RPC API.

51
ipfsnodepin/writer.go Normal file
View File

@ -0,0 +1,51 @@
package ipfsnodepin
import (
"fmt"
"io"
"mime/multipart"
"net/textproto"
"net/url"
"strings"
)
type IpfsMultipartWriter struct {
multipart.Writer
}
var quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"")
func escapeQuotes(s string) string {
return quoteEscaper.Replace(s)
}
func NewIpfsMultipartWriter(w io.Writer) *IpfsMultipartWriter {
return &IpfsMultipartWriter{
Writer: *multipart.NewWriter(w),
}
}
func (w *IpfsMultipartWriter) CreateIpfsDirectoryPart(name string) (io.Writer, error) {
h := make(textproto.MIMEHeader)
encodedName := url.QueryEscape(name)
h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file"; filename="%s"`, encodedName))
h.Set("Content-Type", "application/x-directory")
return w.CreatePart(h)
}
func (w *IpfsMultipartWriter) CreateIpfsFilePart(name string) (io.Writer, error) {
h := make(textproto.MIMEHeader)
encodedName := url.QueryEscape(name)
h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file"; filename="%s"`, escapeQuotes(encodedName)))
h.Set("Content-Type", "application/octet-stream")
return w.CreatePart(h)
}
func (w *IpfsMultipartWriter) CreateIpfsAbsFilePart(name, absPath string) (io.Writer, error) {
h := make(textproto.MIMEHeader)
encodedName := url.QueryEscape(name)
h.Set("AbsPath", absPath)
h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file"; filename="%s"`, escapeQuotes(encodedName)))
h.Set("Content-Type", "application/octet-stream")
return w.CreatePart(h)
}

49
main.go
View File

@ -5,14 +5,11 @@ import (
"fmt" "fmt"
"io" "io"
"io/fs" "io/fs"
"mime/multipart"
"net/http" "net/http"
"net/textproto"
"net/url"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"gitea.bruyant.xyz/alexandre/ipfs-node-pin/ipfsnodepin"
"github.com/sethvargo/go-githubactions" "github.com/sethvargo/go-githubactions"
) )
@ -23,48 +20,8 @@ type AddResponse struct {
Size string Size string
} }
type IpfsMultipartWriter struct {
multipart.Writer
}
var quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"")
func escapeQuotes(s string) string {
return quoteEscaper.Replace(s)
}
func NewIpfsMultipartWriter(w io.Writer) *IpfsMultipartWriter {
return &IpfsMultipartWriter{
Writer: *multipart.NewWriter(w),
}
}
func (w *IpfsMultipartWriter) CreateIpfsDirectoryPart(name string) (io.Writer, error) {
h := make(textproto.MIMEHeader)
encodedName := url.QueryEscape(name)
h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file"; filename="%s"`, encodedName))
h.Set("Content-Type", "application/x-directory")
return w.CreatePart(h)
}
func (w *IpfsMultipartWriter) CreateIpfsFilePart(name string) (io.Writer, error) {
h := make(textproto.MIMEHeader)
encodedName := url.QueryEscape(name)
h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file"; filename="%s"`, escapeQuotes(encodedName)))
h.Set("Content-Type", "application/octet-stream")
return w.CreatePart(h)
}
func (w *IpfsMultipartWriter) CreateIpfsAbsFilePart(name, absPath string) (io.Writer, error) {
h := make(textproto.MIMEHeader)
encodedName := url.QueryEscape(name)
h.Set("AbsPath", absPath)
h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file"; filename="%s"`, escapeQuotes(encodedName)))
h.Set("Content-Type", "application/octet-stream")
return w.CreatePart(h)
}
func main() { func main() {
githubactions.Debugf("Checking inputs") githubactions.Debugf("Checking inputs")
path := githubactions.GetInput("path_to_add") path := githubactions.GetInput("path_to_add")
@ -112,7 +69,7 @@ func main() {
q.Add("stream-true", "false") q.Add("stream-true", "false")
req.URL.RawQuery = q.Encode() req.URL.RawQuery = q.Encode()
mwriter := NewIpfsMultipartWriter(writer) mwriter := ipfsnodepin.NewIpfsMultipartWriter(writer)
req.Header.Add("Content-Type", mwriter.FormDataContentType()) req.Header.Add("Content-Type", mwriter.FormDataContentType())
go func() { go func() {