/** * REST API: WP_REST_Request class * * @package WordPress * @subpackage REST_API * @since 4.4.0 */ /** * Core class used to implement a REST request object. * * Contains data from the request, to be passed to the callback. * * Note: This implements ArrayAccess, and acts as an array of parameters when * used in that manner. It does not use ArrayObject (as we cannot rely on SPL), * so be aware it may have non-array behaviour in some cases. * * Note: When using features provided by ArrayAccess, be aware that WordPress deliberately * does not distinguish between arguments of the same name for different request methods. * For instance, in a request with `GET id=1` and `POST id=2`, `$request['id']` will equal * 2 (`POST`) not 1 (`GET`). For more precision between request methods, use * WP_REST_Request::get_body_params(), WP_REST_Request::get_url_params(), etc. * * @since 4.4.0 * * @see ArrayAccess */ class WP_REST_Request implements ArrayAccess { /** * HTTP method. * * @since 4.4.0 * @var string */ protected $method = ''; /** * Parameters passed to the request. * * These typically come from the `$_GET`, `$_POST` and `$_FILES` * superglobals when being created from the global scope. * * @since 4.4.0 * @var array Contains GET, POST and FILES keys mapping to arrays of data. */ protected $params; /** * HTTP headers for the request. * * @since 4.4.0 * @var array Map of key to value. Key is always lowercase, as per HTTP specification. */ protected $headers = array(); /** * Body data. * * @since 4.4.0 * @var string Binary data from the request. */ protected $body = null; /** * Route matched for the request. * * @since 4.4.0 * @var string */ protected $route; /** * Attributes (options) for the route that was matched. * * This is the options array used when the route was registered, typically * containing the callback as well as the valid methods for the route. * * @since 4.4.0 * @var array Attributes for the request. */ protected $attributes = array(); /** * Used to determine if the JSON data has been parsed yet. * * Allows lazy-parsing of JSON data where possible. * * @since 4.4.0 * @var bool */ protected $parsed_json = false; /** * Used to determine if the body data has been parsed yet. * * @since 4.4.0 * @var bool */ protected $parsed_body = false; /** * Constructor. * * @since 4.4.0 * * @param string $method Optional. Request method. Default empty. * @param string $route Optional. Request route. Default empty. * @param array $attributes Optional. Request attributes. Default empty array. */ public function __construct( $method = '', $route = '', $attributes = array() ) { $this->params = array( 'URL' => array(), 'GET' => array(), 'POST' => array(), 'FILES' => array(), // See parse_json_params. 'JSON' => null, 'defaults' => array(), ); $this->set_method( $method ); $this->set_route( $route ); $this->set_attributes( $attributes ); } /** * Retrieves the HTTP method for the request. * * @since 4.4.0 * * @return string HTTP method. */ public function get_method() { return $this->method; } /** * Sets HTTP method for the request. * * @since 4.4.0 * * @param string $method HTTP method. */ public function set_method( $method ) { $this->method = strtoupper( $method ); } /** * Retrieves all headers from the request. * * @since 4.4.0 * * @return array Map of key to value. Key is always lowercase, as per HTTP specification. */ public function get_headers() { return $this->headers; } /** * Canonicalizes the header name. * * Ensures that header names are always treated the same regardless of * source. Header names are always case insensitive. * * Note that we treat `-` (dashes) and `_` (underscores) as the same * character, as per header parsing rules in both Apache and nginx. * * @link https://stackoverflow.com/q/18185366 * @link https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#missing-disappearing-http-headers * @link https://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers * * @since 4.4.0 * @static * * @param string $key Header name. * @return string Canonicalized name. */ public static function canonicalize_header_name( $key ) { $key = strtolower( $key ); $key = str_replace( '-', '_', $key ); return $key; } /** * Retrieves the given header from the request. * * If the header has multiple values, they will be concatenated with a comma * as per the HTTP specification. Be aware that some non-compliant headers * (notably cookie headers) cannot be joined this way. * * @since 4.4.0 * * @param string $key Header name, will be canonicalized to lowercase. * @return string|null String value if set, null otherwise. */ public function get_header( $key ) { $key = $this->canonicalize_header_name( $key ); if ( ! isset( $this->headers[ $key ] ) ) { return null; } return implode( ',', $this->headers[ $key ] ); } /** * Retrieves header values from the request. * * @since 4.4.0 * * @param string $key Header name, will be canonicalized to lowercase. * @return array|null List of string values if set, null otherwise. */ public function get_header_as_array( $key ) { $key = $this->canonicalize_header_name( $key ); if ( ! isset( $this->headers[ $key ] ) ) { return null; } return $this->headers[ $key ]; } /** * Sets the header on request. * * @since 4.4.0 * * @param string $key Header name. * @param string $value Header value, or list of values. */ public function set_header( $key, $value ) { $key = $this->canonicalize_header_name( $key ); $value = (array) $value; $this->headers[ $key ] = $value; } /** * Appends a header value for the given header. * * @since 4.4.0 * * @param string $key Header name. * @param string $value Header value, or list of values. */ public function add_header( $key, $value ) { $key = $this->canonicalize_header_name( $key ); $value = (array) $value; if ( ! isset( $this->headers[ $key ] ) ) { $this->headers[ $key ] = array(); } $this->headers[ $key ] = array_merge( $this->headers[ $key ], $value ); } /** * Removes all values for a header. * * @since 4.4.0 * * @param string $key Header name. */ public function remove_header( $key ) { $key = $this->canonicalize_header_name( $key ); unset( $this->headers[ $key ] ); } /** * Sets headers on the request. * * @since 4.4.0 * * @param array $headers Map of header name to value. * @param bool $override If true, replace the request's headers. Otherwise, merge with existing. */ public function set_headers( $headers, $override = true ) { if ( true === $override ) { $this->headers = array(); } foreach ( $headers as $key => $value ) { $this->set_header( $key, $value ); } } /** * Retrieves the content-type of the request. * * @since 4.4.0 * * @return array Map containing 'value' and 'parameters' keys. */ public function get_content_type() { $value = $this->get_header( 'content-type' ); if ( empty( $value ) ) { return null; } $parameters = ''; if ( strpos( $value, ';' ) ) { list( $value, $parameters ) = explode( ';', $value, 2 ); } $value = strtolower( $value ); if ( strpos( $value, '/' ) === false ) { return null; } // Parse type and subtype out. list( $type, $subtype ) = explode( '/', $value, 2 ); $data = compact( 'value', 'type', 'subtype', 'parameters' ); $data = array_map( 'trim', $data ); return $data; } /** * Retrieves the parameter priority order. * * Used when checking parameters in get_param(). * * @since 4.4.0 * * @return array List of types to check, in order of priority. */ protected function get_parameter_order() { $order = array(); $content_type = $this->get_content_type(); if ( $content_type['value'] === 'application/json' ) { $order[] = 'JSON'; } $this->parse_json_params(); // Ensure we parse the body data. $body = $this->get_body(); if ( 'POST' !== $this->method && ! empty( $body ) ) { $this->parse_body_params(); } $accepts_body_data = array( 'POST', 'PUT', 'PATCH', 'DELETE' ); if ( in_array( $this->method, $accepts_body_data ) ) { $order[] = 'POST'; } $order[] = 'GET'; $order[] = 'URL'; $order[] = 'defaults'; /** * Filters the parameter order. * * The order affects which parameters are checked when using get_param() and family. * This acts similarly to PHP's `request_order` setting. * * @since 4.4.0 * * @param array $order { * An array of types to check, in order of priority. * * @param string $type The type to check. * } * @param WP_REST_Request $this The request object. */ return apply_filters( 'rest_request_parameter_order', $order, $this ); } /** * Retrieves a parameter from the request. * * @since 4.4.0 * * @param string $key Parameter name. * @return mixed|null Value if set, null otherwise. */ public function get_param( $key ) { $order = $this->get_parameter_order(); foreach ( $order as $type ) { // Determine if we have the parameter for this type. if ( isset( $this->params[ $type ][ $key ] ) ) { return $this->params[ $type ][ $key ]; } } return null; } /** * Sets a parameter on the request. * * @since 4.4.0 * * @param string $key Parameter name. * @param mixed $value Parameter value. */ public function set_param( $key, $value ) { $order = $this->get_parameter_order(); $this->params[ $order[0] ][ $key ] = $value; } /** * Retrieves merged parameters from the request. * * The equivalent of get_param(), but returns all parameters for the request. * Handles merging all the available values into a single array. * * @since 4.4.0 * * @return array Map of key to value. */ public function get_params() { $order = $this->get_parameter_order(); $order = array_reverse( $order, true ); $params = array(); foreach ( $order as $type ) { // array_merge / the "+" operator will mess up // numeric keys, so instead do a manual foreach. foreach ( (array) $this->params[ $type ] as $key => $value ) { $params[ $key ] = $value; } } return $params; } /** * Retrieves parameters from the route itself. * * These are parsed from the URL using the regex. * * @since 4.4.0 * * @return array Parameter map of key to value. */ public function get_url_params() { return $this->params['URL']; } /** * Sets parameters from the route. * * Typically, this is set after parsing the URL. * * @since 4.4.0 * * @param array $params Parameter map of key to value. */ public function set_url_params( $params ) { $this->params['URL'] = $params; } /** * Retrieves parameters from the query string. * * These are the parameters you'd typically find in `$_GET`. * * @since 4.4.0 * * @return array Parameter map of key to value */ public function get_query_params() { return $this->params['GET']; } /** * Sets parameters from the query string. * * Typically, this is set from `$_GET`. * * @since 4.4.0 * * @param array $params Parameter map of key to value. */ public function set_query_params( $params ) { $this->params['GET'] = $params; } /** * Retrieves parameters from the body. * * These are the parameters you'd typically find in `$_POST`. * * @since 4.4.0 * * @return array Parameter map of key to value. */ public function get_body_params() { return $this->params['POST']; } /** * Sets parameters from the body. * * Typically, this is set from `$_POST`. * * @since 4.4.0 * * @param array $params Parameter map of key to value. */ public function set_body_params( $params ) { $this->params['POST'] = $params; } /** * Retrieves multipart file parameters from the body. * * These are the parameters you'd typically find in `$_FILES`. * * @since 4.4.0 * * @return array Parameter map of key to value */ public function get_file_params() { return $this->params['FILES']; } /** * Sets multipart file parameters from the body. * * Typically, this is set from `$_FILES`. * * @since 4.4.0 * * @param array $params Parameter map of key to value. */ public function set_file_params( $params ) { $this->params['FILES'] = $params; } /** * Retrieves the default parameters. * * These are the parameters set in the route registration. * * @since 4.4.0 * * @return array Parameter map of key to value */ public function get_default_params() { return $this->params['defaults']; } /** * Sets default parameters. * * These are the parameters set in the route registration. * * @since 4.4.0 * * @param array $params Parameter map of key to value. */ public function set_default_params( $params ) { $this->params['defaults'] = $params; } /** * Retrieves the request body content. * * @since 4.4.0 * * @return string Binary data from the request body. */ public function get_body() { return $this->body; } /** * Sets body content. * * @since 4.4.0 * * @param string $data Binary data from the request body. */ public function set_body( $data ) { $this->body = $data; // Enable lazy parsing. $this->parsed_json = false; $this->parsed_body = false; $this->params['JSON'] = null; } /** * Retrieves the parameters from a JSON-formatted body. * * @since 4.4.0 * * @return array Parameter map of key to value. */ public function get_json_params() { // Ensure the parameters have been parsed out. $this->parse_json_params(); return $this->params['JSON']; } /** * Parses the JSON parameters. * * Avoids parsing the JSON data until we need to access it. * * @since 4.4.0 * @since 4.7.0 Returns error instance if value cannot be decoded. * @return true|WP_Error True if the JSON data was passed or no JSON data was provided, WP_Error if invalid JSON was passed. */ protected function parse_json_params() { if ( $this->parsed_json ) { return true; } $this->parsed_json = true; // Check that we actually got JSON. $content_type = $this->get_content_type(); if ( empty( $content_type ) || 'application/json' !== $content_type['value'] ) { return true; } $body = $this->get_body(); if ( empty( $body ) ) { return true; } $params = json_decode( $body, true ); /* * Check for a parsing error. * * Note that due to WP's JSON compatibility functions, json_last_error * might not be defined: https://core.trac.wordpress.org/ticket/27799 */ if ( null === $params && ( ! function_exists( 'json_last_error' ) || JSON_ERROR_NONE !== json_last_error() ) ) { // Ensure subsequent calls receive error instance. $this->parsed_json = false; $error_data = array( 'status' => WP_Http::BAD_REQUEST, ); if ( function_exists( 'json_last_error' ) ) { $error_data['json_error_code'] = json_last_error(); $error_data['json_error_message'] = json_last_error_msg(); } return new WP_Error( 'rest_invalid_json', __( 'Invalid JSON body passed.' ), $error_data ); } $this->params['JSON'] = $params; return true; } /** * Parses the request body parameters. * * Parses out URL-encoded bodies for request methods that aren't supported * natively by PHP. In PHP 5.x, only POST has these parsed automatically. * * @since 4.4.0 */ protected function parse_body_params() { if ( $this->parsed_body ) { return; } $this->parsed_body = true; /* * Check that we got URL-encoded. Treat a missing content-type as * URL-encoded for maximum compatibility. */ $content_type = $this->get_content_type(); if ( ! empty( $content_type ) && 'application/x-www-form-urlencoded' !== $content_type['value'] ) { return; } parse_str( $this->get_body(), $params ); /* * Amazingly, parse_str follows magic quote rules. Sigh. * * NOTE: Do not refactor to use `wp_unslash`. */ if ( get_magic_quotes_gpc() ) { $params = stripslashes_deep( $params ); } /* * Add to the POST parameters stored internally. If a user has already * set these manually (via `set_body_params`), don't override them. */ $this->params['POST'] = array_merge( $params, $this->params['POST'] ); } /** * Retrieves the route that matched the request. * * @since 4.4.0 * * @return string Route matching regex. */ public function get_route() { return $this->route; } /** * Sets the route that matched the request. * * @since 4.4.0 * * @param string $route Route matching regex. */ public function set_route( $route ) { $this->route = $route; } /** * Retrieves the attributes for the request. * * These are the options for the route that was matched. * * @since 4.4.0 * * @return array Attributes for the request. */ public function get_attributes() { return $this->attributes; } /** * Sets the attributes for the request. * * @since 4.4.0 * * @param array $attributes Attributes for the request. */ public function set_attributes( $attributes ) { $this->attributes = $attributes; } /** * Sanitizes (where possible) the params on the request. * * This is primarily based off the sanitize_callback param on each registered * argument. * * @since 4.4.0 * * @return true|WP_Error True if parameters were sanitized, WP_Error if an error occurred during sanitization. */ public function sanitize_params() { $attributes = $this->get_attributes(); // No arguments set, skip sanitizing. if ( empty( $attributes['args'] ) ) { return true; } $order = $this->get_parameter_order(); $invalid_params = array(); foreach ( $order as $type ) { if ( empty( $this->params[ $type ] ) ) { continue; } foreach ( $this->params[ $type ] as $key => $value ) { if ( ! isset( $attributes['args'][ $key ] ) ) { continue; } $param_args = $attributes['args'][ $key ]; // If the arg has a type but no sanitize_callback attribute, default to rest_parse_request_arg. if ( ! array_key_exists( 'sanitize_callback', $param_args ) && ! empty( $param_args['type'] ) ) { $param_args['sanitize_callback'] = 'rest_parse_request_arg'; } // If there's still no sanitize_callback, nothing to do here. if ( empty( $param_args['sanitize_callback'] ) ) { continue; } $sanitized_value = call_user_func( $param_args['sanitize_callback'], $value, $this, $key ); if ( is_wp_error( $sanitized_value ) ) { $invalid_params[ $key ] = $sanitized_value->get_error_message(); } else { $this->params[ $type ][ $key ] = $sanitized_value; } } } if ( $invalid_params ) { return new WP_Error( 'rest_invalid_param', sprintf( __( 'Invalid parameter(s): %s' ), implode( ', ', array_keys( $invalid_params ) ) ), array( 'status' => 400, 'params' => $invalid_params ) ); } return true; } /** * Checks whether this request is valid according to its attributes. * * @since 4.4.0 * * @return bool|WP_Error True if there are no parameters to validate or if all pass validation, * WP_Error if required parameters are missing. */ public function has_valid_params() { // If JSON data was passed, check for errors. $json_error = $this->parse_json_params(); if ( is_wp_error( $json_error ) ) { return $json_error; } $attributes = $this->get_attributes(); $required = array(); // No arguments set, skip validation. if ( empty( $attributes['args'] ) ) { return true; } foreach ( $attributes['args'] as $key => $arg ) { $param = $this->get_param( $key ); if ( isset( $arg['required'] ) && true === $arg['required'] && null === $param ) { $required[] = $key; } } if ( ! empty( $required ) ) { return new WP_Error( 'rest_missing_callback_param', sprintf( __( 'Missing parameter(s): %s' ), implode( ', ', $required ) ), array( 'status' => 400, 'params' => $required ) ); } /* * Check the validation callbacks for each registered arg. * * This is done after required checking as required checking is cheaper. */ $invalid_params = array(); foreach ( $attributes['args'] as $key => $arg ) { $param = $this->get_param( $key ); if ( null !== $param && ! empty( $arg['validate_callback'] ) ) { $valid_check = call_user_func( $arg['validate_callback'], $param, $this, $key ); if ( false === $valid_check ) { $invalid_params[ $key ] = __( 'Invalid parameter.' ); } if ( is_wp_error( $valid_check ) ) { $invalid_params[ $key ] = $valid_check->get_error_message(); } } } if ( $invalid_params ) { return new WP_Error( 'rest_invalid_param', sprintf( __( 'Invalid parameter(s): %s' ), implode( ', ', array_keys( $invalid_params ) ) ), array( 'status' => 400, 'params' => $invalid_params ) ); } return true; } /** * Checks if a parameter is set. * * @since 4.4.0 * * @param string $offset Parameter name. * @return bool Whether the parameter is set. */ public function offsetExists( $offset ) { $order = $this->get_parameter_order(); foreach ( $order as $type ) { if ( isset( $this->params[ $type ][ $offset ] ) ) { return true; } } return false; } /** * Retrieves a parameter from the request. * * @since 4.4.0 * * @param string $offset Parameter name. * @return mixed|null Value if set, null otherwise. */ public function offsetGet( $offset ) { return $this->get_param( $offset ); } /** * Sets a parameter on the request. * * @since 4.4.0 * * @param string $offset Parameter name. * @param mixed $value Parameter value. */ public function offsetSet( $offset, $value ) { $this->set_param( $offset, $value ); } /** * Removes a parameter from the request. * * @since 4.4.0 * * @param string $offset Parameter name. */ public function offsetUnset( $offset ) { $order = $this->get_parameter_order(); // Remove the offset from every group. foreach ( $order as $type ) { unset( $this->params[ $type ][ $offset ] ); } } /** * Retrieves a WP_REST_Request object from a full URL. * * @static * @since 4.5.0 * * @param string $url URL with protocol, domain, path and query args. * @return WP_REST_Request|false WP_REST_Request object on success, false on failure. */ public static function from_url( $url ) { $bits = parse_url( $url ); $query_params = array(); if ( ! empty( $bits['query'] ) ) { wp_parse_str( $bits['query'], $query_params ); } $api_root = rest_url(); if ( get_option( 'permalink_structure' ) && 0 === strpos( $url, $api_root ) ) { // Pretty permalinks on, and URL is under the API root. $api_url_part = substr( $url, strlen( untrailingslashit( $api_root ) ) ); $route = parse_url( $api_url_part, PHP_URL_PATH ); } elseif ( ! empty( $query_params['rest_route'] ) ) { // ?rest_route=... set directly $route = $query_params['rest_route']; unset( $query_params['rest_route'] ); } $request = false; if ( ! empty( $route ) ) { $request = new WP_REST_Request( 'GET', $route ); $request->set_query_params( $query_params ); } /** * Filters the request generated from a URL. * * @since 4.5.0 * * @param WP_REST_Request|false $request Generated request object, or false if URL * could not be parsed. * @param string $url URL the request was generated from. */ return apply_filters( 'rest_request_from_url', $request, $url ); } } Le Goût des Choses | Chloé Dubreuil

Le Goût des Choses

‘Il était une fois le récit d’un homme ; 42 ans, marié, deux enfants. […] En ce matin du 13 août 2003, très tôt, l’homme est parti de chez lui. […] Avant même de sortir de chez lui, l’homme était ailleurs. Déjà. Séparé déjà des ruines de l’intime. Le roman est ainsi celui de l’errance de cet homme tout au long d’une journée que l’on pressent fatale. L’homme mourra, c’est probable, mais seulement après avoir vécu cette journée plus intensément qu’il n’a jamais vécu : on ne vit que deux fois, la première quand on naît, la second quand on est face à la mort, dit un proverbe chinois. C’est pourquoi ce récit d’une disparition est aussi un hymne à la vie, un hymne discret et pudique au lyrisme contenu –une fugue sur le mode mineur, qui fait souvent les œuvres majeures.

 

XTRAIT

Le principe de départ à l’histoire de cet homme est simple : tout est question de vue. Sachant que la définition de ce vocable se pose en ces termes : vue : faculté de percevoir, d’être attentif à son environnement ; il en découle qu’il vaut mieux savoir user de ce sens pour transmettre à son organisme des renseignements de choix sur le milieu extérieur. Et pourquoi pas. Faire en sorte que l’inspiration soit frémissement de la rétine, dilatation de la pupille. L’homme, jusqu’alors si peu habité par la vision des choses, si peu habitué à découvrir leur palpitation instinctive, va prendre sur lui et s’attacher à exercer sa réceptivité, à relâcher sa sensibilité.’

La collection HB a été reprise par les éditions du Mot fou, créée par Hélène Delmas qui a longtemps oeuvré au sein des éditions d’Huguette et François Bouchardeau. Le livre est donc toujours disponible en librairie sous la marque de cette Maison.

PRESSE
Arenciel | Aurélie Noally | 2005-10-01

Interview Chloé Dubreuil

À 35 ans, cette écrivain lyonnaise publie Le goût des choses chez HB Éditions. L’auteur livre le regard ultime d’un homme qui va vivre une journée plus intensément qu’il n’a jamais vécu : « On ne vit que deux fois, la première quand on naît, la seconde quand on est face à la mort. » cette fable éphémère qui s’ouvre sur ce proverbe chinois saisit l’éveil tardif mais essentiel d’un être avant qu’il ne s’éteigne. Rencontre avec une plume qui manie la prose avec justesse, pudeur et singularité. L’histoire en quelques mots ? Un matin, l’homme décide de tout quitter pour partir au hasard. Il sait qu’il ne verra pas le jour suivant se lever. Lors de cette journée, l’homme réalise qu’il a vécu en aveugle. Il apprend alors à voir les choses en ouvrant son regard au monde. Pourquoi ne pas donner d’identité définie à « l’homme » ? Cet anonymat permet de mettre l’accent sur l’intensité de ce qu’il va vivre tout en insistant sur sa transparence antérieure. Jusqu’ici, l’homme faisait entrer mécaniquement en lui, les aliments et les mots. Il vivait comme un fantôme, en spectateur de sa vie. Lors de cette journée, il va enfin être lui. Le passé et le futur sont exclus. Seul existe le présent auquel il va se donner pleinement pour découvrir Le goût des choses. La mort est évoquée sans mélodrame, ni « adieux larmoyants »… Sa fin est en accord avec ce qu’il est. La souffrance physique qu’il ressent en marchant le rendheureux. La vie ne coule plus sur lui, il se sent exister. Le sommeil qui l’accable au fil de la journée représente les prémisses de la mort. Il n’y a pas de rupture brutale, la mort est une continuité naturelle. Les poèmes disséminés aux quatre coins de l’appartement, c’est l’humanité du personnage qui ressort malgré lui ? Ses essais ratés sont de petites choses avortées qui auraient pu naître si son enfance avait été autre. L’abandon de la mère et l’indifférence paternelle ont tué dans l’oeuf son éveil à la vie, à la poésie.

Le Progrés | André Mure | 2005-10-31

Le goût des choses

C’est un bonheur de découvrir un écrivain chez un auteur dont le précédent ouvrage ne nous avait pas apporté une telle sensation. Ainsi, Chloé Dubreuil dont le Goût des choses est une véritable révélation. Dans un joli livre avec une couverture de Kandinski chez H.B Editions. C’est l’errance d’un homme dans une journée que l’on pressent fatale. Un thème pas follement gai, mais c’est écrit au millimètre : phrases courtes, incisives. Une progression inéluctable. André Mure

Livre et Lire | N. B. | 2005-11-01

Mortelle randonnée

Dès la deuxième page du livre de Chloé Dubreuil, Le Goût des choses, la fin est révélée : « L’homme va s’offrir à la mort. La mort, ce soir, viendra le prendre; il le sait ». L’intérêt de ce premier ouvrage n’est donc pas situé dans son dénouement mais dans la façon – que l’on peut ici garantir saisissante – dont il interviendra, et surtout au terme de quels événements. Pour l’auteur, il s’agit en effet non seulement de tenir la chronique d’une mort annoncée mais aussi de dire tout ce qui précède cette disparition. Le récit retrace donc, du matin jusqu’au soir, la dernière journée de cet homme jamais nommé, qui a lui-même prononcé une sentence de mort à son encontre. On le suit pas à pas dans ce qui apparait très vite comme une randonnée dénuée de but. Une errance hasardeuse où se mêlent l’observation détachée des individus et des paysages que l’homme rencontre au cours de sa dérive aussi bien que des souvenirs qui ressurgissent dans sa mémoire. Ainsi, petit à petit, se dessine le portrait d’un être neurasthénique, incapable de s’intéresser à son existence autrement qu’en cultivant ses souffrances physiques. « La douleur instituée comme une religion », précise-t-il. Un être étrange, chroniquement fatigué, frappé d’une inappétence chronique que Chloé Dubreuil réussit à rendre attachant. Dans ses meilleurs moments (l’évanouissement de l’homme lors d’une fête de village, la morsure qu’il inflige soudain à un jeune adolescent qui l’irrite…), le récit fait penser à ceux d’Emmanuel Bove, avec cette torpeur poisseuse et opaque qui les caractérise. N. B

Le figaro Lyon / Nelly Gabriel / 2005-11-28

 

Journée bien particulière que celle décrite par Chloé Dubreuil, jeune romancière lyonnaise, dans le Goût des choses, son deuxième opus romanesque. Prenant.

C’est une fable, une parabole. Un récit singulier, conduit avec une belle précision stylistique. L’on y suit un homme dans ce que l’on sait être son dernier jour. Dernier jour qui sera aussi le premier. Tous liens sociaux défaits, tout personnage social dépouillé, ainsi allégé de lui-même ou de ce que, jusque là, il a considéré comme tel, l’homme s’en va, c’est son choix, c’est sa décision, vers sa mort. Du centre ville, il se dirige vers la campagne. Retour à l’enfance et aux souvenirs afférents que font naître les changements du paysage. Retour à la terre mère où il va littéralement s’enfouir dans la volupté et la douleur mêlées. De cet homme, on apprendra l’âge (42 ans), l’état (marié, père de famille), la qualité (testeur en aliments). On apprendra, un peu plus tard, qu’il est malade, découvrant alors un rapport de causalité. De souvenirs en réminiscences distillées au fil du récit, d’évocations du père, du rapport à la mère, de ses relations avec sa femme, on saura l’essentiel. Autant dire de lui, presque tout. Mais un essentiel, un tout qui, à l’heure où l’on fait sa connaissance, emboîtant étroitement son pas à travers le regard que porte sur lui la narratrice, n’ont plus cours. On le découvre alors même qu’il s’efface. La nature de sa maladie (une fatigue, un endormissement, une absence au monde tout simplement) n’est pas précisée. Elle importe peu, étant évidemment d’ordre symbolique. A défaut d’avoir eu un projet de vie, cet homme a un projet de mort, qu’il conduit avec fermeté et jouissance jusqu’à son terme. Son programme : regarder, sentir, ressentir. Participer à la vie qui l’environne. Paradoxe : la marche vers la mort se métamorphose en marche dans la vie. Phrases courtes, ellipses, notations brèves. Observations succinctes, mais précises. Les choses, les gestes sont posés, clairement, méthodiquement. Avec recul et distance. Une froideur certaine dans l’écriture préside au départ de ce récit bientôt marqué d’une lente, mais inexorable accélération du rythme, d’une montée en puissance de l’émotion. Celle que provoque le retour de l’affect chez l’homme qui depuis longtemps l’avait enfoui en lui. Pudique, contenu puis dans une manière d’apothéose fantastique, de « finale » comme on le dirait en musique, d’une exaltation furieuse. Etonnant récit que Le goût des choses qui trace sans dévier sa singulière trajectoire. Le thème de la maladie révélatrice de la valeur de vie, de la conscience de la mort comme catalyseur de naissance, n’en est pas original. Il a déjà inspiré nombre d’écrivains. Mais la manière qu’a Chloé Dubreuil d’envisager le sujet et de le traiter est, elle, très personnelle et assez remarquable dans sa radicalité.

 

 

Le progrès / Myriam Mons / 2006-03-11

 

 

Chloé Dubreuil est romancière. Cette habitante de Francheville se glisse dans la peau de ses personnages masculins avec une aisance déconcertante.

A 36 ans, Chloé Dubreuil en est déjà à son quatrième ouvrage publié. Sans compter celui en attente sur le bureau de son éditeur et le dernier, en cours d’écriture. Point commun à ses romans : le personnage principal est un homme. Et rien à la lecture laisse présager qu’une femme est à l’origine des lignes parcourues. Comme si la part masculine de Chloé Dubreuil prenait le dessus au moment où elle accouche de ses mots. Plus le temps passe, plus elle se complaît dans ce style. « Je me sens proche des hommes. C’est assez jubilatoire de se mettre dans la peau d’un homme. Pour les deux derniers-nés de son imagination, des scènes de sexe ont même été glissées dans le récit. Là, l’auteur a trouvé ses limites en terme de masculinité. « Les homme utilisent un vocabulaire plus cru, moins pudique que les femmes. » Heureusement, son compagnon est son premier critique littéraire. L’ouvrage retenu par des libraires neuvillois pour une séance de dédicaces est paru l’an dernier. « Le goût des choses » raconte la dernière journée d’un homme. Sa dernière journée. Car l’homme a choisi de mourir ce soir-là. Mais avant, il va découvrir la vie. Ses saveurs. Ses parfums. Sa musicalité. Sa douceur et sa beauté. En prendre plein la vue car « tout passe par le regard. » « La mort est un sujet que j’aime traiter. Elle amène à écrire des histoires qui ont du sens. Elle permet d’aller au fond des choses. »

Le « goût des choses » est construit comme une galerie de peinture. Chaque chapitre représentant un tableau au titre évocateur, mais toujours très littéraire. L’auteur dit ne pas avoir « envie d’écrire du consensuel ». Pire, elle avoue « s’ennuyer » parfois à la lecture de romans où les phrases sujet-verbe-complément se succèdent. ..

Son style à elle tranche dans le vif, incisif. Elle n’hésite pas à former une phrase d’un seul mot. « Cela correspond à l’état d’esprit du personnage, de sa difficulté à être quelqu’un ». La bibliothèque familiale à Francheville est garnie et semble le terrain de jeu favori du troisième garçon, blondinet bouclé de deux ans. La lecture, une passion pour Chloé Dubreuil qui entre en lecture comme d’autres dans les ordres. Ses deux révélations alors qu’elle n’avait que treize ans : Kafka et Sartre.

La factory.com

Vivre enfin avant de mourir. Ce roman de 138 pages en gros caractères décrit, de l’aube jusqu’à l’aurore, le périple d’un homme, 42 ans, marié, deux enfants, qui a décidé d’en finir avec lui-même, la maladie aidant.

Sans avertir les siens, il part, n’ayant qu’un désir : celui de se laisser imprégner de tout ce qui l’entoure. Regarder, sans toucher. Ecouter sans parler. Déguster sans manger. Prendre de la distance face à sa vie et ses souvenirs. Se sentir respirer jusqu’à son dernier souffle. Puis disparaître de la surface de la terre.  « L’homme va s’offrir à la mort. La mort, ce soir, viendra le prendre ; il le sait. Tout comme il sait qu’il va se lancer d’ici là dans une étude constructive. Observer, engranger. Dresser un inventaire succinct de tout ce qui a pu lui échapper. La mort est une affaire importante, il ne tient pas à la gâcher(…) L’homme veut juste avoir pour compagnons une poignée de vifs éclats. » Un air de musique, un papillon, un randonneur, un jardin, un pré, constitueront son trésor. Un air de Carpe Diem (cueille l’instant présent en latin) flotte dans ces pages. L’auteur, écrivain public résidant a Lyon, utilise beaucoup les figures de style. Elles donnent au texte de la profondeur:
‘Virgule dans le temps l’horloge marque 17 heures. (…) Il boit les heures à petites gorgées, sans plus les mesurer, à l’aune de ce qu’elles représentaient auparavant pour lui.’ Oubliez donc vos montres et ouvrez vos cinq sens. Vous risquez d’être étonnés par vos découvertes.

 

CritiquesLibres.com

Dans ce court roman, Chloé Dubreuil évoque la dernière journée d’un homme ’42 ans, marié, deux enfants’, un homme à bout de souffle qui part de chez lui pour n’y plus revenir. Le récit, très simple, dessine une belle courbe au terme de laquelle le protagoniste va se retrouver, reconquérir ce qu’il y a de plus essentiel en lui. Cet achèvement devient une réalisation, au sens forme du terme, une réalisation de la personne. On y éprouve même une sorte d’allégresse qui nous fait oublier, l’espace d’un instant, que cet aboutissement s’appelle aussi la mort.