GNUnet  0.20.0
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)
 
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 
)

Definition at line 649 of file curl.c.

652 {
653  json_t *json;
654  json_error_t error;
655  char *ct;
656 
657 #if DEBUG
659  "Downloaded body: %.*s\n",
660  (int) db->buf_size,
661  (char *) db->buf);
662 #endif
663  if (CURLE_OK !=
664  curl_easy_getinfo (eh,
665  CURLINFO_RESPONSE_CODE,
666  response_code))
667  {
668  /* unexpected error... */
669  GNUNET_break (0);
670  *response_code = 0;
671  }
672  if (MHD_HTTP_NO_CONTENT == *response_code)
673  return NULL;
674  if ((CURLE_OK !=
675  curl_easy_getinfo (eh,
676  CURLINFO_CONTENT_TYPE,
677  &ct)) ||
678  (NULL == ct) ||
679  (! is_json (ct)))
680  {
681  /* No content type or explicitly not JSON, refuse to parse
682  (but keep response code) */
683  if (0 != db->buf_size)
684  {
685  char *url;
686 
687  if (CURLE_OK !=
688  curl_easy_getinfo (eh,
689  CURLINFO_EFFECTIVE_URL,
690  &url))
691  url = "<unknown URL>";
693  "Request to `%s' was expected to return a body of type `application/json', got `%s'\n",
694  url,
695  ct);
696  }
697  return NULL;
698  }
699  if (0 == *response_code)
700  {
701  char *url;
702 
703  if (CURLE_OK !=
704  curl_easy_getinfo (eh,
705  CURLINFO_EFFECTIVE_URL,
706  &url))
707  url = "<unknown URL>";
709  "Failed to download response from `%s': \n",
710  url);
711  return NULL;
712  }
713  json = NULL;
714  if (0 == db->eno)
715  {
716  json = json_loadb (db->buf,
717  db->buf_size,
718  JSON_REJECT_DUPLICATES | JSON_DISABLE_EOF_CHECK,
719  &error);
720  if (NULL == json)
721  {
722  JSON_WARN (error);
723  *response_code = 0;
724  }
725  }
726  GNUNET_free (db->buf);
727  db->buf = NULL;
728  db->buf_size = 0;
729  return json;
730 }
static bool is_json(const char *ct)
Test if the given content type ct is JSON.
Definition: curl.c:621
#define JSON_WARN(error)
Print JSON parsing related error information.
Definition: curl.c:58
static struct GNUNET_FS_DirectoryBuilder * db
Definition: gnunet-search.c:97
#define GNUNET_log(kind,...)
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_free(ptr)
Wrapper around free.
@ MHD_HTTP_NO_CONTENT
No Content [RFC7231, Section 6.3.5].

Referenced by GNUNET_CURL_gnunet_rc_create(), and GNUNET_CURL_perform().

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 84 of file curl_reschedule.c.

85 {
86  json_decref (response);
87 }
static struct MHD_Response * response
Our canonical response.

References response.

Referenced by GNUNET_CURL_gnunet_rc_create().

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 118 of file curl_reschedule.c.

119 {
120  struct GNUNET_CURL_RescheduleContext *rc = cls;
121  long timeout;
122  int max_fd;
123  fd_set read_fd_set;
124  fd_set write_fd_set;
125  fd_set except_fd_set;
126  struct GNUNET_NETWORK_FDSet *rs;
127  struct GNUNET_NETWORK_FDSet *ws;
129 
130  rc->task = NULL;
131  GNUNET_CURL_perform2 (rc->ctx, rc->parser, rc->cleaner);
132  max_fd = -1;
133  timeout = -1;
134  FD_ZERO (&read_fd_set);
135  FD_ZERO (&write_fd_set);
136  FD_ZERO (&except_fd_set);
138  &read_fd_set,
139  &write_fd_set,
140  &except_fd_set,
141  &max_fd,
142  &timeout);
143  if (timeout >= 0)
144  delay =
146  timeout);
147  else
151  &read_fd_set,
152  max_fd + 1);
155  &write_fd_set,
156  max_fd + 1);
157  if (NULL == rc->task)
159  delay,
160  rs,
161  ws,
162  &context_task,
163  rc);
166 }
static void context_task(void *cls)
Task that runs the context's event loop with the GNUnet scheduler.
static struct GNUNET_TIME_Relative timeout
Desired timeout for the lookup (default is no timeout).
Definition: gnunet-abd.c:61
static struct GNUNET_TIME_Relative delay
When should dkg communication start?
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:828
void GNUNET_CURL_perform2(struct GNUNET_CURL_Context *ctx, GNUNET_CURL_RawParser rp, GNUNET_CURL_ResponseCleaner rc)
Run the main event loop for the HTTP interaction.
Definition: curl.c:747
@ GNUNET_SCHEDULER_PRIORITY_DEFAULT
Run with the default priority (normal P2P operations).
struct GNUNET_NETWORK_FDSet * GNUNET_NETWORK_fdset_create(void)
Creates an fd set.
Definition: network.c:1171
void GNUNET_NETWORK_fdset_destroy(struct GNUNET_NETWORK_FDSet *fds)
Releases the associated memory of an fd set.
Definition: network.c:1187
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:1041
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:1830
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
#define GNUNET_TIME_UNIT_MILLISECONDS
One millisecond.
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:484
Closure for GNUNET_CURL_gnunet_scheduler_reschedule().
struct GNUNET_SCHEDULER_Task * task
Just the task.
GNUNET_CURL_RawParser parser
Parser of the raw response.
struct GNUNET_CURL_Context * ctx
Context we manage.
GNUNET_CURL_ResponseCleaner cleaner
Deallocate the response object.
collection of IO descriptors
Time for relative time used by GNUnet, in microseconds.

References GNUNET_CURL_RescheduleContext::cleaner, GNUNET_CURL_RescheduleContext::ctx, delay, 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().

Here is the call graph for this function:
Here is the caller graph for this function: