mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-21 10:27:46 +08:00
feat: update the error parsing for go-ipld-format to v0.4.0
This commit was moved from ipfs/go-ipfs-http-client@296534fd16
This commit is contained in:
parent
a2a60768ea
commit
ddd36645b2
@ -45,6 +45,18 @@ func parseIPLDNotFoundWithFallbackToError(msg error) error {
|
||||
return msg
|
||||
}
|
||||
|
||||
// Use a string to move it into RODATA
|
||||
// print("".join("\\x01" if chr(i) not in string.ascii_letters + string.digits else "\\x00" for i in range(ord('z')+1)))
|
||||
const notAsciiLetterOrDigitsLUT = "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
|
||||
func notAsciiLetterOrDigits(r rune) bool {
|
||||
if r > 'z' {
|
||||
return true
|
||||
}
|
||||
|
||||
return notAsciiLetterOrDigitsLUT[r] > 0
|
||||
}
|
||||
|
||||
// This file handle parsing and returning the correct ABI based errors from error messages
|
||||
//lint:ignore ST1008 this function is not using the error as a mean to return failure but it massages it to return the correct type
|
||||
func parseIPLDNotFound(msg string) (error, bool) {
|
||||
@ -53,46 +65,46 @@ func parseIPLDNotFound(msg string) (error, bool) {
|
||||
}
|
||||
|
||||
// The patern we search for is:
|
||||
// node not found (fallback)
|
||||
// or
|
||||
// CID not found (here we parse the CID)
|
||||
notFoundIndex := strings.LastIndex(msg, " not found")
|
||||
const ipldErrNotFoundKey = "ipld: could not find " /*CID*/
|
||||
// We try to parse the CID, if it's invalid we give up and return a simple text error.
|
||||
// We also accept "node" in place of the CID because that means it's an Undefined CID.
|
||||
|
||||
if notFoundIndex == -1 {
|
||||
// Unknown, ot found not found
|
||||
keyIndex := strings.Index(msg, ipldErrNotFoundKey)
|
||||
|
||||
if keyIndex < 0 { // Unknown error
|
||||
return nil, false
|
||||
}
|
||||
|
||||
preNotFound := msg[:notFoundIndex]
|
||||
cidStart := keyIndex + len(ipldErrNotFoundKey)
|
||||
|
||||
msgPostKey := msg[cidStart:]
|
||||
var c cid.Cid
|
||||
var preIndex int
|
||||
if strings.HasSuffix(preNotFound, "node") {
|
||||
var postIndex int
|
||||
if strings.HasPrefix(msgPostKey, "node") {
|
||||
// Fallback case
|
||||
c = cid.Undef
|
||||
preIndex = notFoundIndex - len("node")
|
||||
postIndex = len("node")
|
||||
} else {
|
||||
// Assume that CIDs does not include whitespace to pull out the CID
|
||||
preIndex = strings.LastIndexByte(preNotFound, ' ')
|
||||
// + 1 is to normalise not founds to zeros and point to the start of the CID, not the previous space
|
||||
preIndex++
|
||||
// Assume that CIDs only contain a-zA-Z0-9 characters.
|
||||
// This is true because go-ipld-format use go-cid#Cid.String which use base{3{2,6},58}.
|
||||
postIndex = strings.IndexFunc(msgPostKey, notAsciiLetterOrDigits)
|
||||
if postIndex < 0 {
|
||||
postIndex = len(msgPostKey)
|
||||
}
|
||||
|
||||
var err error
|
||||
c, err = cid.Decode(preNotFound[preIndex:])
|
||||
c, err = cid.Decode(msgPostKey[:postIndex])
|
||||
if err != nil {
|
||||
// Unknown
|
||||
return nil, false
|
||||
}
|
||||
}
|
||||
|
||||
postIndex := notFoundIndex + len(" not found")
|
||||
|
||||
err := ipld.ErrNotFound{Cid: c}
|
||||
|
||||
pre := msg[:preIndex]
|
||||
post := msg[postIndex:]
|
||||
pre := msg[:keyIndex]
|
||||
post := msgPostKey[postIndex:]
|
||||
|
||||
if len(pre) > 0 || len(post) > 0 {
|
||||
// We have some text to wrap arround the ErrNotFound one
|
||||
return prePostWrappedNotFoundError{
|
||||
pre: pre,
|
||||
post: post,
|
||||
|
||||
@ -3,6 +3,7 @@ package httpapi
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/ipfs/go-cid"
|
||||
@ -42,9 +43,8 @@ func TestParseIPLDNotFound(t *testing.T) {
|
||||
"%w is wrong",
|
||||
} {
|
||||
for _, err := range [...]error{
|
||||
errors.New("file not found"),
|
||||
errors.New(" not found"),
|
||||
errors.New("Bad_CID not found"),
|
||||
errors.New("ipld: could not find "),
|
||||
errors.New("ipld: could not find Bad_CID"),
|
||||
errors.New("network connection timeout"),
|
||||
ipld.ErrNotFound{Cid: cid.Undef},
|
||||
ipld.ErrNotFound{Cid: cid.NewCidV0(randomSha256MH)},
|
||||
@ -58,3 +58,11 @@ func TestParseIPLDNotFound(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestNotAsciiLetterOrDigits(t *testing.T) {
|
||||
for i := rune(0); i <= 256; i++ {
|
||||
if notAsciiLetterOrDigits(i) != !strings.ContainsAny(string(i), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") {
|
||||
t.Errorf("%q is incorrectly identified", i)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user