Compare commits
2 Commits
97e0a69474
...
7030386beb
Author | SHA1 | Date | |
---|---|---|---|
7030386beb | |||
ac318177e9 |
3
README.md
Normal file
3
README.md
Normal 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
51
ipfsnodepin/writer.go
Normal 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
49
main.go
@ -5,14 +5,11 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/fs"
|
||||
"mime/multipart"
|
||||
"net/http"
|
||||
"net/textproto"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"gitea.bruyant.xyz/alexandre/ipfs-node-pin/ipfsnodepin"
|
||||
"github.com/sethvargo/go-githubactions"
|
||||
)
|
||||
|
||||
@ -23,48 +20,8 @@ type AddResponse struct {
|
||||
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() {
|
||||
|
||||
githubactions.Debugf("Checking inputs")
|
||||
|
||||
path := githubactions.GetInput("path_to_add")
|
||||
@ -112,7 +69,7 @@ func main() {
|
||||
q.Add("stream-true", "false")
|
||||
req.URL.RawQuery = q.Encode()
|
||||
|
||||
mwriter := NewIpfsMultipartWriter(writer)
|
||||
mwriter := ipfsnodepin.NewIpfsMultipartWriter(writer)
|
||||
req.Header.Add("Content-Type", mwriter.FormDataContentType())
|
||||
|
||||
go func() {
|
||||
|
Loading…
Reference in New Issue
Block a user