[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [libmicrohttpd] branch master updated: Added minimal exampl
From: |
gnunet |
Subject: |
[GNUnet-SVN] [libmicrohttpd] branch master updated: Added minimal example for how to compress HTTP response. (#4914) |
Date: |
Tue, 08 Jan 2019 15:06:52 +0100 |
This is an automated email from the git hooks/post-receive script.
silvioprog pushed a commit to branch master
in repository libmicrohttpd.
The following commit(s) were added to refs/heads/master by this push:
new dad0746a Added minimal example for how to compress HTTP response.
(#4914)
dad0746a is described below
commit dad0746a1006e7c2bd856fd4767b34c7cd6e0f74
Author: silvioprog <address@hidden>
AuthorDate: Tue Jan 8 03:00:17 2019 -0300
Added minimal example for how to compress HTTP response. (#4914)
---
ChangeLog | 3 +
configure.ac | 3 +
src/examples/Makefile.am | 13 +++
src/examples/http_compression.c | 177 ++++++++++++++++++++++++++++++++++++++++
4 files changed, 196 insertions(+)
diff --git a/ChangeLog b/ChangeLog
index 1227571f..aaf17bb2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+Tue Jan 8 02:57:21 BRT 2019
+ Added minimal example for how to compress HTTP response. -SC
+
Wed Dec 19 00:06:03 CET 2018
Check for GNUTLS_E_AGAIN instead of GNUTLS_E_INTERRUPTED when
giving up on a TLS connection. -LM/CG
diff --git a/configure.ac b/configure.ac
index 44c7d294..cfe7af90 100644
--- a/configure.ac
+++ b/configure.ac
@@ -766,6 +766,9 @@ AM_CONDITIONAL([MHD_HAVE_TSEARCH], [[test
"x$ac_cv_header_search_h" = xyes && te
AC_CHECK_HEADERS([dlfcn.h],[have_tlsplugin=yes],[have_tlsplugin=no],
[AC_INCLUDES_DEFAULT])
AM_CONDITIONAL([MHD_HAVE_TLS_PLUGIN], [[test "x$have_tlsplugin" = xyes]])
+AC_CHECK_HEADERS([zlib.h],[have_zlib=yes],[have_zlib=no],
[AC_INCLUDES_DEFAULT])
+AM_CONDITIONAL([HAVE_ZLIB], [[test "x$have_zlib" = xyes]])
+
# Check for generic functions
AC_CHECK_FUNCS([rand random])
diff --git a/src/examples/Makefile.am b/src/examples/Makefile.am
index 545a236a..ce01107a 100644
--- a/src/examples/Makefile.am
+++ b/src/examples/Makefile.am
@@ -68,6 +68,11 @@ noinst_PROGRAMS += \
endif
endif
+if HAVE_ZLIB
+noinst_PROGRAMS += \
+ http_compression
+endif
+
if HAVE_W32
AM_CFLAGS += -DWINDOWS
endif
@@ -198,3 +203,11 @@ https_fileserver_example_CPPFLAGS = \
$(AM_CPPFLAGS) $(GNUTLS_CPPFLAGS)
https_fileserver_example_LDADD = \
$(top_builddir)/src/microhttpd/libmicrohttpd.la
+
+http_compression_SOURCES = \
+ http_compression.c
+http_compression_LDADD = \
+ $(top_builddir)/src/microhttpd/libmicrohttpd.la
+if HAVE_ZLIB
+ http_compression_LDADD += -lz
+endif
\ No newline at end of file
diff --git a/src/examples/http_compression.c b/src/examples/http_compression.c
new file mode 100644
index 00000000..a88be54e
--- /dev/null
+++ b/src/examples/http_compression.c
@@ -0,0 +1,177 @@
+/*
+ This file is part of libmicrohttpd
+ Copyright (C) 2019 Christian Grothoff (and other contributing authors)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
+*/
+/**
+ * @file http_compression.c
+ * @brief minimal example for how to compress HTTP response
+ * @author Silvio Clecio (silvioprog)
+ */
+
+#include "platform.h"
+#include <zlib.h>
+#include <microhttpd.h>
+
+#define PAGE \
+ "<html><head><title>HTTP compression</title></head><body>Hello, " \
+ "hello, hello. This is a 'hello world' message for the world, " \
+ "repeat, for the world.</body></html>"
+
+static int
+can_compress (struct MHD_Connection *con)
+{
+ const char *ae;
+ const char *de;
+
+ ae = MHD_lookup_connection_value (con,
+ MHD_HEADER_KIND,
+ MHD_HTTP_HEADER_ACCEPT_ENCODING);
+ if (NULL == ae)
+ return MHD_NO;
+ if (0 == strcmp (ae,
+ "*"))
+ return MHD_YES;
+ de = strstr (ae,
+ "deflate");
+ if (NULL == de)
+ return MHD_NO;
+ if (((de == ae) ||
+ (de[-1] == ',') ||
+ (de[-1] == ' ')) &&
+ ((de[strlen ("deflate")] == '\0') ||
+ (de[strlen ("deflate")] == ',') ||
+ (de[strlen ("deflate")] == ';')))
+ return MHD_YES;
+ return MHD_NO;
+}
+
+static int
+body_compress (void **buf,
+ size_t *buf_size)
+{
+ Bytef *cbuf;
+ uLongf cbuf_size;
+ int ret;
+
+ cbuf_size = compressBound (*buf_size);
+ cbuf = malloc (cbuf_size);
+ if (NULL == cbuf)
+ return MHD_NO;
+ ret = compress (cbuf,
+ &cbuf_size,
+ (const Bytef *) *buf,
+ *buf_size);
+ if ((Z_OK != ret) ||
+ (cbuf_size >= *buf_size))
+ {
+ /* compression failed */
+ free (cbuf);
+ return MHD_NO;
+ }
+ free (*buf);
+ *buf = (void *) cbuf;
+ *buf_size = (size_t) cbuf_size;
+ return MHD_YES;
+}
+
+static int
+ahc_echo (void *cls,
+ struct MHD_Connection *connection,
+ const char *url,
+ const char *method,
+ const char *version,
+ const char *upload_data, size_t *upload_data_size, void **ptr)
+{
+ struct MHD_Response *response;
+ int ret;
+ int comp;
+ size_t body_len;
+ char *body_str;
+ (void) url; /* Unused. Silent compiler warning. */
+ (void) version; /* Unused. Silent compiler warning. */
+ (void) upload_data; /* Unused. Silent compiler warning. */
+ (void) upload_data_size; /* Unused. Silent compiler warning. */
+
+ if (0 != strcmp (method, "GET"))
+ return MHD_NO; /* unexpected method */
+ if (!*ptr)
+ {
+ *ptr = (void *) 1;
+ return MHD_YES;
+ }
+ *ptr = NULL;
+
+ body_str = strdup (PAGE);
+ if (NULL == body_str)
+ {
+ return MHD_NO;
+ }
+ body_len = strlen (body_str);
+ /* try to compress the body */
+ comp = MHD_NO;
+ if (MHD_YES ==
+ can_compress (connection))
+ comp = body_compress ((void **) &body_str,
+ &body_len);
+ response = MHD_create_response_from_buffer (body_len,
+ body_str,
+ MHD_RESPMEM_MUST_FREE);
+ if (NULL == response)
+ {
+ free (body_str);
+ return MHD_NO;
+ }
+
+ if (MHD_YES == comp)
+ {
+ /* Need to indicate to client that body is compressed */
+ if (MHD_NO ==
+ MHD_add_response_header (response,
+ MHD_HTTP_HEADER_CONTENT_ENCODING,
+ "deflate"))
+ {
+ MHD_destroy_response (response);
+ return MHD_NO;
+ }
+ }
+ ret = MHD_queue_response (connection,
+ 200,
+ response);
+ MHD_destroy_response (response);
+ return ret;
+}
+
+int
+main (int argc, char *const *argv)
+{
+ struct MHD_Daemon *d;
+
+ if (argc != 2)
+ {
+ printf ("%s PORT\n", argv[0]);
+ return 1;
+ }
+ d = MHD_start_daemon (MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD |
MHD_USE_ERROR_LOG,
+ atoi (argv[1]), NULL, NULL,
+ &ahc_echo, NULL,
+ MHD_OPTION_END);
+ if (NULL == d)
+ return 1;
+ (void) getc (stdin);
+ MHD_stop_daemon (d);
+ return 0;
+}
--
To stop receiving notification emails like this one, please contact
address@hidden
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] [libmicrohttpd] branch master updated: Added minimal example for how to compress HTTP response. (#4914),
gnunet <=