Account sign-up fatals when the Optimole API returns an empty or non-JSON response
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 85/100
Línea de trabajo
Lee inc/rest.php alrededor de las líneas 467-482, donde register_service() trata false como un WP_Error, y compáralo con los hermanos protegidos connect() y select_application() cerca de las líneas 377-390. Revisa inc/api.php en las líneas 180-191 y 217-228 para confirmar las rutas en las que request() devuelve false. Reproduce el problema con el fragmento de WP-CLI o con la llamada stubbed a register_service(), luego haz que las llamadas a los métodos de error sean condicionales a is_wp_error() y devuelve la respuesta simple "Error creating account." para false. Está terminado cuando los casos de cuerpo vacío, HTML 502, sin code y no 200 sin error devuelven todos code: error, mientras la rama de WP_Error sigue comportándose como antes.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Description
When an admin creates an Optimole account from the plugin dashboard (POST /optml/v1/register_service), Optml_Api::request() returns false if the API answers with an empty body, a non-JSON body (for example a proxy's HTML 502 page), JSON without a code key, or a non-200 code without an error key.
register_service() sends false into the same branch as WP_Error and calls $user->get_error_code() on it. This throws Error: Call to a member function get_error_code() on false. WordPress then returns a 500 "There has been a critical error on this website." and the dashboard shows its generic REST error instead of "Error creating account.".
Expected: when the API returns false, the endpoint should return the normal code: error response ("Error creating account."), as it did up to 3.11.3 and as connect() and select_application() already do.
Step-by-step reproduction instructions
- On a test site with Optimole 4.2.17 active and not connected, run this command. It fakes an empty 502 reply from the account API through
pre_http_request, so no real request is sent. Replace1with an administrator's user ID.wp eval ' add_filter( "pre_http_request", function ( $pre, $args, $url ) { return false !== strpos( $url, "complete_register_remote" ) ? [ "headers" => [], "body" => "", "response" => [ "code" => 502, "message" => "Bad Gateway" ], "cookies" => [], "filename" => null ] : $pre; }, 10, 3 ); wp_set_current_user( 1 ); $r = new WP_REST_Request( "POST", "/optml/v1/register_service" ); $r->set_param( "email", "[email protected]" ); var_dump( rest_do_request( $r )->get_data() ); ' - Result:
PHP Fatal error: Uncaught Error: Call to a member function get_error_code() on false in .../inc/rest.php:468. - Expected: an array with
code => errorandmessage => "Error creating account.". - Same outcome without WP-CLI: I loaded the real
inc/api.phpandinc/rest.phpfrom v4.2.17 with WordPress functions stubbed and calledregister_service()with canned API bodies (PHP 8.4.19):== empty body == UNCAUGHT Error: Call to a member function get_error_code() on false at rest.php:468 == HTML 502 page from a proxy == UNCAUGHT Error: Call to a member function get_error_code() on false at rest.php:468 == JSON without code == UNCAUGHT Error: Call to a member function get_error_code() on false at rest.php:468 == JSON code 500, no error key == UNCAUGHT Error: Call to a member function get_error_code() on false at rest.php:468 == control: JSON code 400 with error == returned WP_REST_Response {"data":null,"message":"Error creating account. Some API error","code":"error"}
Screenshots, screen recording, code snippet or Help Scout ticket
false takes the WP_Error branch and is used as an object:
https://github.com/Codeinwp/optimole-wp/blob/v4.2.17/inc/rest.php#L467-L468
if ( $user === false || is_wp_error( $user ) ) {
if ( $user->get_error_code() === 'domain_not_accessible' ) {
The same $user->get_error_message() call is repeated at https://github.com/Codeinwp/optimole-wp/blob/v4.2.17/inc/rest.php#L482.
The places where request() returns false:
https://github.com/Codeinwp/optimole-wp/blob/v4.2.17/inc/api.php#L180-L191 and https://github.com/Codeinwp/optimole-wp/blob/v4.2.17/inc/api.php#L217-L228
if ( empty( $response ) ) { return false; }
$response = json_decode( $response, true );
...
if ( ! isset( $response['code'] ) ) { return false; }
The sibling handlers already guard the error-object calls with is_wp_error(): https://github.com/Codeinwp/optimole-wp/blob/v4.2.17/inc/rest.php#L377-L390
Core does not catch the error (call_user_func( $handler['callback'], $request ) in WP_REST_Server::respond_to_request(), wp-includes/rest-api/class-wp-rest-server.php:1293 in WordPress 7.1.3). The fatal handler answers with HTTP 500 (wp-includes/class-wp-fatal-error-handler.php:212).
A likely fix is to only call get_error_code() / get_error_message() when is_wp_error( $user ), and return the plain "Error creating account." response for false.
Environment info
- Optimole 4.2.17 (the code is the same on
masterat 63f3f7c) - Any WordPress version the plugin supports (5.5 and later; core lines cited from 7.1.3)
- PHP 7.4 and later. Calling a method on
falsethrowsErroron every PHP 7 and 8 version. Reproduced on PHP 8.4.19.
Is the issue you are reporting a regression
Yes. Up to 3.11.3, register_service() returned "Error creating account." for false without calling any method on it (https://github.com/Codeinwp/optimole-wp/blob/v3.11.3/inc/rest.php#L357-L366). The $user->get_error_code() call first ships in 3.12.0.
Found while writing the WordPress compatibility checks for Optimole.
- Lenguaje dominante
- PHP
- Estrellas
- 74
- Forks
- 14
- Merge medio
- 1 d 22 h
- PR fusionados (30 d)
- 29
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de Codeinwp/optimole-wp
-
Page profiler endpoint fatals on PHP 8 when the request has no `b` (background selectors) fieldPosiblemente ocupada @girishpanchal30 la tomó hace 1 día. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Codeinwp/optimole-wp#1204 · 4 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
Background image with a gradient is not lazy-loaded on WordPress 7.1 (Quote, Pullquote, Verse, Post Content, Accordion)Posiblemente ocupada @girishpanchal30 la tomó hace 1 día. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Codeinwp/optimole-wp#1203 · 3 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
Page profiler never treats the detected LCP image as LCP, so it gets no fetchpriority="high" (stored ID is a string, compared with === to an int)Posiblemente ocupada @girishpanchal30 la tomó hace 1 día. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Codeinwp/optimole-wp#1202 · 3 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
Renaming an image leaves the old URL in comments and term descriptions, with "Unknown column 'ID'" database errorsPosiblemente ocupada @girishpanchal30 la tomó hace 1 día. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
Codeinwp/optimole-wp#1199 · 3 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
bug-report customer report
Dificultad 4/5 3-5 días Aptitud para principiantes 56/100
Codeinwp/optimole-wp#1211 ·
Los mantenedores suelen responder en 1 día
Todos los issues de Codeinwp/optimole-wp
Issues similares
-
14.3.x
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
CMS video element: "CmsVideoPlugin" sets `volume = 0`, so videos cannot be unmuted on Android ChromeAbiertoneeds-triage Platform(Default)
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
GD decoder discards the finfo media type in mediaTypeByBinary() since 4.4.0Posiblemente ocupada @lazerg la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
Intervention/image#1556 ·
Los mantenedores suelen responder en 1 día
-
bug No Code Attached Yet
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
joomla/joomla-cms#48730 ·
Los mantenedores suelen responder en 1 día