GNUnet  0.10.x
Data Structures | Functions
curl_reschedule.c File Reference

API for event loop integration with GNUnet SCHEDULER. More...

#include "platform.h"
#include <jansson.h>
#include "gnunet_curl_lib.h"
#include "gnunet_util_lib.h"
Include dependency graph for curl_reschedule.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_CURL_RescheduleContext
 Closure for GNUNET_CURL_gnunet_scheduler_reschedule(). More...
 

Functions

void * GNUNET_CURL_download_get_result_ (struct GNUNET_CURL_DownloadBuffer *db, CURL *eh, long *response_code)
 Obtain information about the final result about the HTTP download. More...
 
struct GNUNET_CURL_RescheduleContextGNUNET_CURL_gnunet_rc_create_with_parser (struct GNUNET_CURL_Context *ctx, GNUNET_CURL_RawParser rp, GNUNET_CURL_ResponseCleaner rc)
 Initialize reschedule context; with custom response parser. More...
 
static void clean_result (void *response)
 Just a wrapper to avoid casting of function pointers. More...
 
struct GNUNET_CURL_RescheduleContextGNUNET_CURL_gnunet_rc_create (struct GNUNET_CURL_Context *ctx)
 Initialize reschedule context. More...
 
void GNUNET_CURL_gnunet_rc_destroy (struct GNUNET_CURL_RescheduleContext *rc)
 Destroy reschedule context. More...
 
static void context_task (void *cls)
 Task that runs the context's event loop with the GNUnet scheduler. More...
 
void GNUNET_CURL_gnunet_scheduler_reschedule (void *cls)
 Implementation of the GNUNET_CURL_RescheduleCallback for GNUnet's scheduler. More...
 

Detailed Description

API for event loop integration with GNUnet SCHEDULER.

Author
Christian Grothoff

Definition in file curl_reschedule.c.

Function Documentation

◆ GNUNET_CURL_download_get_result_()

void* GNUNET_CURL_download_get_result_ ( struct GNUNET_CURL_DownloadBuffer db,
CURL *  eh,
long *  response_code 
)

Obtain information about the final result about the HTTP download.

If the download was successful, parses the JSON in the db and returns it. Also returns the HTTP response_code. If the download failed, the return value is NULL. The response code is set in any case, on download errors to zero.

Calling this function also cleans up db.

Parameters
dbdownload buffer
ehCURL handle (to get the response code)
[out]response_codeset to the HTTP response code (or zero if we aborted the download, i.e. because the response was too big, or if the JSON we received was malformed).
Returns
NULL if downloading a JSON reply failed.

Definition at line 434 of file curl.c.

References GNUNET_CURL_DownloadBuffer::buf, GNUNET_CURL_DownloadBuffer::buf_size, GNUNET_CURL_DownloadBuffer::eno, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_free_non_null, GNUNET_log, and JSON_WARN.

Referenced by GNUNET_CURL_gnunet_rc_create(), and GNUNET_CURL_perform().

437 {
438  json_t *json;
439  json_error_t error;
440  char *ct;
441 
443  "Downloaded body: %.*s\n",
444  (int) db->buf_size,
445  (char *) db->buf);
446 
447  if ((CURLE_OK != curl_easy_getinfo (eh, CURLINFO_CONTENT_TYPE, &ct)) ||
448  (NULL == ct) || (0 != strcasecmp (ct, "application/json")))
449  {
450  /* No content type or explicitly not JSON, refuse to parse
451  (but keep response code) */
452  if (CURLE_OK !=
453  curl_easy_getinfo (eh, CURLINFO_RESPONSE_CODE, response_code))
454  {
455  /* unexpected error... */
456  GNUNET_break (0);
457  *response_code = 0;
458  }
459  if (0 != db->buf_size)
461  "Did NOT detect response as JSON\n");
462  return NULL;
463  }
464  json = NULL;
465  if (0 == db->eno)
466  {
467  json = json_loadb (db->buf,
468  db->buf_size,
469  JSON_REJECT_DUPLICATES | JSON_DISABLE_EOF_CHECK,
470  &error);
471  if (NULL == json)
472  {
473  JSON_WARN (error);
474  *response_code = 0;
475  }
476  }
478  db->buf = NULL;
479  db->buf_size = 0;
480  if (NULL != json)
481  {
482  if (CURLE_OK !=
483  curl_easy_getinfo (eh, CURLINFO_RESPONSE_CODE, response_code))
484  {
485  /* unexpected error... */
486  GNUNET_break (0);
487  *response_code = 0;
488  }
489  }
490  return json;
491 }
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define JSON_WARN(error)
Print JSON parsing related error information.
Definition: curl.c:53
void * buf
Download buffer.
#define GNUNET_log(kind,...)
size_t buf_size
The size of the download buffer.
int eno
Error code (based on libc errno) if we failed to download (i.e.
Here is the caller graph for this function:

◆ clean_result()

static void clean_result ( void *  response)
static

Just a wrapper to avoid casting of function pointers.

Parameters
responsethe (JSON) response to clean.

Definition at line 90 of file curl_reschedule.c.

Referenced by GNUNET_CURL_gnunet_rc_create().

91 {
92  json_decref (response);
93 }
static struct MHD_Response * response
Our canonical response.
Here is the caller graph for this function:

◆ context_task()

static void context_task ( void *  cls)
static

Task that runs the context's event loop with the GNUnet scheduler.

Parameters
clsa struct GNUNET_CURL_RescheduleContext *

Definition at line 134 of file curl_reschedule.c.

References GNUNET_CURL_RescheduleContext::cleaner, GNUNET_CURL_RescheduleContext::ctx, GNUNET_CURL_get_select_info(), GNUNET_CURL_perform2(), GNUNET_NETWORK_fdset_copy_native(), GNUNET_NETWORK_fdset_create(), GNUNET_NETWORK_fdset_destroy(), GNUNET_SCHEDULER_add_select(), GNUNET_SCHEDULER_PRIORITY_DEFAULT, GNUNET_TIME_relative_multiply(), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_TIME_UNIT_MILLISECONDS, GNUNET_CURL_RescheduleContext::parser, GNUNET_CURL_RescheduleContext::task, and timeout.

Referenced by GNUNET_CURL_gnunet_scheduler_reschedule().

135 {
136  struct GNUNET_CURL_RescheduleContext *rc = cls;
137  long timeout;
138  int max_fd;
139  fd_set read_fd_set;
140  fd_set write_fd_set;
141  fd_set except_fd_set;
142  struct GNUNET_NETWORK_FDSet *rs;
143  struct GNUNET_NETWORK_FDSet *ws;
145 
146  rc->task = NULL;
147 
148  GNUNET_CURL_perform2 (rc->ctx, rc->parser, rc->cleaner);
149  max_fd = -1;
150  timeout = -1;
151  FD_ZERO (&read_fd_set);
152  FD_ZERO (&write_fd_set);
153  FD_ZERO (&except_fd_set);
155  &read_fd_set,
156  &write_fd_set,
157  &except_fd_set,
158  &max_fd,
159  &timeout);
160  if (timeout >= 0)
161  delay =
163  else
166  GNUNET_NETWORK_fdset_copy_native (rs, &read_fd_set, max_fd + 1);
168  GNUNET_NETWORK_fdset_copy_native (ws, &write_fd_set, max_fd + 1);
169  if (NULL == rc->task)
171  delay,
172  rs,
173  ws,
174  &context_task,
175  rc);
178 }
struct GNUNET_CURL_Context * ctx
Context we manage.
GNUNET_CURL_ResponseCleaner cleaner
Deallocate the response object.
GNUNET_CURL_RawParser parser
Parser of the raw response.
void GNUNET_NETWORK_fdset_copy_native(struct GNUNET_NETWORK_FDSet *to, const fd_set *from, int nfds)
Copy a native fd set into the GNUnet representation.
Definition: network.c:1308
Closure for GNUNET_CURL_gnunet_scheduler_reschedule().
void GNUNET_NETWORK_fdset_destroy(struct GNUNET_NETWORK_FDSet *fds)
Releases the associated memory of an fd set.
Definition: network.c:1554
struct GNUNET_NETWORK_FDSet * GNUNET_NETWORK_fdset_create(void)
Creates an fd set.
Definition: network.c:1538
static struct GNUNET_TIME_Relative timeout
User defined timestamp for completing operations.
Definition: gnunet-arm.c:114
collection of IO descriptors
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_select(enum GNUNET_SCHEDULER_Priority prio, struct GNUNET_TIME_Relative delay, const struct GNUNET_NETWORK_FDSet *rs, const struct GNUNET_NETWORK_FDSet *ws, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay or when any of the specified file descriptor set...
Definition: scheduler.c:1829
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition: time.c:439
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
#define GNUNET_TIME_UNIT_MILLISECONDS
One millisecond.
static struct GNUNET_TIME_Relative delay
When should dkg communication start?
struct GNUNET_SCHEDULER_Task * task
Just the task.
void GNUNET_CURL_get_select_info(struct GNUNET_CURL_Context *ctx, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *except_fd_set, int *max_fd, long *timeout)
Obtain the information for a select() call to wait until GNUNET_CURL_perform() is ready again...
Definition: curl.c:659
void GNUNET_CURL_perform2(struct GNUNET_CURL_Context *ctx, GNUNET_CURL_RawParser rp, GNUNET_CURL_ResponseCleaner rc)
Run the main event loop for the Taler interaction.
Definition: curl.c:521
Run with the default priority (normal P2P operations).
static void context_task(void *cls)
Task that runs the context&#39;s event loop with the GNUnet scheduler.
Time for relative time used by GNUnet, in microseconds.
Here is the call graph for this function:
Here is the caller graph for this function: