diff --git a/internal/localsend/localsend.go b/internal/localsend/localsend.go index e30e6f5..c0c2b8e 100644 --- a/internal/localsend/localsend.go +++ b/internal/localsend/localsend.go @@ -2,6 +2,7 @@ package localsend import ( "encoding/json" + "fmt" "net" "github.com/0w0mewo/localsend-cli/internal/localsend/constants" @@ -13,41 +14,53 @@ import ( func GetDeviceInfo(ip string, https bool) (models.DeviceInfo, error) { remoteAddr := net.JoinHostPort(ip, "53317") - agent := fiber.AcquireAgent() - defer fiber.ReleaseAgent(agent) - scheme := "http" if https { scheme = "https" } - req := agent.Request() - req.URI().SetScheme(scheme) - req.URI().SetHost(remoteAddr) - req.URI().SetPath(constants.InfoPath) - req.Header.SetMethod(fiber.MethodGet) - err := agent.Parse() - if err != nil { - return models.DeviceInfo{}, err - } + paths := []string{constants.InfoPath, "/api/localsend/v2/info", constants.InfoPathLegacy} + var lastErr error - status, b, errs := agent.InsecureSkipVerify().Bytes() - if len(errs) != 0 { - return models.DeviceInfo{}, errs[0] - } - err = constants.ParseError(status) - if err != nil { - return models.DeviceInfo{}, err - } + for _, path := range paths { + agent := fiber.AcquireAgent() + req := agent.Request() + req.URI().SetScheme(scheme) + req.URI().SetHost(remoteAddr) + req.URI().SetPath(path) + req.Header.SetMethod(fiber.MethodGet) + err := agent.Parse() + if err != nil { + fiber.ReleaseAgent(agent) + return models.DeviceInfo{}, err + } - var res models.DeviceInfo - err = json.Unmarshal(b, &res) - if err != nil { - return models.DeviceInfo{}, err + status, b, errs := agent.InsecureSkipVerify().Bytes() + fiber.ReleaseAgent(agent) + if len(errs) != 0 { + lastErr = errs[0] + continue + } + err = constants.ParseError(status) + if err != nil { + lastErr = err + continue + } + + var res models.DeviceInfo + err = json.Unmarshal(b, &res) + if err != nil { + lastErr = err + continue + } + res.IP = ip + return res, nil } - res.IP = ip - return res, nil + if lastErr == nil { + lastErr = fmt.Errorf("device info not found on known endpoints") + } + return models.DeviceInfo{}, lastErr } func NewFileSender(useDownloadAPI ...bool) send.FileSender {