/* This file is part of TALER Copyright (C) 2014, 2015, 2016 GNUnet e.V. TALER is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. TALER is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with TALER; see the file COPYING. If not, see */ /** * @file taler-exchange-httpd_parsing.h * @brief functions to parse incoming requests * @author Florian Dold * @author Benedikt Mueller * @author Christian Grothoff */ #ifndef TALER_EXCHANGE_HTTPD_PARSING_H #define TALER_EXCHANGE_HTTPD_PARSING_H #include #include #include "taler_util.h" #include "taler_json_lib.h" /** * Process a POST request containing a JSON object. This * function realizes an MHD POST processor that will * (incrementally) process JSON data uploaded to the HTTP * server. It will store the required state in the * "connection_cls", which must be cleaned up using * #TEH_PARSE_post_cleanup_callback(). * * @param connection the MHD connection * @param con_cls the closure (points to a `struct Buffer *`) * @param upload_data the POST data * @param upload_data_size number of bytes in @a upload_data * @param json the JSON object for a completed request * @return * #GNUNET_YES if json object was parsed or at least * may be parsed in the future (call again); * `*json` will be NULL if we need to be called again, * and non-NULL if we are done. * #GNUNET_NO is request incomplete or invalid * (error message was generated) * #GNUNET_SYSERR on internal error * (we could not even queue an error message, * close HTTP session with MHD_NO) */ int TEH_PARSE_post_json (struct MHD_Connection *connection, void **con_cls, const char *upload_data, size_t *upload_data_size, json_t **json); /** * Function called whenever we are done with a request * to clean up our state. * * @param con_cls value as it was left by * #TEH_PARSE_post_json(), to be cleaned up */ void TEH_PARSE_post_cleanup_callback (void *con_cls); /** * Parse JSON object into components based on the given field * specification. * * @param connection the connection to send an error response to * @param root the JSON node to start the navigation at. * @param spec field specification for the parser * @return * #GNUNET_YES if navigation was successful (caller is responsible * for freeing allocated variable-size data using * GNUNET_JSON_parse_free() when done) * #GNUNET_NO if json is malformed, error response was generated * #GNUNET_SYSERR on internal error */ int TEH_PARSE_json_data (struct MHD_Connection *connection, const json_t *root, struct GNUNET_JSON_Specification *spec); /** * Parse JSON array into components based on the given field * specification. Generates error response on parse errors. * * @param connection the connection to send an error response to * @param root the JSON node to start the navigation at. * @param[in,out] spec field specification for the parser * @param ... -1-terminated list of array offsets of type 'int' * @return * #GNUNET_YES if navigation was successful (caller is responsible * for freeing allocated variable-size data using * GNUNET_JSON_parse_free() when done) * #GNUNET_NO if json is malformed, error response was generated * #GNUNET_SYSERR on internal error */ int TEH_PARSE_json_array (struct MHD_Connection *connection, const json_t *root, struct GNUNET_JSON_Specification *spec, ...); /** * Extraxt fixed-size base32crockford encoded data from request. * * Queues an error response to the connection if the parameter is missing or * invalid. * * @param connection the MHD connection * @param param_name the name of the parameter with the key * @param[out] out_data pointer to store the result * @param out_size expected size of @a out_data * @return * #GNUNET_YES if the the argument is present * #GNUNET_NO if the argument is absent or malformed * #GNUNET_SYSERR on internal error (error response could not be sent) */ int TEH_PARSE_mhd_request_arg_data (struct MHD_Connection *connection, const char *param_name, void *out_data, size_t out_size); #endif /* TALER_EXCHANGE_HTTPD_PARSING_H */