GNUnet  0.20.0
plugin_transport_http_common.c File Reference

functionality shared between http(s)client plugins More...

Include dependency graph for plugin_transport_http_common.c:

Go to the source code of this file.

Data Structures

struct  PrettyPrinterContext
 Closure for append_port(). More...
 

Functions

static void http_clean_splitted (struct SplittedHTTPAddress *spa)
 
struct SplittedHTTPAddresshttp_split_address (const char *addr)
 Split an HTTP address into protocol, hostname, port and path components. More...
 
static const char * http_common_plugin_dnsresult_to_address (const char *plugin, const struct SplittedHTTPAddress *saddr, uint32_t options, const char *dnsresult)
 Function called for a quick conversion of the binary address to a numeric address. More...
 
static void http_common_dns_reverse_lookup_cb (void *cls, const char *hostname)
 
static int http_common_dns_reverse_lookup (const struct sockaddr *sockaddr, socklen_t sockaddr_len, const char *type, struct SplittedHTTPAddress *saddr, uint32_t options, struct GNUNET_TIME_Relative timeout, GNUNET_TRANSPORT_AddressStringCallback asc, void *asc_cls)
 
static void http_common_dns_ip_lookup_cb (void *cls, const struct sockaddr *addr, socklen_t addrlen)
 
static int http_common_dns_ip_lookup (const char *name, const char *type, struct SplittedHTTPAddress *saddr, uint32_t options, struct GNUNET_TIME_Relative timeout, GNUNET_TRANSPORT_AddressStringCallback asc, void *asc_cls)
 
void http_common_plugin_address_pretty_printer (void *cls, const char *type, const void *addr, size_t addrlen, int numeric, struct GNUNET_TIME_Relative timeout, GNUNET_TRANSPORT_AddressStringCallback asc, void *asc_cls)
 Convert the transports address to a nice, human-readable format. More...
 
const char * http_common_plugin_address_to_url (void *cls, const void *addr, size_t addrlen)
 FIXME. More...
 
const char * http_common_plugin_address_to_string (const char *plugin, const void *addr, size_t addrlen)
 Function called for a quick conversion of the binary address to a numeric address. More...
 
int http_common_plugin_string_to_address (void *cls, const char *addr, uint16_t addrlen, void **buf, size_t *added)
 Function called to convert a string address to a binary address. More...
 
struct HttpAddresshttp_common_address_from_socket (const char *protocol, const struct sockaddr *addr, socklen_t addrlen)
 Create a HTTP address from a socketaddr. More...
 
struct sockaddr * http_common_socket_from_address (const void *addr, size_t addrlen, int *res)
 Create a socketaddr from a HTTP address. More...
 
size_t http_common_address_get_size (const struct HttpAddress *addr)
 Get the length of an address. More...
 
size_t http_common_cmp_addresses (const void *addr1, size_t addrlen1, const void *addr2, size_t addrlen2)
 Compare addr1 to addr2. More...
 
enum GNUNET_NetworkType http_common_get_network_for_address (struct GNUNET_TRANSPORT_PluginEnvironment *env, const struct GNUNET_HELLO_Address *address)
 Function obtain the network type for an address. More...
 

Variables

static struct PrettyPrinterContextdll_ppc_head
 Head of PPC list. More...
 
static struct PrettyPrinterContextdll_ppc_tail
 Tail of PPC list. More...
 

Detailed Description

functionality shared between http(s)client plugins

functionality shared by http client and server transport service plugin

Author
Matthias Wachs
Matthias Wachs
Christian Grothoff

Definition in file plugin_transport_http_common.c.

Function Documentation

◆ http_clean_splitted()

static void http_clean_splitted ( struct SplittedHTTPAddress spa)
static

Definition at line 33 of file plugin_transport_http_common.c.

34 {
35  if (NULL != spa)
36  {
37  GNUNET_free (spa->protocol);
38  GNUNET_free (spa->host);
39  GNUNET_free (spa->path);
40  GNUNET_free (spa);
41  }
42 }
#define GNUNET_free(ptr)
Wrapper around free.

References GNUNET_free, SplittedHTTPAddress::host, SplittedHTTPAddress::path, and SplittedHTTPAddress::protocol.

Referenced by http_common_dns_ip_lookup_cb(), http_common_dns_reverse_lookup_cb(), http_common_plugin_address_pretty_printer(), and http_common_socket_from_address().

Here is the caller graph for this function:

◆ http_split_address()

struct SplittedHTTPAddress* http_split_address ( const char *  addr)

Split an HTTP address into protocol, hostname, port and path components.

Definition at line 46 of file plugin_transport_http_common.c.

47 {
48  struct SplittedHTTPAddress *sp;
49  char *src = GNUNET_strdup (addr);
50  char *protocol_start = NULL;
51  char *host_start = NULL;
52  char *v6_end = NULL;
53  char *port_start = NULL;
54  char *path_start = NULL;
55 
56  protocol_start = src;
57 
58  sp = GNUNET_new (struct SplittedHTTPAddress);
59  /* Address string consists of protocol://host[:port]path*/
60 
61  host_start = strstr (src, "://");
62  if (NULL == host_start)
63  {
64  GNUNET_free (src);
65  GNUNET_free (sp);
66  return NULL;
67  }
68  host_start[0] = '\0';
69  sp->protocol = GNUNET_strdup (protocol_start);
70 
71  host_start += strlen ("://");
72  if (strlen (host_start) == 0)
73  {
74  GNUNET_free (src);
75  GNUNET_free (sp->protocol);
76  GNUNET_free (sp);
77  return NULL;
78  }
79 
80  /* Find path start */
81  path_start = strchr (host_start, '/');
82  if (NULL != path_start)
83  {
84  sp->path = GNUNET_strdup (path_start);
85  path_start[0] = '\0';
86  }
87  else
88  sp->path = GNUNET_strdup ("");
89 
90  if (strlen (host_start) < 1)
91  {
92  GNUNET_free (src);
93  GNUNET_free (sp->protocol);
94  GNUNET_free (sp->path);
95  GNUNET_free (sp);
96  return NULL;
97  }
98 
99  if (NULL != (port_start = strrchr (host_start, ':')))
100  {
101  /* *We COULD have a port, but also an IPv6 address! */
102  if (NULL != (v6_end = strchr (host_start, ']')))
103  {
104  if (v6_end < port_start)
105  {
106  /* IPv6 address + port */
107  port_start[0] = '\0';
108  port_start++;
109  sp->port = atoi (port_start);
110  if ((0 == sp->port) || (65535 < sp->port))
111  {
112  GNUNET_free (src);
113  GNUNET_free (sp->protocol);
114  GNUNET_free (sp->path);
115  GNUNET_free (sp);
116  return NULL;
117  }
118  }
119  else
120  {
121  /* IPv6 address + no port */
122  if (0 == strcmp (sp->protocol, "https"))
123  sp->port = HTTPS_DEFAULT_PORT;
124  else if (0 == strcmp (sp->protocol, "http"))
125  sp->port = HTTP_DEFAULT_PORT;
126  }
127  }
128  else
129  {
130  /* No IPv6 address */
131  port_start[0] = '\0';
132  port_start++;
133  sp->port = atoi (port_start);
134  if ((0 == sp->port) || (65535 < sp->port))
135  {
136  GNUNET_free (src);
137  GNUNET_free (sp->protocol);
138  GNUNET_free (sp->path);
139  GNUNET_free (sp);
140  return NULL;
141  }
142  }
143  }
144  else
145  {
146  /* No ':' as port separator, default port for protocol */
147  if (0 == strcmp (sp->protocol, "https"))
148  sp->port = HTTPS_DEFAULT_PORT;
149  else if (0 == strcmp (sp->protocol, "http"))
150  sp->port = HTTP_DEFAULT_PORT;
151  else
152  {
153  GNUNET_break (0);
154  GNUNET_free (src);
155  GNUNET_free (sp->protocol);
156  GNUNET_free (sp->path);
157  GNUNET_free (sp);
158  return NULL;
159  }
160  }
161  if (strlen (host_start) > 0)
162  sp->host = GNUNET_strdup (host_start);
163  else
164  {
165  GNUNET_break (0);
166  GNUNET_free (src);
167  GNUNET_free (sp->protocol);
168  GNUNET_free (sp->path);
169  GNUNET_free (sp);
170  return NULL;
171  }
172  GNUNET_free (src);
173  return sp;
174 }
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define HTTP_DEFAULT_PORT
#define HTTPS_DEFAULT_PORT
Representation of HTTP URL split into its components.

References GNUNET_break, GNUNET_free, GNUNET_new, GNUNET_strdup, SplittedHTTPAddress::host, HTTP_DEFAULT_PORT, HTTPS_DEFAULT_PORT, SplittedHTTPAddress::path, SplittedHTTPAddress::port, and SplittedHTTPAddress::protocol.

Referenced by http_common_plugin_address_pretty_printer(), and http_common_socket_from_address().

Here is the caller graph for this function:

◆ http_common_plugin_dnsresult_to_address()

static const char* http_common_plugin_dnsresult_to_address ( const char *  plugin,
const struct SplittedHTTPAddress saddr,
uint32_t  options,
const char *  dnsresult 
)
static

Function called for a quick conversion of the binary address to a numeric address.

Note that the caller must not free the address and that the next call to this function is allowed to override the address again.

Parameters
pluginthe name of the plugin
saddrthe split http address
optionsaddress options
dnsresultdns name to include in address
Returns
string representing the same address or NULL on error

Definition at line 256 of file plugin_transport_http_common.c.

261 {
262  static char rbuf[1024];
263  char *res;
264 
265  GNUNET_asprintf (&res, "%s.%u.%s://%s:%u%s", plugin, options, saddr->protocol,
266  dnsresult, saddr->port, saddr->path);
267  if (strlen (res) + 1 < 500)
268  {
269  GNUNET_memcpy (rbuf, res, strlen (res) + 1);
270  GNUNET_free (res);
271  return rbuf;
272  }
273  GNUNET_break (0);
274  GNUNET_free (res);
275  return NULL;
276 }
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
static int res
struct TestcasePlugin * plugin
The process handle to the testbed service.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.

References GNUNET_asprintf(), GNUNET_break, GNUNET_free, GNUNET_memcpy, options, SplittedHTTPAddress::path, plugin, SplittedHTTPAddress::port, SplittedHTTPAddress::protocol, res, and PrettyPrinterContext::saddr.

Referenced by http_common_dns_ip_lookup_cb(), and http_common_dns_reverse_lookup_cb().

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

◆ http_common_dns_reverse_lookup_cb()

static void http_common_dns_reverse_lookup_cb ( void *  cls,
const char *  hostname 
)
static

Definition at line 280 of file plugin_transport_http_common.c.

281 {
282  struct PrettyPrinterContext *ppc = cls;
283 
284  if (NULL != hostname)
285  {
286  ppc->asc (ppc->asc_cls,
288  ppc->options,
289  hostname), GNUNET_OK);
290  ppc->success = GNUNET_YES;
291  }
292  else
293  {
294  ppc->asc (ppc->asc_cls, NULL,
295  (GNUNET_NO == ppc->success) ? GNUNET_SYSERR : GNUNET_OK);
296 
298  http_clean_splitted (ppc->saddr);
299  GNUNET_free (ppc->plugin);
300  GNUNET_free (ppc);
301  }
302 }
static char * hostname
Our hostname; we give this to all the peers we start.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
static struct PrettyPrinterContext * dll_ppc_head
Head of PPC list.
static void http_clean_splitted(struct SplittedHTTPAddress *spa)
static struct PrettyPrinterContext * dll_ppc_tail
Tail of PPC list.
static const char * http_common_plugin_dnsresult_to_address(const char *plugin, const struct SplittedHTTPAddress *saddr, uint32_t options, const char *dnsresult)
Function called for a quick conversion of the binary address to a numeric address.
Closure for append_port().
struct SplittedHTTPAddress * saddr
Split Address.
void * asc_cls
Clsoure for asc.
GNUNET_TRANSPORT_AddressStringCallback asc
Function to call with the result.
int success
Was conversion successful.
uint32_t options
Address options.

References PrettyPrinterContext::asc, PrettyPrinterContext::asc_cls, dll_ppc_head, dll_ppc_tail, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, hostname, http_clean_splitted(), http_common_plugin_dnsresult_to_address(), PrettyPrinterContext::options, PrettyPrinterContext::plugin, PrettyPrinterContext::saddr, and PrettyPrinterContext::success.

Referenced by http_common_dns_reverse_lookup().

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

◆ http_common_dns_reverse_lookup()

static int http_common_dns_reverse_lookup ( const struct sockaddr *  sockaddr,
socklen_t  sockaddr_len,
const char *  type,
struct SplittedHTTPAddress saddr,
uint32_t  options,
struct GNUNET_TIME_Relative  timeout,
GNUNET_TRANSPORT_AddressStringCallback  asc,
void *  asc_cls 
)
static

Definition at line 306 of file plugin_transport_http_common.c.

314 {
315  struct PrettyPrinterContext *ppc;
316 
317  ppc = GNUNET_new (struct PrettyPrinterContext);
318  ppc->saddr = saddr;
319  ppc->asc = asc;
320  ppc->asc_cls = asc_cls;
321  ppc->plugin = GNUNET_strdup (type);
322  ppc->options = options;
324  sockaddr_len,
325  GNUNET_YES,
326  timeout,
327  &
329  ppc);
330  if (NULL == ppc->resolver_handle)
331  {
332  GNUNET_free (ppc->plugin);
333  GNUNET_free (ppc);
334  return GNUNET_SYSERR;
335  }
337  dll_ppc_tail,
338  ppc);
339  return GNUNET_OK;
340 }
static struct GNUNET_TIME_Relative timeout
Desired timeout for the lookup (default is no timeout).
Definition: gnunet-abd.c:61
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_RESOLVER_RequestHandle * GNUNET_RESOLVER_hostname_get(const struct sockaddr *sa, socklen_t salen, int do_resolve, struct GNUNET_TIME_Relative timeout, GNUNET_RESOLVER_HostnameCallback callback, void *cls)
Perform a reverse DNS lookup.
static void http_common_dns_reverse_lookup_cb(void *cls, const char *hostname)
struct GNUNET_RESOLVER_RequestHandle * resolver_handle
Resolver handle.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model

References PrettyPrinterContext::asc, PrettyPrinterContext::asc_cls, dll_ppc_head, dll_ppc_tail, GNUNET_CONTAINER_DLL_insert, GNUNET_free, GNUNET_new, GNUNET_OK, GNUNET_RESOLVER_hostname_get(), GNUNET_strdup, GNUNET_SYSERR, GNUNET_YES, http_common_dns_reverse_lookup_cb(), options, PrettyPrinterContext::options, PrettyPrinterContext::plugin, PrettyPrinterContext::resolver_handle, PrettyPrinterContext::saddr, timeout, and type.

Referenced by http_common_plugin_address_pretty_printer().

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

◆ http_common_dns_ip_lookup_cb()

static void http_common_dns_ip_lookup_cb ( void *  cls,
const struct sockaddr *  addr,
socklen_t  addrlen 
)
static

Definition at line 344 of file plugin_transport_http_common.c.

347 {
348  struct PrettyPrinterContext *ppc = cls;
349 
350  if (NULL != addr)
351  {
352  ppc->asc (ppc->asc_cls,
354  ppc->options,
355  GNUNET_a2s (addr,
356  addrlen)),
357  GNUNET_OK);
358  ppc->success = GNUNET_YES;
359  ppc->asc (ppc->asc_cls, GNUNET_a2s (addr, addrlen), GNUNET_OK);
360  }
361  else
362  {
363  ppc->asc (ppc->asc_cls, NULL,
364  (GNUNET_NO == ppc->success) ? GNUNET_SYSERR : GNUNET_OK);
365 
367  GNUNET_free (ppc->plugin);
368  http_clean_splitted (ppc->saddr);
369  GNUNET_free (ppc);
370  }
371 }
const char * GNUNET_a2s(const struct sockaddr *addr, socklen_t addrlen)
Convert a "struct sockaddr*" (IPv4 or IPv6 address) to a string (for printing debug messages).

References PrettyPrinterContext::asc, PrettyPrinterContext::asc_cls, dll_ppc_head, dll_ppc_tail, GNUNET_a2s(), GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, http_clean_splitted(), http_common_plugin_dnsresult_to_address(), PrettyPrinterContext::options, PrettyPrinterContext::plugin, PrettyPrinterContext::saddr, and PrettyPrinterContext::success.

Referenced by http_common_dns_ip_lookup().

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

◆ http_common_dns_ip_lookup()

static int http_common_dns_ip_lookup ( const char *  name,
const char *  type,
struct SplittedHTTPAddress saddr,
uint32_t  options,
struct GNUNET_TIME_Relative  timeout,
GNUNET_TRANSPORT_AddressStringCallback  asc,
void *  asc_cls 
)
static

Definition at line 375 of file plugin_transport_http_common.c.

382 {
383  struct PrettyPrinterContext *ppc;
384 
385  ppc = GNUNET_new (struct PrettyPrinterContext);
386  ppc->success = GNUNET_NO;
387  ppc->saddr = saddr;
388  ppc->asc = asc;
389  ppc->asc_cls = asc_cls;
390  ppc->plugin = GNUNET_strdup (type);
391  ppc->options = options;
393  AF_UNSPEC,
394  timeout,
396  ppc);
397  if (NULL == ppc->resolver_handle)
398  {
399  GNUNET_free (ppc->plugin);
400  GNUNET_free (ppc);
401  return GNUNET_SYSERR;
402  }
404  dll_ppc_tail,
405  ppc);
406  return GNUNET_OK;
407 }
struct GNUNET_RESOLVER_RequestHandle * GNUNET_RESOLVER_ip_get(const char *hostname, int af, struct GNUNET_TIME_Relative timeout, GNUNET_RESOLVER_AddressCallback callback, void *callback_cls)
Convert a string to one or more IP addresses.
Definition: resolver_api.c:940
const char * name
static void http_common_dns_ip_lookup_cb(void *cls, const struct sockaddr *addr, socklen_t addrlen)

References PrettyPrinterContext::asc, PrettyPrinterContext::asc_cls, dll_ppc_head, dll_ppc_tail, GNUNET_CONTAINER_DLL_insert, GNUNET_free, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_RESOLVER_ip_get(), GNUNET_strdup, GNUNET_SYSERR, http_common_dns_ip_lookup_cb(), name, options, PrettyPrinterContext::options, PrettyPrinterContext::plugin, PrettyPrinterContext::resolver_handle, PrettyPrinterContext::saddr, PrettyPrinterContext::success, timeout, and type.

Referenced by http_common_plugin_address_pretty_printer().

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

◆ http_common_plugin_address_pretty_printer()

void http_common_plugin_address_pretty_printer ( void *  cls,
const char *  type,
const void *  addr,
size_t  addrlen,
int  numeric,
struct GNUNET_TIME_Relative  timeout,
GNUNET_TRANSPORT_AddressStringCallback  asc,
void *  asc_cls 
)

Convert the transports address to a nice, human-readable format.

Parameters
clsclosure
typename of the transport that generated the address
addrone of the addresses of the host, NULL for the last address the specific address format depends on the transport
addrlenlength of addr
numericshould (IP) addresses be displayed in numeric form?
timeoutafter how long should we give up?
ascfunction to call on each string
asc_clsclosure for asc

Definition at line 411 of file plugin_transport_http_common.c.

419 {
420  const struct HttpAddress *address = addr;
421  struct SplittedHTTPAddress *saddr;
422  struct sockaddr *sock_addr;
423  const char *ret;
424  char *addr_str;
425  int res;
426  int have_ip;
427 
428  saddr = NULL;
429  sock_addr = NULL;
430  if ((addrlen < sizeof(struct HttpAddress)) ||
431  (addrlen != http_common_address_get_size (address)))
432  {
433  GNUNET_break (0);
434  goto handle_error;
435  }
436 
437  addr_str = (char *) &address[1];
438  if (addr_str[ntohl (address->urlen) - 1] != '\0')
439  {
440  GNUNET_break (0);
441  goto handle_error;
442  }
443 
444  saddr = http_split_address (addr_str);
445  if (NULL == saddr)
446  {
447  GNUNET_break (0);
448  goto handle_error;
449  }
450 
451  sock_addr = http_common_socket_from_address (addr, addrlen, &res);
452  if (GNUNET_SYSERR == res)
453  {
454  /* Malformed address */
455  GNUNET_break (0);
456  goto handle_error;
457  }
458  else if (GNUNET_NO == res)
459  {
460  /* Could not convert to IP */
461  have_ip = GNUNET_NO;
462  }
463  else if (GNUNET_YES == res)
464  {
465  /* Converted to IP */
466  have_ip = GNUNET_YES;
467  }
468  else
469  {
470  /* Must not happen */
471  GNUNET_break (0);
472  goto handle_error;
473  }
474 
475  if ((GNUNET_YES == numeric) &&
476  (GNUNET_YES == have_ip))
477  {
478  /* No lookup required */
480  asc (asc_cls, ret, (NULL == ret) ? GNUNET_SYSERR : GNUNET_OK);
481  asc (asc_cls, NULL, GNUNET_OK);
482  http_clean_splitted (saddr);
483  GNUNET_free (sock_addr);
484  return;
485  }
486  if ((GNUNET_YES == numeric) &&
487  (GNUNET_NO == have_ip))
488  {
489  /* Forward lookup */
490  if (GNUNET_SYSERR ==
491  http_common_dns_ip_lookup (saddr->host, type, saddr,
492  address->options, timeout,
493  asc, asc_cls))
494  {
495  GNUNET_break (0);
496  goto handle_error;
497  }
498  /* Wait for resolver callback */
499  GNUNET_free (sock_addr);
500  return;
501  }
502  if ((GNUNET_NO == numeric) &&
503  (GNUNET_YES == have_ip))
504  {
505  /* Reverse lookup */
506  if (GNUNET_SYSERR ==
508  (AF_INET == sock_addr->sa_family)
509  ? sizeof(struct sockaddr_in)
510  : sizeof(struct sockaddr_in6),
511  type,
512  saddr,
513  address->options, timeout,
514  asc, asc_cls))
515  {
516  GNUNET_break (0);
517  goto handle_error;
518  }
519  /* Wait for resolver callback */
520  GNUNET_free (sock_addr);
521  return;
522  }
523  if ((GNUNET_NO == numeric) &&
524  (GNUNET_NO == have_ip))
525  {
526  /* No lookup required */
528  asc (asc_cls, ret, (NULL == ret) ? GNUNET_SYSERR : GNUNET_OK);
529  asc (asc_cls, NULL, GNUNET_OK);
530  GNUNET_free (sock_addr);
531  http_clean_splitted (saddr);
532  return;
533  }
534  /* Error (argument supplied not GNUNET_YES or GNUNET_NO) */
535  GNUNET_break (0);
536  goto handle_error;
537 
538 handle_error:
539  /* Report error */
540  asc (asc_cls, NULL, GNUNET_SYSERR);
541  asc (asc_cls, NULL, GNUNET_OK);
542  GNUNET_free (sock_addr);
543  if (NULL != saddr)
544  http_clean_splitted (saddr);
545 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
static char * address
GNS address for this phone.
static int numeric
Option -n.
const char * http_common_plugin_address_to_string(const char *plugin, const void *addr, size_t addrlen)
Function called for a quick conversion of the binary address to a numeric address.
size_t http_common_address_get_size(const struct HttpAddress *addr)
Get the length of an address.
static int http_common_dns_ip_lookup(const char *name, const char *type, struct SplittedHTTPAddress *saddr, uint32_t options, struct GNUNET_TIME_Relative timeout, GNUNET_TRANSPORT_AddressStringCallback asc, void *asc_cls)
struct SplittedHTTPAddress * http_split_address(const char *addr)
Split an HTTP address into protocol, hostname, port and path components.
static int http_common_dns_reverse_lookup(const struct sockaddr *sockaddr, socklen_t sockaddr_len, const char *type, struct SplittedHTTPAddress *saddr, uint32_t options, struct GNUNET_TIME_Relative timeout, GNUNET_TRANSPORT_AddressStringCallback asc, void *asc_cls)
struct sockaddr * http_common_socket_from_address(const void *addr, size_t addrlen, int *res)
Create a socketaddr from a HTTP address.
HTTP addresses including a full URI.
void * addr
Address following.

References HttpAddress::addr, address, GNUNET_break, GNUNET_free, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, SplittedHTTPAddress::host, http_clean_splitted(), http_common_address_get_size(), http_common_dns_ip_lookup(), http_common_dns_reverse_lookup(), http_common_plugin_address_to_string(), http_common_socket_from_address(), http_split_address(), numeric, res, ret, timeout, and type.

Referenced by libgnunet_plugin_transport_http_client_init().

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

◆ http_common_plugin_address_to_url()

const char* http_common_plugin_address_to_url ( void *  cls,
const void *  addr,
size_t  addrlen 
)

FIXME.

Definition at line 552 of file plugin_transport_http_common.c.

555 {
556  static char rbuf[1024];
557  const struct HttpAddress *address = addr;
558  const char *addr_str;
559 
560  if (NULL == addr)
561  {
562  GNUNET_break (0);
563  return NULL;
564  }
565  if (0 == addrlen)
566  {
567  GNUNET_break (0);
568  return NULL;
569  }
570  if (addrlen != http_common_address_get_size (address))
571  {
572  GNUNET_break (0);
573  return NULL;
574  }
575  addr_str = (char *) &address[1];
576  if (addr_str[ntohl (address->urlen) - 1] != '\0')
577  return NULL;
578 
579  GNUNET_memcpy (rbuf,
580  &address[1],
581  ntohl (address->urlen));
582  return rbuf;
583 }

References HttpAddress::addr, address, GNUNET_break, GNUNET_memcpy, and http_common_address_get_size().

Referenced by client_connect().

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

◆ http_common_plugin_address_to_string()

const char* http_common_plugin_address_to_string ( const char *  plugin,
const void *  addr,
size_t  addrlen 
)

Function called for a quick conversion of the binary address to a numeric address.

Note that the caller must not free the address and that the next call to this function is allowed to override the address again.

Parameters
pluginname of the plugin
addrbinary address
addrlenlength of addr
Returns
string representing the same address

Definition at line 587 of file plugin_transport_http_common.c.

590 {
591  static char rbuf[1024];
592  const struct HttpAddress *address = addr;
593  const char *addr_str;
594  char *res;
595 
596  GNUNET_assert (NULL != plugin);
597  if (NULL == addr)
598  return NULL;
599  if (0 == addrlen)
600  return NULL;
601  if (addrlen != http_common_address_get_size (address))
602  return NULL;
603  addr_str = (char *) &address[1];
604  if (addr_str[ntohl (address->urlen) - 1] != '\0')
605  return NULL;
606  GNUNET_asprintf (&res, "%s.%u.%s", plugin, ntohl (address->options),
607  (char*) &address[1]);
608  if (strlen (res) + 1 < 500)
609  {
610  GNUNET_memcpy (rbuf, res, strlen (res) + 1);
611  GNUNET_free (res);
612  return rbuf;
613  }
614  GNUNET_break (0);
615  GNUNET_free (res);
616  return NULL;
617 }
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.

References HttpAddress::addr, address, GNUNET_asprintf(), GNUNET_assert, GNUNET_break, GNUNET_free, GNUNET_memcpy, http_common_address_get_size(), plugin, and res.

Referenced by client_connect(), client_receive_mst_cb(), http_client_plugin_address_to_string(), http_client_plugin_get_session(), http_common_plugin_address_pretty_printer(), http_server_plugin_address_to_string(), libgnunet_plugin_transport_http_client_done(), server_access_cb(), server_add_address(), server_disconnect_cb(), server_lookup_connection(), server_receive_mst_cb(), and server_remove_address().

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

◆ http_common_plugin_string_to_address()

int http_common_plugin_string_to_address ( void *  cls,
const char *  addr,
uint16_t  addrlen,
void **  buf,
size_t *  added 
)

Function called to convert a string address to a binary address.

Parameters
clsclosure (struct Plugin*)
addrstring address
addrlenlength of addr
buflocation to store the buffer If the function returns GNUNET_SYSERR, its contents are undefined.
addedlength of created address
Returns
GNUNET_OK on success, GNUNET_SYSERR on failure

Definition at line 621 of file plugin_transport_http_common.c.

626 {
627  struct HttpAddress *a;
628  char *address;
629  char *plugin;
630  char *optionstr;
631  size_t urlen;
632  uint32_t options;
633 
634  /* Format protocol.options.address:port */
635  address = NULL;
636  plugin = NULL;
637  optionstr = NULL;
638  if ((NULL == addr) || (addrlen == 0))
639  {
640  GNUNET_break (0);
641  return GNUNET_SYSERR;
642  }
643  if ('\0' != addr[addrlen - 1])
644  {
645  GNUNET_break (0);
646  return GNUNET_SYSERR;
647  }
648  if (strlen (addr) != addrlen - 1)
649  {
650  GNUNET_break (0);
651  return GNUNET_SYSERR;
652  }
654  optionstr = strchr (plugin, '.');
655  if (NULL == optionstr)
656  {
657  GNUNET_break (0);
659  return GNUNET_SYSERR;
660  }
661  optionstr[0] = '\0';
662  optionstr++;
663  options = atol (optionstr); /* 0 on conversion error, that's ok */
664  address = strchr (optionstr, '.');
665  if (NULL == address)
666  {
667  GNUNET_break (0);
669  return GNUNET_SYSERR;
670  }
671  address[0] = '\0';
672  address++;
673  urlen = strlen (address) + 1;
674 
675  a = GNUNET_malloc (sizeof(struct HttpAddress) + urlen);
676  a->options = htonl (options);
677  a->urlen = htonl (urlen);
678  GNUNET_memcpy (&a[1], address, urlen);
679 
680  (*buf) = a;
681  (*added) = sizeof(struct HttpAddress) + urlen;
683  return GNUNET_OK;
684 }
#define GNUNET_malloc(size)
Wrapper around malloc.
uint32_t urlen
Length of URL located after struct.
uint32_t options
Address options see enum HttpAddressOptions

References HttpAddress::addr, address, GNUNET_break, GNUNET_free, GNUNET_malloc, GNUNET_memcpy, GNUNET_OK, GNUNET_strdup, GNUNET_SYSERR, options, HttpAddress::options, plugin, and HttpAddress::urlen.

Referenced by libgnunet_plugin_transport_http_client_init().

Here is the caller graph for this function:

◆ http_common_address_from_socket()

struct HttpAddress* http_common_address_from_socket ( const char *  protocol,
const struct sockaddr *  addr,
socklen_t  addrlen 
)

Create a HTTP address from a socketaddr.

Parameters
protocolprotocol
addrsockaddr * address
addrlenlength of the addr
Returns
A pointer to a struct HttpAddress derived from addr

Definition at line 688 of file plugin_transport_http_common.c.

691 {
692  struct HttpAddress *address = NULL;
693  char *res;
694  size_t len;
695 
697  "%s://%s",
698  protocol,
699  GNUNET_a2s (addr,
700  addrlen));
701  len = strlen (res) + 1;
702  address = GNUNET_malloc (sizeof(struct HttpAddress) + len);
703  address->options = htonl (HTTP_OPTIONS_NONE);
704  address->urlen = htonl (len);
705  GNUNET_memcpy (&address[1], res, len);
706  GNUNET_free (res);
707  return address;
708 }
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
@ HTTP_OPTIONS_NONE
No bits set.

References HttpAddress::addr, address, GNUNET_a2s(), GNUNET_asprintf(), GNUNET_free, GNUNET_malloc, GNUNET_memcpy, HTTP_OPTIONS_NONE, len, and res.

Referenced by server_add_address(), server_lookup_connection(), and server_remove_address().

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

◆ http_common_socket_from_address()

struct sockaddr* http_common_socket_from_address ( const void *  addr,
size_t  addrlen,
int *  res 
)

Create a socketaddr from a HTTP address.

Parameters
addra sockaddr * address
addrlenlength of the addr
resthe result: GNUNET_SYSERR, invalid input, GNUNET_YES: could convert to ip, GNUNET_NO: valid input but could not convert to ip (hostname?)
Returns
the string

Definition at line 723 of file plugin_transport_http_common.c.

726 {
727  const struct HttpAddress *ha;
728  struct SplittedHTTPAddress *spa;
729  struct sockaddr_storage *s;
730  char *to_conv;
731  size_t urlen;
732 
733  (*res) = GNUNET_SYSERR;
734  ha = (const struct HttpAddress *) addr;
735  if (NULL == addr)
736  {
737  GNUNET_break (0);
738  return NULL;
739  }
740  if (0 == addrlen)
741  {
742  GNUNET_break (0);
743  return NULL;
744  }
745  if (addrlen < sizeof(struct HttpAddress))
746  {
747  GNUNET_break (0);
748  return NULL;
749  }
750  urlen = ntohl (ha->urlen);
751  if (sizeof(struct HttpAddress) + urlen != addrlen)
752  {
753  /* This is a legacy addresses */
754  return NULL;
755  }
756  if (addrlen < sizeof(struct HttpAddress) + urlen)
757  {
758  /* This is a legacy addresses */
759  return NULL;
760  }
761  if (((char *) addr)[addrlen - 1] != '\0')
762  {
763  GNUNET_break (0);
764  return NULL;
765  }
766  spa = http_split_address ((const char *) &ha[1]);
767  if (NULL == spa)
768  {
769  (*res) = GNUNET_SYSERR;
770  return NULL;
771  }
772 
773  s = GNUNET_new (struct sockaddr_storage);
774  GNUNET_asprintf (&to_conv, "%s:%u", spa->host, spa->port);
775  if (GNUNET_SYSERR
776  == GNUNET_STRINGS_to_address_ip (to_conv, strlen (to_conv), s))
777  {
778  /* could be a hostname */
779  GNUNET_free (s);
780  (*res) = GNUNET_NO;
781  s = NULL;
782  }
783  else if ((AF_INET != s->ss_family) && (AF_INET6 != s->ss_family))
784  {
785  GNUNET_free (s);
786  (*res) = GNUNET_SYSERR;
787  s = NULL;
788  }
789  else
790  {
791  (*res) = GNUNET_YES;
792  }
793  http_clean_splitted (spa);
794  GNUNET_free (to_conv);
795  return (struct sockaddr *) s;
796 }
enum GNUNET_GenericReturnValue GNUNET_STRINGS_to_address_ip(const char *addr, uint16_t addrlen, struct sockaddr_storage *r_buf)
Tries to convert addr string to an IP (v4 or v6) address.
Definition: strings.c:1134

References HttpAddress::addr, GNUNET_asprintf(), GNUNET_break, GNUNET_free, GNUNET_new, GNUNET_NO, GNUNET_STRINGS_to_address_ip(), GNUNET_SYSERR, GNUNET_YES, SplittedHTTPAddress::host, http_clean_splitted(), http_split_address(), SplittedHTTPAddress::port, and HttpAddress::urlen.

Referenced by http_client_plugin_get_session(), and http_common_plugin_address_pretty_printer().

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

◆ http_common_address_get_size()

size_t http_common_address_get_size ( const struct HttpAddress addr)

Get the length of an address.

Parameters
addraddress
Returns
the size

Definition at line 806 of file plugin_transport_http_common.c.

807 {
808  return sizeof(struct HttpAddress) + ntohl (addr->urlen);
809 }

References HttpAddress::addr, and HttpAddress::urlen.

Referenced by http_common_plugin_address_pretty_printer(), http_common_plugin_address_to_string(), http_common_plugin_address_to_url(), server_add_address(), server_lookup_connection(), and server_remove_address().

Here is the caller graph for this function:

◆ http_common_cmp_addresses()

size_t http_common_cmp_addresses ( const void *  addr1,
size_t  addrlen1,
const void *  addr2,
size_t  addrlen2 
)

Compare addr1 to addr2.

Parameters
addr1address1
addrlen1address 1 length
addr2address2
addrlen2address 2 length
Returns
GNUNET_YES if equal, GNUNET_NO if not, GNUNET_SYSERR on error

Definition at line 822 of file plugin_transport_http_common.c.

826 {
827  const char *a1 = addr1;
828  const char *a2 = addr2;
829  const struct HttpAddress *ha1;
830  const struct HttpAddress *ha2;
831 
832  ha1 = (const struct HttpAddress *) a1;
833  ha2 = (const struct HttpAddress *) a2;
834 
835  if (NULL == a1)
836  return GNUNET_SYSERR;
837  if (0 == addrlen1)
838  return GNUNET_SYSERR;
839  if (a1[addrlen1 - 1] != '\0')
840  return GNUNET_SYSERR;
841 
842  if (NULL == a2)
843  return GNUNET_SYSERR;
844  if (0 == addrlen2)
845  return GNUNET_SYSERR;
846  if (a2[addrlen2 - 1] != '\0')
847  return GNUNET_SYSERR;
848 
849  if (addrlen1 != addrlen2)
850  return GNUNET_NO;
851  if (ha1->urlen != ha2->urlen)
852  return GNUNET_NO;
853 
854  if (0 == strcmp ((const char *) &ha1[1], (const char *) &ha2[1]))
855  return GNUNET_YES;
856  return GNUNET_NO;
857 }

References GNUNET_NO, GNUNET_SYSERR, GNUNET_YES, and HttpAddress::urlen.

Referenced by http_server_plugin_address_suggested(), and server_remove_address().

Here is the caller graph for this function:

◆ http_common_get_network_for_address()

enum GNUNET_NetworkType http_common_get_network_for_address ( struct GNUNET_TRANSPORT_PluginEnvironment env,
const struct GNUNET_HELLO_Address address 
)

Function obtain the network type for an address.

Parameters
envthe environment
addressthe address
Returns
the network type

Definition at line 822 of file plugin_transport_http_common.c.

871 {
872  struct sockaddr *sa;
873  enum GNUNET_NetworkType net_type;
874  size_t salen = 0;
875  int res;
876 
877  net_type = GNUNET_NT_UNSPECIFIED;
879  address->address_length,
880  &res);
881  if (GNUNET_SYSERR == res)
882  return net_type;
883  if (GNUNET_YES == res)
884  {
885  GNUNET_assert (NULL != sa);
886  if (AF_INET == sa->sa_family)
887  {
888  salen = sizeof(struct sockaddr_in);
889  }
890  else if (AF_INET6 == sa->sa_family)
891  {
892  salen = sizeof(struct sockaddr_in6);
893  }
894  net_type = env->get_address_type (env->cls,
895  sa,
896  salen);
897  GNUNET_free (sa);
898  }
899  return net_type;
900 }
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
GNUNET_NetworkType
Types of networks (with separate quotas) we support.
Definition: gnunet_nt_lib.h:39
@ GNUNET_NT_UNSPECIFIED
Category of last resort.
Definition: gnunet_nt_lib.h:43

Variable Documentation

◆ dll_ppc_head

◆ dll_ppc_tail