From b04708178acf308a4416f2b264af85760f6219dc Mon Sep 17 00:00:00 2001
From: Andy Green <andy@warmcat.com>
Date: Tue, 20 Mar 2018 13:28:25 +0800
Subject: [PATCH] minimal: http-server-tls

---
 README.md                                     |  13 +--
 lib/tls/openssl/openssl-server.c              |   2 +-
 .../minimal-ws-proxy/CMakeLists.txt           |  13 +--
 .../minimal-http-client/CMakeLists.txt        |  14 +--
 minimal-examples/http-server/README.md        |   3 +-
 .../CMakeLists.txt                            |  13 +--
 .../minimal-http-server-libuv/CMakeLists.txt  |  13 +--
 .../CMakeLists.txt                            |  14 +--
 .../minimal-http-server-smp/CMakeLists.txt    |  13 +--
 .../minimal-http-server-tls/CMakeLists.txt    |  78 ++++++++++++++++
 .../minimal-http-server-tls/README.md         |  45 ++++++++++
 .../localhost-100y.cert                       |  34 +++++++
 .../localhost-100y.key                        |  52 +++++++++++
 .../minimal-http-server-tls.c                 |  84 ++++++++++++++++++
 .../mount-origin/404.html                     |   9 ++
 .../mount-origin/favicon.ico                  | Bin 0 -> 1406 bytes
 .../mount-origin/http2.png                    | Bin 0 -> 7563 bytes
 .../mount-origin/index.html                   |  39 ++++++++
 .../mount-origin/libwebsockets.org-logo.png   | Bin 0 -> 7029 bytes
 .../minimal-http-server/CMakeLists.txt        |  14 +--
 .../minimal-ws-client-rx/CMakeLists.txt       |  13 +--
 .../minimal-ws-client-tx/CMakeLists.txt       |  13 +--
 .../minimal-ws-broker/CMakeLists.txt          |  14 +--
 .../minimal-ws-server-pmd-bulk/CMakeLists.txt |  13 +--
 .../minimal-ws-server-pmd/CMakeLists.txt      |  13 +--
 .../minimal-ws-server-ring/CMakeLists.txt     |  13 +--
 .../minimal-ws-server-threads/CMakeLists.txt  |  13 +--
 .../minimal-ws-server/CMakeLists.txt          |  13 +--
 28 files changed, 458 insertions(+), 100 deletions(-)
 create mode 100644 minimal-examples/http-server/minimal-http-server-tls/CMakeLists.txt
 create mode 100644 minimal-examples/http-server/minimal-http-server-tls/README.md
 create mode 100644 minimal-examples/http-server/minimal-http-server-tls/localhost-100y.cert
 create mode 100644 minimal-examples/http-server/minimal-http-server-tls/localhost-100y.key
 create mode 100644 minimal-examples/http-server/minimal-http-server-tls/minimal-http-server-tls.c
 create mode 100644 minimal-examples/http-server/minimal-http-server-tls/mount-origin/404.html
 create mode 100644 minimal-examples/http-server/minimal-http-server-tls/mount-origin/favicon.ico
 create mode 100644 minimal-examples/http-server/minimal-http-server-tls/mount-origin/http2.png
 create mode 100644 minimal-examples/http-server/minimal-http-server-tls/mount-origin/index.html
 create mode 100644 minimal-examples/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.png

diff --git a/README.md b/README.md
index 851c5b98..0d60a88c 100644
--- a/README.md
+++ b/README.md
@@ -10,10 +10,10 @@ News
 
 ## Lws has the first official ws-over-h2 server support
 
-There's a new standard on the RFC track that enabled multiplexing ws connections
+There's a new standard on the RFC track that enables multiplexing ws connections
 over an http/2 link.  Compared to making individual tcp and tls connections for
 each ws link back to the same server, this makes your site start up radically
-faster, and since all the connections are in one tls tunnel, with much memory
+faster, and since all the connections are in one tls tunnel, with considerable memory
 reduction serverside.
 
 To enable it on master you just need -DLWS_WITH_HTTP2=1 at cmake.  No changes to
@@ -22,16 +22,17 @@ apis if you return your own headers, as shown in the test apps for several versi
 or to take advantage of ws-over-h2.  When built with http/2 support, it automatically
 falls back to http/1 and traditional ws upgrade if that's all the client can handle.
 
-Currently only Chrome Canary v67 supports this ws-over-h2 encapsulation but the other
-browsers will catch up soon.
+Currently only Chrome Canary v67 supports this ws-over-h2 encapsulation (chrome
+must be started with `--enable-websocket-over-http2` switch to enable it currently)
+but the other browsers will catch up soon.
 
 ## New "minimal examples"
 
 https://github.com/warmcat/libwebsockets/tree/master/minimal-examples
 
-These are like the test apps, but focus on doing one thing, the best way, with the minimum amount of code.  For example the minimal-http-server serves the cwd on http/1 or http/2 in 50 LOC.
+These are like the test apps, but focus on doing one thing, the best way, with the minimum amount of code.  For example the minimal-http-server serves the cwd on http/1 or http/2 in 50 LOC.  Same thing with tls is just three more lines.
 
-They also build standalone, so it's easier to copy them directly to start your own project; they
+They build standalone, so it's easier to copy them directly to start your own project; they
 are CC0 licensed (public domain) to facilitate that.
 
 ## Windows binary builds
diff --git a/lib/tls/openssl/openssl-server.c b/lib/tls/openssl/openssl-server.c
index ab24af4c..0c7f8c92 100644
--- a/lib/tls/openssl/openssl-server.c
+++ b/lib/tls/openssl/openssl-server.c
@@ -280,7 +280,7 @@ check_key:
 	if (extra_certs)
 		x = sk_X509_value(extra_certs, 0);
 	else
-		lwsl_err("%s: no extra certs\n", __func__);
+		lwsl_info("%s: no extra certs\n", __func__);
 #endif
 	if (!x) {
 		//lwsl_err("%s: x is NULL\n", __func__);
diff --git a/minimal-examples/client-server/minimal-ws-proxy/CMakeLists.txt b/minimal-examples/client-server/minimal-ws-proxy/CMakeLists.txt
index 006d260e..c3f7521c 100644
--- a/minimal-examples/client-server/minimal-ws-proxy/CMakeLists.txt
+++ b/minimal-examples/client-server/minimal-ws-proxy/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-ws-proxy)
 set(SRCS minimal-ws-proxy.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
diff --git a/minimal-examples/http-client/minimal-http-client/CMakeLists.txt b/minimal-examples/http-client/minimal-http-client/CMakeLists.txt
index 511362ed..f8b222cf 100644
--- a/minimal-examples/http-client/minimal-http-client/CMakeLists.txt
+++ b/minimal-examples/http-client/minimal-http-client/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-http-client)
 set(SRCS minimal-http-client.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
@@ -61,6 +62,7 @@ MACRO(require_lws_config reqconfig _val result)
 	endif()
 ENDMACRO()
 
+
 set(requirements 1)
 require_lws_config(LWS_WITHOUT_CLIENT 0 requirements)
 
diff --git a/minimal-examples/http-server/README.md b/minimal-examples/http-server/README.md
index 59535d8e..034e89d8 100644
--- a/minimal-examples/http-server/README.md
+++ b/minimal-examples/http-server/README.md
@@ -1,6 +1,7 @@
 |Example|Demonstrates|
 ---|---
-minimal-http-server|Serves a directory over http/1 or http/2, custom 404 handler
+minimal-http-server|Serves a directory over http/1, custom 404 handler
+minimal-http-server-tls|Serves a directory over http/1 or http/2 with TLS (SSL), custom 404 handler
 minimal-http-server-libuv|Same as minimal-http-server but libuv event loop
 minimal-http-server-multivhost|Same as minimal-http-server but three different vhosts
 minimal-http-server-smp|Multiple service threads
diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/CMakeLists.txt b/minimal-examples/http-server/minimal-http-server-dynamic/CMakeLists.txt
index 2943e46f..3286a419 100644
--- a/minimal-examples/http-server/minimal-http-server-dynamic/CMakeLists.txt
+++ b/minimal-examples/http-server/minimal-http-server-dynamic/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-http-server-dynamic)
 set(SRCS minimal-http-server-dynamic.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
diff --git a/minimal-examples/http-server/minimal-http-server-libuv/CMakeLists.txt b/minimal-examples/http-server/minimal-http-server-libuv/CMakeLists.txt
index 3a2a0e5a..dc56dcdd 100644
--- a/minimal-examples/http-server/minimal-http-server-libuv/CMakeLists.txt
+++ b/minimal-examples/http-server/minimal-http-server-libuv/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-http-server-libuv)
 set(SRCS minimal-http-server.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/CMakeLists.txt b/minimal-examples/http-server/minimal-http-server-multivhost/CMakeLists.txt
index 5684ff2f..ae0400dd 100644
--- a/minimal-examples/http-server/minimal-http-server-multivhost/CMakeLists.txt
+++ b/minimal-examples/http-server/minimal-http-server-multivhost/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-http-server-multivhost)
 set(SRCS minimal-http-server.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
@@ -60,7 +61,6 @@ MACRO(require_lws_config reqconfig _val result)
 	
 	endif()
 ENDMACRO()
-
 set(requirements 1)
 require_lws_config(LWS_WITHOUT_SERVER 0 requirements)
 
diff --git a/minimal-examples/http-server/minimal-http-server-smp/CMakeLists.txt b/minimal-examples/http-server/minimal-http-server-smp/CMakeLists.txt
index 59f49b75..fedd1550 100644
--- a/minimal-examples/http-server/minimal-http-server-smp/CMakeLists.txt
+++ b/minimal-examples/http-server/minimal-http-server-smp/CMakeLists.txt
@@ -1,6 +1,6 @@
 cmake_minimum_required(VERSION 2.8)
 include(CheckIncludeFile)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-http-server-smp)
 set(SRCS minimal-http-server-smp.c)
@@ -51,16 +51,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
diff --git a/minimal-examples/http-server/minimal-http-server-tls/CMakeLists.txt b/minimal-examples/http-server/minimal-http-server-tls/CMakeLists.txt
new file mode 100644
index 00000000..7c8e7d62
--- /dev/null
+++ b/minimal-examples/http-server/minimal-http-server-tls/CMakeLists.txt
@@ -0,0 +1,78 @@
+cmake_minimum_required(VERSION 2.8)
+include(CheckCSourceCompiles)
+
+set(SAMP lws-minimal-http-server-tls)
+set(SRCS minimal-http-server-tls.c)
+
+# If we are being built as part of lws, confirm current build config supports
+# reqconfig, else skip building ourselves.
+#
+# If we are being built externally, confirm installed lws was configured to
+# support reqconfig, else error out with a helpful message about the problem.
+#
+MACRO(require_lws_config reqconfig _val result)
+
+	if (DEFINED ${reqconfig})
+	if (${reqconfig})
+		set (rq 1)
+	else()
+		set (rq 0)
+	endif()
+	else()
+		set(rq 0)
+	endif()
+
+	if (${_val} EQUAL ${rq})
+		set(SAME 1)
+	else()
+		set(SAME 0)
+	endif()
+
+	if (LWS_WITH_MINIMAL_EXAMPLES AND NOT ${SAME})
+		if (${_val})
+			message("${SAMP}: skipping as lws being built without ${reqconfig}")
+		else()
+			message("${SAMP}: skipping as lws built with ${reqconfig}")
+		endif()
+		set(${result} 0)
+	else()
+		if (LWS_WITH_MINIMAL_EXAMPLES)
+			set(MET ${SAME})
+		else()
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
+			endif()
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
+				set(MET 1)
+			else()
+				set(MET 0)
+			endif()
+		endif()
+		if (NOT MET)
+			if (${_val})
+				message(FATAL_ERROR "This project requires lws must have been configured with ${reqconfig}")
+			else()
+				message(FATAL_ERROR "Lws configuration of ${reqconfig} is incompatible with this project")
+			endif()
+		endif()
+	
+	endif()
+ENDMACRO()
+
+set(requirements 1)
+require_lws_config(LWS_WITHOUT_SERVER 0 requirements)
+require_lws_config(LWS_OPENSSL_SUPPORT 1 requirements)
+
+if (requirements)
+	add_executable(${SAMP} ${SRCS})
+
+	if (websockets_shared)
+		target_link_libraries(${SAMP} websockets_shared)
+		add_dependencies(${SAMP} websockets_shared)
+	else()
+		target_link_libraries(${SAMP} websockets)
+	endif()
+endif()
diff --git a/minimal-examples/http-server/minimal-http-server-tls/README.md b/minimal-examples/http-server/minimal-http-server-tls/README.md
new file mode 100644
index 00000000..b10ffed6
--- /dev/null
+++ b/minimal-examples/http-server/minimal-http-server-tls/README.md
@@ -0,0 +1,45 @@
+# lws minimal http server with tls
+
+## build
+
+```
+ $ cmake . && make
+```
+
+## usage
+
+```
+ $ ./lws-minimal-http-server-tls
+[2018/03/20 13:23:13:0131] USER: LWS minimal http server TLS | visit https://localhost:7681
+[2018/03/20 13:23:13:0142] NOTICE: Creating Vhost 'default' port 7681, 1 protocols, IPv6 off
+[2018/03/20 13:23:13:0142] NOTICE:  Using SSL mode
+[2018/03/20 13:23:13:0146] NOTICE:  SSL ECDH curve 'prime256v1'
+[2018/03/20 13:23:13:0146] NOTICE:  HTTP2 / ALPN enabled
+[2018/03/20 13:23:13:0195] NOTICE: lws_tls_client_create_vhost_context: doing cert filepath localhost-100y.cert
+[2018/03/20 13:23:13:0195] NOTICE: Loaded client cert localhost-100y.cert
+[2018/03/20 13:23:13:0195] NOTICE: lws_tls_client_create_vhost_context: doing private key filepath
+[2018/03/20 13:23:13:0196] NOTICE: Loaded client cert private key localhost-100y.key
+[2018/03/20 13:23:13:0196] NOTICE: created client ssl context for default
+[2018/03/20 13:23:14:0207] NOTICE:    vhost default: cert expiry: 730459d
+```
+
+Visit https://localhost:7681
+
+Because it uses a selfsigned certificate, you will have to make an exception for it in your browser.
+
+## Certificate creation
+
+The selfsigned certs provided were created with
+
+```
+echo -e "GB\nErewhon\nAll around\nlibwebsockets-test\n\nlocalhost\nnone@invalid.org\n" | openssl req -new -newkey rsa:4096 -days 36500 -nodes -x509 -keyout "localhost-100y.key" -out "localhost-100y.cert"
+```
+
+they cover "localhost" and last 100 years from 2018-03-20.
+
+You can replace them with commercial certificates matching your hostname.
+
+## HTTP/2
+
+If you built lws with `-DLWS_WITH_HTTP2=1` at cmake, this simple server is also http/2 capable
+out of the box.  If the index.html was loaded over http/2, it will display an HTTP 2 png.
diff --git a/minimal-examples/http-server/minimal-http-server-tls/localhost-100y.cert b/minimal-examples/http-server/minimal-http-server-tls/localhost-100y.cert
new file mode 100644
index 00000000..6f372db4
--- /dev/null
+++ b/minimal-examples/http-server/minimal-http-server-tls/localhost-100y.cert
@@ -0,0 +1,34 @@
+-----BEGIN CERTIFICATE-----
+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
+e2Hl/7M0c/lbZ4FvXgARlex2rkgS0Ka06HE=
+-----END CERTIFICATE-----
diff --git a/minimal-examples/http-server/minimal-http-server-tls/localhost-100y.key b/minimal-examples/http-server/minimal-http-server-tls/localhost-100y.key
new file mode 100644
index 00000000..148f8598
--- /dev/null
+++ b/minimal-examples/http-server/minimal-http-server-tls/localhost-100y.key
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+fBrpEY1IATtPq1taBZZogRqI3rOkkPk=
+-----END PRIVATE KEY-----
diff --git a/minimal-examples/http-server/minimal-http-server-tls/minimal-http-server-tls.c b/minimal-examples/http-server/minimal-http-server-tls/minimal-http-server-tls.c
new file mode 100644
index 00000000..7afd0ffd
--- /dev/null
+++ b/minimal-examples/http-server/minimal-http-server-tls/minimal-http-server-tls.c
@@ -0,0 +1,84 @@
+/*
+ * lws-minimal-http-server-tls
+ *
+ * Copyright (C) 2018 Andy Green <andy@warmcat.com>
+ *
+ * This file is made available under the Creative Commons CC0 1.0
+ * Universal Public Domain Dedication.
+ *
+ * This demonstrates the most minimal http server you can make with lws,
+ * with three extra lines giving it tls (ssl) capabilities, which in
+ * turn allow operation with HTTP/2 if lws was configured for it.
+ *
+ * To keep it simple, it serves stuff from the subdirectory 
+ * "./mount-origin" of the directory it was started in.
+ *
+ * You can change that by changing mount.origin below.
+ */
+
+#include <libwebsockets.h>
+#include <string.h>
+#include <signal.h>
+
+static int interrupted;
+
+static const struct lws_http_mount mount = {
+	/* .mount_next */		NULL,		/* linked-list "next" */
+	/* .mountpoint */		"/",		/* mountpoint URL */
+	/* .origin */			"./mount-origin", /* serve from dir */
+	/* .def */			"index.html",	/* default filename */
+	/* .protocol */			NULL,
+	/* .cgienv */			NULL,
+	/* .extra_mimetypes */		NULL,
+	/* .interpret */		NULL,
+	/* .cgi_timeout */		0,
+	/* .cache_max_age */		0,
+	/* .auth_mask */		0,
+	/* .cache_reusable */		0,
+	/* .cache_revalidate */		0,
+	/* .cache_intermediaries */	0,
+	/* .origin_protocol */		LWSMPRO_FILE,	/* files in a dir */
+	/* .mountpoint_len */		1,		/* char count */
+	/* .basic_auth_login_file */	NULL,
+};
+
+void sigint_handler(int sig)
+{
+	interrupted = 1;
+}
+
+int main(int argc, char **argv)
+{
+	struct lws_context_creation_info info;
+	struct lws_context *context;
+	int n = 0;
+
+	signal(SIGINT, sigint_handler);
+
+	memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */
+	info.port = 7681;
+	info.mounts = &mount;
+	info.error_document_404 = "/404.html";
+
+	info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
+	info.ssl_cert_filepath = "localhost-100y.cert";
+	info.ssl_private_key_filepath = "localhost-100y.key";
+
+	lws_set_log_level(LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_USER
+			/* | LLL_INFO */ /* | LLL_DEBUG */, NULL);
+
+	lwsl_user("LWS minimal http server TLS | visit https://localhost:7681\n");
+
+	context = lws_create_context(&info);
+	if (!context) {
+		lwsl_err("lws init failed\n");
+		return 1;
+	}
+
+	while (n >= 0 && !interrupted)
+		n = lws_service(context, 1000);
+
+	lws_context_destroy(context);
+
+	return 0;
+}
diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/404.html b/minimal-examples/http-server/minimal-http-server-tls/mount-origin/404.html
new file mode 100644
index 00000000..1f7ae66e
--- /dev/null
+++ b/minimal-examples/http-server/minimal-http-server-tls/mount-origin/404.html
@@ -0,0 +1,9 @@
+<meta charset="UTF-8"> 
+<html>
+	<body>
+		<img src="libwebsockets.org-logo.png"><br>
+		<h1>404</h1>
+		Sorry, that file doesn't exist.
+	</body>
+</html>
+
diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/favicon.ico b/minimal-examples/http-server/minimal-http-server-tls/mount-origin/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..c0cc2e3dff34012ba3d4a7848a7ed17579788ec5
GIT binary patch
literal 1406
zcmZQzU}Ruq5D;JhgA7&%1~CQ(1`P%V29S^f14y0&EXTkIp}-`Ry|Mg1n7g4Wf+79t
z2ZrqYe+;>20vPVjzRB=<LjuF5*B2OyS3%T(6^;_4Aut*O!zKh6Nd`<zOpI)7Y@qT3
ztd|fUtO$wV;NW0nWo2b#XJ-eC65@juArUMrER39-oQ%xO%wSPMe6S*%#Q*;c3^07e
Soq+*{L1HjAh{nbTi2(qS_AI0T

literal 0
HcmV?d00001

diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/http2.png b/minimal-examples/http-server/minimal-http-server-tls/mount-origin/http2.png
new file mode 100644
index 0000000000000000000000000000000000000000..439bfa482fa00e69af2d562f17a6e89453eb98cc
GIT binary patch
literal 7563
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

literal 0
HcmV?d00001

diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/index.html b/minimal-examples/http-server/minimal-http-server-tls/mount-origin/index.html
new file mode 100644
index 00000000..d245a57d
--- /dev/null
+++ b/minimal-examples/http-server/minimal-http-server-tls/mount-origin/index.html
@@ -0,0 +1,39 @@
+ <meta charset="UTF-8"> 
+<html>
+	<body>
+		<img src="libwebsockets.org-logo.png"><br>
+	
+		Hello from the <b>minimal https server example</b>.
+		<br>
+		You can confirm the 404 page handler by going to this
+		nonexistant <a href="notextant.html">page</a>.
+		<br>
+		<div id="transport"></div>
+	</body>
+
+<script>
+
+window.onload = function() {
+
+var transport_protocol = "";
+
+if ( performance && performance.timing.nextHopProtocol ) {
+    transport_protocol = performance.timing.nextHopProtocol;
+} else if ( window.chrome && window.chrome.loadTimes ) {
+    transport_protocol = window.chrome.loadTimes().connectionInfo;
+} else {
+
+  var p = performance.getEntriesByType("resource");
+  for (var i=0; i < p.length; i++) {
+	var value = "nextHopProtocol" in p[i];
+	  if (value)
+	    transport_protocol = p[i].nextHopProtocol;
+    }
+   }
+   
+   if (transport_protocol == "h2")
+   	document.getElementById("transport").innerHTML = "<img src=\"/http2.png\">";
+}
+</script>
+</html>
+
diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.png b/minimal-examples/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..2060a10c936a0959f2a5c3a6b7fa60ac324f1a95
GIT binary patch
literal 7029
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

literal 0
HcmV?d00001

diff --git a/minimal-examples/http-server/minimal-http-server/CMakeLists.txt b/minimal-examples/http-server/minimal-http-server/CMakeLists.txt
index 457e817a..a17d4e9f 100644
--- a/minimal-examples/http-server/minimal-http-server/CMakeLists.txt
+++ b/minimal-examples/http-server/minimal-http-server/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-http-server)
 set(SRCS minimal-http-server.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
@@ -61,6 +62,7 @@ MACRO(require_lws_config reqconfig _val result)
 	endif()
 ENDMACRO()
 
+
 set(requirements 1)
 require_lws_config(LWS_WITHOUT_SERVER 0 requirements)
 
diff --git a/minimal-examples/ws-client/minimal-ws-client-rx/CMakeLists.txt b/minimal-examples/ws-client/minimal-ws-client-rx/CMakeLists.txt
index 22f69014..9548db3c 100644
--- a/minimal-examples/ws-client/minimal-ws-client-rx/CMakeLists.txt
+++ b/minimal-examples/ws-client/minimal-ws-client-rx/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-ws-client-rx)
 set(SRCS minimal-ws-client.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
diff --git a/minimal-examples/ws-client/minimal-ws-client-tx/CMakeLists.txt b/minimal-examples/ws-client/minimal-ws-client-tx/CMakeLists.txt
index 156d7c35..a43e3dc6 100644
--- a/minimal-examples/ws-client/minimal-ws-client-tx/CMakeLists.txt
+++ b/minimal-examples/ws-client/minimal-ws-client-tx/CMakeLists.txt
@@ -1,6 +1,6 @@
 cmake_minimum_required(VERSION 2.8)
 include(CheckIncludeFile)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-ws-client-tx)
 set(SRCS minimal-ws-client.c)
@@ -50,16 +50,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
diff --git a/minimal-examples/ws-server/minimal-ws-broker/CMakeLists.txt b/minimal-examples/ws-server/minimal-ws-broker/CMakeLists.txt
index 8ad44309..73fb25a8 100644
--- a/minimal-examples/ws-server/minimal-ws-broker/CMakeLists.txt
+++ b/minimal-examples/ws-server/minimal-ws-broker/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-ws-broker)
 set(SRCS minimal-ws-broker.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
@@ -60,7 +61,6 @@ MACRO(require_lws_config reqconfig _val result)
 	
 	endif()
 ENDMACRO()
-
 set(requirements 1)
 require_lws_config(LWS_WITHOUT_SERVER 0 requirements)
 
diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt b/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt
index 36af4b78..82b70652 100644
--- a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt
+++ b/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8.9)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-ws-server-pmd-bulk)
 set(SRCS minimal-ws-server-pmd-bulk.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd/CMakeLists.txt b/minimal-examples/ws-server/minimal-ws-server-pmd/CMakeLists.txt
index 8b9721b1..fb607abf 100644
--- a/minimal-examples/ws-server/minimal-ws-server-pmd/CMakeLists.txt
+++ b/minimal-examples/ws-server/minimal-ws-server-pmd/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8.9)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-ws-server-pmd)
 set(SRCS minimal-ws-server-pmd.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
diff --git a/minimal-examples/ws-server/minimal-ws-server-ring/CMakeLists.txt b/minimal-examples/ws-server/minimal-ws-server-ring/CMakeLists.txt
index 04e9d5bd..01445cf0 100644
--- a/minimal-examples/ws-server/minimal-ws-server-ring/CMakeLists.txt
+++ b/minimal-examples/ws-server/minimal-ws-server-ring/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-ws-server-ring)
 set(SRCS minimal-ws-server.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
diff --git a/minimal-examples/ws-server/minimal-ws-server-threads/CMakeLists.txt b/minimal-examples/ws-server/minimal-ws-server-threads/CMakeLists.txt
index 8b147749..4f232053 100644
--- a/minimal-examples/ws-server/minimal-ws-server-threads/CMakeLists.txt
+++ b/minimal-examples/ws-server/minimal-ws-server-threads/CMakeLists.txt
@@ -1,6 +1,6 @@
 cmake_minimum_required(VERSION 2.8)
 include(CheckIncludeFile)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-ws-server-threads)
 set(SRCS minimal-ws-server.c)
@@ -51,16 +51,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
diff --git a/minimal-examples/ws-server/minimal-ws-server/CMakeLists.txt b/minimal-examples/ws-server/minimal-ws-server/CMakeLists.txt
index 6ec72fe9..c0cb7cbc 100644
--- a/minimal-examples/ws-server/minimal-ws-server/CMakeLists.txt
+++ b/minimal-examples/ws-server/minimal-ws-server/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8)
-include(CheckSymbolExists)
+include(CheckCSourceCompiles)
 
 set(SAMP lws-minimal-ws-server)
 set(SRCS minimal-ws-server.c)
@@ -39,16 +39,17 @@ MACRO(require_lws_config reqconfig _val result)
 		if (LWS_WITH_MINIMAL_EXAMPLES)
 			set(MET ${SAME})
 		else()
-			CHECK_SYMBOL_EXISTS(${reqconfig} libwebsockets.h HAS)
-			if (NOT DEFINED HAS)
-				set(HAS 0)
+			CHECK_C_SOURCE_COMPILES("#include <libwebsockets.h>\nint main(void) {\n#if defined(${reqconfig})\n return 0;\n#else\n fail;\n#endif\n return 0;\n}\n" HAS_${reqconfig})
+			if (NOT DEFINED HAS_${reqconfig} OR NOT HAS_${reqconfig})
+				set(HAS_${reqconfig} 0)
+			else()
+				set(HAS_${reqconfig} 1)
 			endif()
-			if ((HAS AND ${_val}) OR (NOT HAS AND NOT ${_val}))
+			if ((HAS_${reqconfig} AND ${_val}) OR (NOT HAS_${reqconfig} AND NOT ${_val}))
 				set(MET 1)
 			else()
 				set(MET 0)
 			endif()
-	
 		endif()
 		if (NOT MET)
 			if (${_val})
-- 
GitLab