Skip to content

Commit

Permalink
Add gateway URL parser
Browse files Browse the repository at this point in the history
Allows HTTP gateway urls as arguments
  • Loading branch information
djdv committed Feb 4, 2019
1 parent 796cbc7 commit 877795e
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 10 deletions.
33 changes: 23 additions & 10 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import (
"fmt"
"os"
"os/signal"
"regexp"
"strings"
"syscall"

path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path"
ipath "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path"
fallback "gx/ipfs/QmaWDhoQaV6cDyy6NSKFgPaUAGRtb4SMiLpaDYEsxP7X8P/fallback-ipfs-shell"
cli "gx/ipfs/Qmc1AtgBdoUHP8oYSqU81NRYdzohmF45t5XNwVMvhCxsBA/cli"
)
Expand Down Expand Up @@ -36,21 +37,19 @@ func main() {
}

outfile := c.String("output")
arg := c.Args().First()
inPath, err := parsePath(c.Args().First())
if err != nil {
fmt.Fprintf(os.Stderr, "Argument parse failure: %s\n", err)
os.Exit(1)
}

// Use the final segment of the object's path if no path was given.
if outfile == "" {
ipfsPath, err := path.ParsePath(arg)
if err != nil {
fmt.Fprintf(os.Stderr, "ParsePath failure: %s\n", err)
os.Exit(1)
}
segments := ipfsPath.Segments()
segments := inPath.Segments()
outfile = segments[len(segments)-1]
}

var shell fallback.Shell
var err error

if c.String("node") == "fallback" {
shell, err = fallback.NewShell()
Expand All @@ -76,7 +75,7 @@ func main() {
return nil
}

if err := shell.Get(arg, outfile); err != nil {
if err := shell.Get(inPath.String(), outfile); err != nil {
os.Remove(outfile)
fmt.Fprintf(os.Stderr, "ipget failed: %s\n", err)
os.Exit(2)
Expand Down Expand Up @@ -132,3 +131,17 @@ func movePostfixOptions(args []string) []string {
// append extracted arguments to the real args
return append(args, the_args...)
}

func parsePath(path string) (ipath.Path, error) {
ipfsPath, err := ipath.ParsePath(path)
if err == nil { // valid canonical path
return ipfsPath, nil
}
// allow HTTP gateway URLs as input as well
matches := regexp.MustCompile(`^https?.*(/(ipfs|ipns|ipld)/.+)$`).FindStringSubmatch(path)
if len(matches) < 1 {
return "", fmt.Errorf("%q does not appear to be a valid IPFS path or HTTP gateway URL", path)
}

return ipath.ParsePath(matches[1])
}
24 changes: 24 additions & 0 deletions sharness/t0030-arguments.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/bin/sh

test_description="test the ipget argument parser"

. ./lib/sharness/sharness.sh

test_expect_success "retrieve a known popular single file with a gateway URL" "
ipget http://ipfs.io/ipfs/QmQ2r6iMNpky5f1m4cnm3Yqw8VSvjuKpTcK1X7dBR1LkJF/cat.gif &&
echo 'c5ea0d6cacf1e54635685803ec4edbe0d4fe8465' > expected &&
shasum cat.gif | cut -d ' ' -f 1 > actual &&
diff expected actual
"

test_expect_failure "don't allow non-standard URLS" "
ipget ftp://ipfs.io/ipfs/QmQ2r6iMNpky5f1m4cnm3Yqw8VSvjuKpTcK1X7dBR1LkJF/cat.gif
"

test_expect_success "retrieve a directory" "
ipget --node=spawn QmQ2r6iMNpky5f1m4cnm3Yqw8VSvjuKpTcK1X7dBR1LkJF &&
ls QmQ2r6iMNpky5f1m4cnm3Yqw8VSvjuKpTcK1X7dBR1LkJF > /dev/null &&
ls QmQ2r6iMNpky5f1m4cnm3Yqw8VSvjuKpTcK1X7dBR1LkJF/cat.gif > /dev/null
"

test_done

0 comments on commit 877795e

Please sign in to comment.