summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2019-10-05 22:32:31 +0530
committerFlorian Dold <florian.dold@gmail.com>2019-10-05 22:32:31 +0530
commitc944a5703aecc36e044f3fcd17f6fed41a3e436d (patch)
treeffd3d6475b553127e0795cd4f2d2eb27ee6e01b2 /src
parent4ac5a15a0354b8ad5d24fcede186a7d608b2b157 (diff)
downloadexchange-c944a5703aecc36e044f3fcd17f6fed41a3e436d.tar.gz
exchange-c944a5703aecc36e044f3fcd17f6fed41a3e436d.tar.bz2
exchange-c944a5703aecc36e044f3fcd17f6fed41a3e436d.zip
add helper function to detect http/https on an MHD connection
Diffstat (limited to 'src')
-rw-r--r--src/include/taler_util.h13
-rw-r--r--src/util/util.c79
2 files changed, 64 insertions, 28 deletions
diff --git a/src/include/taler_util.h b/src/include/taler_util.h
index 310c88955..9cfcb3dce 100644
--- a/src/include/taler_util.h
+++ b/src/include/taler_util.h
@@ -156,6 +156,19 @@ TALER_urlencode (const char *s);
/**
+ * Find out if an MHD connection is using HTTPS (either
+ * directly or via proxy).
+ *
+ * @param connection MHD connection
+ * @returns GNUNET_YES if the MHD connection is using https,
+ * GNUNET_NO if the MHD connection is using http,
+ * GNUNET_SYSERR if the connection type couldn't be determined
+ */
+int
+TALER_mhd_is_https (struct MHD_Connection *connection);
+
+
+/**
* Make an absolute URL with query parameters.
*
* @param base_url absolute base URL to use
diff --git a/src/util/util.c b/src/util/util.c
index 027daf427..3341aa295 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -424,6 +424,53 @@ TALER_url_absolute_raw (const char *proto,
/**
+ * Find out if an MHD connection is using HTTPS (either
+ * directly or via proxy).
+ *
+ * @param connection MHD connection
+ * @returns GNUNET_YES if the MHD connection is using https,
+ * GNUNET_NO if the MHD connection is using http,
+ * GNUNET_SYSERR if the connection type couldn't be determined
+ */
+int
+TALER_mhd_is_https (struct MHD_Connection *connection)
+{
+ const union MHD_ConnectionInfo *ci;
+ const union MHD_DaemonInfo *di;
+ const char *forwarded_proto = MHD_lookup_connection_value (connection,
+ MHD_HEADER_KIND,
+ "X-Forwarded-Proto");
+
+ if (NULL != forwarded_proto)
+ {
+ if (0 == strcmp (forwarded_proto, "https"))
+ return GNUNET_YES;
+ if (0 == strcmp (forwarded_proto, "http"))
+ return GNUNET_NO;
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ /* likely not reverse proxy, figure out if we are
+ http by asking MHD */
+ ci = MHD_get_connection_info (connection, MHD_CONNECTION_INFO_DAEMON);
+ if (NULL == ci)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ di = MHD_get_daemon_info (ci->daemon, MHD_DAEMON_INFO_FLAGS);
+ if (NULL == di)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (0 != (di->flags & MHD_USE_TLS))
+ return GNUNET_YES;
+ return GNUNET_NO;
+}
+
+
+/**
* Make an absolute URL for a given MHD connection.
*
* @param path path of the url
@@ -437,42 +484,18 @@ TALER_url_absolute_mhd (struct MHD_Connection *connection,
...)
{
/* By default we assume we're running under HTTPS */
- const char *proto = "https";
- const char *forwarded_proto = MHD_lookup_connection_value (connection,
- MHD_HEADER_KIND,
- "X-Forwarded-Proto");
+ const char *proto;
const char *host;
const char *forwarded_host;
const char *prefix;
va_list args;
char *result;
-
- if (NULL != forwarded_proto)
- {
- proto = forwarded_proto;
- }
+ if (GNUNET_YES == TALER_mhd_is_https (connection))
+ proto = "https";
else
- {
- /* likely not reverse proxy, figure out if we are
- http by asking MHD */
- const union MHD_ConnectionInfo *ci;
+ proto = "http";
- ci = MHD_get_connection_info (connection,
- MHD_CONNECTION_INFO_DAEMON);
- if (NULL != ci)
- {
- const union MHD_DaemonInfo *di;
-
- di = MHD_get_daemon_info (ci->daemon,
- MHD_DAEMON_INFO_FLAGS);
- if (NULL != di)
- {
- if (0 == (di->flags & MHD_USE_TLS))
- proto = "http";
- }
- }
- }
host = MHD_lookup_connection_value (connection, MHD_HEADER_KIND, "Host");
forwarded_host = MHD_lookup_connection_value (connection, MHD_HEADER_KIND,
"X-Forwarded-Host");