forxer/ovh-sdk
forxer/ovh-sdk is a PHP client for the OVH API that handles authentication, request signing, and responses behind a clean, Laravel-friendly interface, making it easy to manage domains, servers, and cloud resources directly from your application code.
CouldNotDecodeResponse (non-JSON/empty body, JsonException available via getPrevious()) is now cleanly separable from CouldNotReadResponse (valid JSON, wrong shape). This lets us specify a retry policy that retries only malformed/empty-body responses and fails fast on wrong-shape responses, rather than blanket-retrying all read failures.JsonException or TypeError from responses. Any service catching those must migrate to CouldNotDecodeResponse / CouldNotReadResponse. Roadmap item: audit and patch catch blocks, add regression tests, ship before we pin the dependency.GET /auth/time fix removes a silent failure mode where a non-integer time was read as 0, producing a wrong cached time delta for an hour and failing the signature of every request. For cron-driven DNS task polling, this converts an hour-long outage class into an immediate, diagnosable exception — a strong argument for adopting the release rather than staying on 0.4.x.tasks()->ids() / tasks()->list() now reject TaskStatus::Problem client-side with CouldNotFilterZoneTasks instead of round-tripping to a 400 Invalid inputs. Product decision: our own UI/API must not offer "Problem" as a task filter option; document that Problem can still appear as a returned status, so read paths need to handle it.problem. This upstream contract test is a signal we can lean on rather than duplicating, and a hint that OVHcloud's published schema and actual behaviour diverge.Consider adoption when:
CouldNotDecodeResponse before CouldNotReadResponse, and you can drop any catch (JsonException) or TypeError reliance on responses.problem as a filter) rather than surfacing an opaque BadRequestException from the provider.Look elsewhere or defer when:
problem filter guard is a workaround for an OVHcloud schema/reality mismatch, so behaviour may need to change again if OVHcloud fixes or re-documents it.For executives: This release hardens the OVHcloud integration we would otherwise build and maintain ourselves. Its most valuable change is a reliability fix: a server-time parsing bug that could silently break every signed request for up to an hour is now a loud, immediate error. The rest is stricter, more honest error reporting — an empty or malformed response can no longer be mistaken for "nothing to do," which is exactly the kind of false success that causes missed DNS changes in production. Cost is a one-time migration of error-handling code; benefit is fewer silent outages and clearer incident diagnosis.
For engineering: 0.5.0 is a breaking change to the error contract, not a feature drop. Three migrations are required: (1) replace catch (JsonException) on responses with catch (CouldNotDecodeResponse) — the JsonException is still reachable via getPrevious(); (2) replace reliance on TypeError for scalar-where-object/list responses with catch (CouldNotReadResponse); (3) stop passing TaskStatus::Problem to tasks()->ids()/list() — it now throws CouldNotFilterZoneTasks (an InvalidArgumentException) before any HTTP call. Note the asymmetry: Problem is invalid as a filter but still valid as a returned status, so read paths must handle it. Order your catch blocks CouldNotDecodeResponse → CouldNotReadResponse and retry only the former. Also expect an empty body on a list route to throw rather than return [], and object routes returning JSON lists to report a shape error instead of a missing-field error — both will surface latent assumptions in existing tests. The upstream live suite now pins the problem-filter refusal, so we can treat that as an externally verified contract and drop our own duplicate test. Recommendation: adopt 0.5.0, pin the version, and schedule the exception-catch audit as a small, well-scoped task rather than deferring — staying on 0.4.x keeps the auth time-skew failure mode live.
How can I help you explore Laravel packages today?