From patchwork Tue Apr 21 09:55:27 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Mingyu X-Patchwork-Id: 86931 Return-Path: Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 810C1F89226 for ; Tue, 21 Apr 2026 09:56:43 +0000 (UTC) Received: from esa6.hc1455-7.c3s2.iphmx.com (esa6.hc1455-7.c3s2.iphmx.com [68.232.139.139]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.20451.1776765395379089110 for ; Tue, 21 Apr 2026 02:56:41 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@fujitsu.com header.s=fj2 header.b=TisNopu3; spf=pass (domain: fujitsu.com, ip: 68.232.139.139, mailfrom: wangmy@fujitsu.com) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=fujitsu.com; i=@fujitsu.com; q=dns/txt; s=fj2; t=1776765399; x=1808301399; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ZS05PhLIA5kerR/8AyiFf8YT0XF95WJ63bvkyxyk7yA=; b=TisNopu361QFOayiMLWM0O5f9xtXkvtoPTGhZgAw/9uUff3hj993IfPK cB0qndU9ZvZZt2KYe4ZQjuUVS5mcL1ZYDcMeNGOCo3s2Fy7swBPQmpFPY XKZ1HqNYh2rU2DjiLFq6AvA4db1Y1tNWWTyijS26oMWpjPReoxGeUfGn6 2pdvj/pWhyB5gDOWVpBjdnXwhdXgXWz0iReMEzzomIdLOF2i5FIdyiTSt oY7VmTig/l5uFn8r3b4SksK8itff0+DPIrlnfzXTSn0VsAZtwDV9NJan/ ipxXBEhBKn5drZt2fEFio4W9dNVatFC6740bjd1AdpGvcIjfR2BDztTGO A==; X-CSE-ConnectionGUID: ZO6aNpcQTLKO56+mewfGcw== X-CSE-MsgGUID: gK8VUDFxRGuW0+P3GsaekA== X-IronPort-AV: E=McAfee;i="6800,10657,11762"; a="242133431" X-IronPort-AV: E=Sophos;i="6.23,191,1770562800"; d="scan'208";a="242133431" Received: from gmgwuk01.global.fujitsu.com ([172.187.114.235]) by esa6.hc1455-7.c3s2.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Apr 2026 18:56:38 +0900 Received: from az2uksmgm4.o.css.fujitsu.com (unknown [10.151.22.201]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by gmgwuk01.global.fujitsu.com (Postfix) with ESMTPS id B5AB61C1C721 for ; Tue, 21 Apr 2026 09:56:38 +0000 (UTC) Received: from az2uksmom2.o.css.fujitsu.com (az2uksmom2.o.css.fujitsu.com [10.151.22.203]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by az2uksmgm4.o.css.fujitsu.com (Postfix) with ESMTPS id 6C38B1400362 for ; Tue, 21 Apr 2026 09:56:38 +0000 (UTC) Received: from G08FNSTD200057.g08.fujitsu.local (unknown [10.167.135.104]) by az2uksmom2.o.css.fujitsu.com (Postfix) with ESMTP id E691D14002C2; Tue, 21 Apr 2026 09:56:34 +0000 (UTC) From: Wang Mingyu < wangmy@fujitsu.com> To: openembedded-core@lists.openembedded.org Cc: Wang Mingyu Subject: [OE-core] [PATCH 17/49] libmicrohttpd: upgrade 1.0.2 -> 1.0.5 Date: Tue, 21 Apr 2026 17:55:27 +0800 Message-ID: <20260421095559.1856-17-wangmy@fujitsu.com> X-Mailer: git-send-email 2.49.0.windows.1 In-Reply-To: <20260421095559.1856-1-wangmy@fujitsu.com> References: <20260421095559.1856-1-wangmy@fujitsu.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Tue, 21 Apr 2026 09:56:43 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/235625 From: Wang Mingyu 0001-Remove-broken-experimental-code.patch removed since it's included in 1.0.5 Signed-off-by: Wang Mingyu --- ...0001-Remove-broken-experimental-code.patch | 14472 ---------------- ...ohttpd_1.0.2.bb => libmicrohttpd_1.0.5.bb} | 5 +- 2 files changed, 2 insertions(+), 14475 deletions(-) delete mode 100644 meta/recipes-support/libmicrohttpd/files/0001-Remove-broken-experimental-code.patch rename meta/recipes-support/libmicrohttpd/{libmicrohttpd_1.0.2.bb => libmicrohttpd_1.0.5.bb} (78%) diff --git a/meta/recipes-support/libmicrohttpd/files/0001-Remove-broken-experimental-code.patch b/meta/recipes-support/libmicrohttpd/files/0001-Remove-broken-experimental-code.patch deleted file mode 100644 index c4b00ec6f4..0000000000 --- a/meta/recipes-support/libmicrohttpd/files/0001-Remove-broken-experimental-code.patch +++ /dev/null @@ -1,14472 +0,0 @@ -From 3f5e5ad634d605373e3cd34ddea4cb6af27b4f43 Mon Sep 17 00:00:00 2001 -From: Changqing Li -Date: Thu, 13 Nov 2025 13:42:41 +0800 -Subject: [PATCH] Remove broken experimental code - -Upstream-Status: Backport [https://git.gnunet.org/libmicrohttpd.git/commit/?id=ff13abc1c1d7d2b30d69d5c0bd4a237e1801c50b -https://git.gnunet.org/libmicrohttpd.git/commit/?id=ba8f88fcb47cfb0de5237d47f9487cd1f350cbe9] - -CVE: CVE-2025-59777,CVE-2025-62689 - -Signed-off-by: Changqing Li ---- - configure.ac | 1 - - src/Makefile.am | 5 - - src/microhttpd_ws/Makefile.am | 43 - - src/microhttpd_ws/Makefile.in | 1298 ---- - src/microhttpd_ws/mhd_websocket.c | 2443 ------- - src/microhttpd_ws/sha1.c | 378 - - src/microhttpd_ws/sha1.h | 110 - - src/microhttpd_ws/test_websocket.c | 10105 --------------------------- - 8 files changed, 14383 deletions(-) - delete mode 100644 src/microhttpd_ws/Makefile.am - delete mode 100644 src/microhttpd_ws/Makefile.in - delete mode 100644 src/microhttpd_ws/mhd_websocket.c - delete mode 100644 src/microhttpd_ws/sha1.c - delete mode 100644 src/microhttpd_ws/sha1.h - delete mode 100644 src/microhttpd_ws/test_websocket.c - -diff --git a/configure.ac b/configure.ac -index 17dc192..50fbf54 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -5929,7 +5929,6 @@ m4/Makefile - src/Makefile - src/include/Makefile - src/microhttpd/Makefile --src/microhttpd_ws/Makefile - src/examples/Makefile - src/tools/Makefile - src/testcurl/Makefile -diff --git a/src/Makefile.am b/src/Makefile.am -index d02ab8f..07d8f3d 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -9,11 +9,6 @@ SUBDIRS += testzzuf - endif - endif - --# Finally (last!) also build experimental lib... --if HAVE_EXPERIMENTAL --SUBDIRS += microhttpd_ws --endif -- - if BUILD_EXAMPLES - SUBDIRS += examples - endif -diff --git a/src/microhttpd_ws/Makefile.am b/src/microhttpd_ws/Makefile.am -deleted file mode 100644 -index 3ce8a9f..0000000 ---- a/src/microhttpd_ws/Makefile.am -+++ /dev/null -@@ -1,43 +0,0 @@ --# This Makefile.am is in the public domain --AM_CPPFLAGS = \ -- -I$(top_srcdir)/src/include \ -- -I$(top_srcdir)/src/microhttpd -- --AM_CFLAGS = $(HIDDEN_VISIBILITY_CFLAGS) -- --$(top_builddir)/src/microhttpd/libmicrohttpd.la: $(top_builddir)/src/microhttpd/Makefile -- @echo ' cd $(top_builddir)/src/microhttpd && $(MAKE) $(AM_MAKEFLAGS) libmicrohttpd.la'; \ -- $(am__cd) $(top_builddir)/src/microhttpd && $(MAKE) $(AM_MAKEFLAGS) libmicrohttpd.la -- --noinst_DATA = --MOSTLYCLEANFILES = -- --SUBDIRS = . -- --lib_LTLIBRARIES = \ -- libmicrohttpd_ws.la --libmicrohttpd_ws_la_SOURCES = \ -- sha1.c sha1.h \ -- mhd_websocket.c --libmicrohttpd_ws_la_CPPFLAGS = \ -- $(AM_CPPFLAGS) $(MHD_LIB_CPPFLAGS) \ -- -DBUILDING_MHD_LIB=1 --libmicrohttpd_ws_la_CFLAGS = \ -- $(AM_CFLAGS) $(MHD_LIB_CFLAGS) --libmicrohttpd_ws_la_LDFLAGS = \ -- $(MHD_LIB_LDFLAGS) \ -- $(W32_MHD_LIB_LDFLAGS) \ -- -version-info 0:0:0 --libmicrohttpd_ws_la_LIBADD = \ -- $(MHD_LIBDEPS) -- --TESTS = $(check_PROGRAMS) -- --check_PROGRAMS = \ -- test_websocket -- --test_websocket_SOURCES = \ -- test_websocket.c --test_websocket_LDADD = \ -- $(top_builddir)/src/microhttpd_ws/libmicrohttpd_ws.la \ -- $(top_builddir)/src/microhttpd/libmicrohttpd.la -diff --git a/src/microhttpd_ws/Makefile.in b/src/microhttpd_ws/Makefile.in -deleted file mode 100644 -index 43571e7..0000000 ---- a/src/microhttpd_ws/Makefile.in -+++ /dev/null -@@ -1,1298 +0,0 @@ --# Makefile.in generated by automake 1.16.5 from Makefile.am. --# @configure_input@ -- --# Copyright (C) 1994-2021 Free Software Foundation, Inc. -- --# This Makefile.in is free software; the Free Software Foundation --# gives unlimited permission to copy and/or distribute it, --# with or without modifications, as long as this notice is preserved. -- --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY, to the extent permitted by law; without --# even the implied warranty of MERCHANTABILITY or FITNESS FOR A --# PARTICULAR PURPOSE. -- --@SET_MAKE@ -- -- --VPATH = @srcdir@ --am__is_gnu_make = { \ -- if test -z '$(MAKELEVEL)'; then \ -- false; \ -- elif test -n '$(MAKE_HOST)'; then \ -- true; \ -- elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ -- true; \ -- else \ -- false; \ -- fi; \ --} --am__make_running_with_option = \ -- case $${target_option-} in \ -- ?) ;; \ -- *) echo "am__make_running_with_option: internal error: invalid" \ -- "target option '$${target_option-}' specified" >&2; \ -- exit 1;; \ -- esac; \ -- has_opt=no; \ -- sane_makeflags=$$MAKEFLAGS; \ -- if $(am__is_gnu_make); then \ -- sane_makeflags=$$MFLAGS; \ -- else \ -- case $$MAKEFLAGS in \ -- *\\[\ \ ]*) \ -- bs=\\; \ -- sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ -- | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ -- esac; \ -- fi; \ -- skip_next=no; \ -- strip_trailopt () \ -- { \ -- flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ -- }; \ -- for flg in $$sane_makeflags; do \ -- test $$skip_next = yes && { skip_next=no; continue; }; \ -- case $$flg in \ -- *=*|--*) continue;; \ -- -*I) strip_trailopt 'I'; skip_next=yes;; \ -- -*I?*) strip_trailopt 'I';; \ -- -*O) strip_trailopt 'O'; skip_next=yes;; \ -- -*O?*) strip_trailopt 'O';; \ -- -*l) strip_trailopt 'l'; skip_next=yes;; \ -- -*l?*) strip_trailopt 'l';; \ -- -[dEDm]) skip_next=yes;; \ -- -[JT]) skip_next=yes;; \ -- esac; \ -- case $$flg in \ -- *$$target_option*) has_opt=yes; break;; \ -- esac; \ -- done; \ -- test $$has_opt = yes --am__make_dryrun = (target_option=n; $(am__make_running_with_option)) --am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) --pkgdatadir = $(datadir)/@PACKAGE@ --pkgincludedir = $(includedir)/@PACKAGE@ --pkglibdir = $(libdir)/@PACKAGE@ --pkglibexecdir = $(libexecdir)/@PACKAGE@ --am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd --install_sh_DATA = $(install_sh) -c -m 644 --install_sh_PROGRAM = $(install_sh) -c --install_sh_SCRIPT = $(install_sh) -c --INSTALL_HEADER = $(INSTALL_DATA) --transform = $(program_transform_name) --NORMAL_INSTALL = : --PRE_INSTALL = : --POST_INSTALL = : --NORMAL_UNINSTALL = : --PRE_UNINSTALL = : --POST_UNINSTALL = : --build_triplet = @build@ --host_triplet = @host@ --check_PROGRAMS = test_websocket$(EXEEXT) --subdir = src/microhttpd_ws --ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 --am__aclocal_m4_deps = $(top_srcdir)/m4/ac_define_dir.m4 \ -- $(top_srcdir)/m4/ax_append_compile_flags.m4 \ -- $(top_srcdir)/m4/ax_append_flag.m4 \ -- $(top_srcdir)/m4/ax_append_link_flags.m4 \ -- $(top_srcdir)/m4/ax_check_compile_flag.m4 \ -- $(top_srcdir)/m4/ax_check_link_flag.m4 \ -- $(top_srcdir)/m4/ax_count_cpus.m4 \ -- $(top_srcdir)/m4/ax_pthread.m4 \ -- $(top_srcdir)/m4/ax_require_defined.m4 \ -- $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libgcrypt.m4 \ -- $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ -- $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ -- $(top_srcdir)/m4/lt~obsolete.m4 \ -- $(top_srcdir)/m4/mhd_append_flag_to_var.m4 \ -- $(top_srcdir)/m4/mhd_bool.m4 \ -- $(top_srcdir)/m4/mhd_check_add_cc_cflag.m4 \ -- $(top_srcdir)/m4/mhd_check_add_cc_cflags.m4 \ -- $(top_srcdir)/m4/mhd_check_add_cc_ldflag.m4 \ -- $(top_srcdir)/m4/mhd_check_add_cc_ldflags.m4 \ -- $(top_srcdir)/m4/mhd_check_cc_cflag.m4 \ -- $(top_srcdir)/m4/mhd_check_func.m4 \ -- $(top_srcdir)/m4/mhd_check_func_gettimeofday.m4 \ -- $(top_srcdir)/m4/mhd_check_func_run.m4 \ -- $(top_srcdir)/m4/mhd_check_link_run.m4 \ -- $(top_srcdir)/m4/mhd_find_add_cc_cflag.m4 \ -- $(top_srcdir)/m4/mhd_find_add_cc_cflag_ifelse.m4 \ -- $(top_srcdir)/m4/mhd_find_lib.m4 \ -- $(top_srcdir)/m4/mhd_norm_expd.m4 \ -- $(top_srcdir)/m4/mhd_prepend_flag_to_var.m4 \ -- $(top_srcdir)/m4/mhd_shutdown_socket_trigger.m4 \ -- $(top_srcdir)/m4/mhd_sys_extentions.m4 $(top_srcdir)/m4/pkg.m4 \ -- $(top_srcdir)/configure.ac --am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ -- $(ACLOCAL_M4) --DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) --mkinstalldirs = $(install_sh) -d --CONFIG_HEADER = $(top_builddir)/MHD_config.h --CONFIG_CLEAN_FILES = --CONFIG_CLEAN_VPATH_FILES = --am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; --am__vpath_adj = case $$p in \ -- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ -- *) f=$$p;; \ -- esac; --am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; --am__install_max = 40 --am__nobase_strip_setup = \ -- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` --am__nobase_strip = \ -- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" --am__nobase_list = $(am__nobase_strip_setup); \ -- for p in $$list; do echo "$$p $$p"; done | \ -- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ -- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ -- if (++n[$$2] == $(am__install_max)) \ -- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ -- END { for (dir in files) print dir, files[dir] }' --am__base_list = \ -- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ -- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' --am__uninstall_files_from_dir = { \ -- test -z "$$files" \ -- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ -- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ -- $(am__cd) "$$dir" && rm -f $$files; }; \ -- } --am__installdirs = "$(DESTDIR)$(libdir)" --LTLIBRARIES = $(lib_LTLIBRARIES) --am__DEPENDENCIES_1 = --libmicrohttpd_ws_la_DEPENDENCIES = $(am__DEPENDENCIES_1) --am_libmicrohttpd_ws_la_OBJECTS = libmicrohttpd_ws_la-sha1.lo \ -- libmicrohttpd_ws_la-mhd_websocket.lo --libmicrohttpd_ws_la_OBJECTS = $(am_libmicrohttpd_ws_la_OBJECTS) --AM_V_lt = $(am__v_lt_@AM_V@) --am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) --am__v_lt_0 = --silent --am__v_lt_1 = --libmicrohttpd_ws_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ -- $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ -- $(libmicrohttpd_ws_la_CFLAGS) $(CFLAGS) \ -- $(libmicrohttpd_ws_la_LDFLAGS) $(LDFLAGS) -o $@ --am_test_websocket_OBJECTS = test_websocket.$(OBJEXT) --test_websocket_OBJECTS = $(am_test_websocket_OBJECTS) --test_websocket_DEPENDENCIES = \ -- $(top_builddir)/src/microhttpd_ws/libmicrohttpd_ws.la \ -- $(top_builddir)/src/microhttpd/libmicrohttpd.la --AM_V_P = $(am__v_P_@AM_V@) --am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) --am__v_P_0 = false --am__v_P_1 = : --AM_V_GEN = $(am__v_GEN_@AM_V@) --am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) --am__v_GEN_0 = @echo " GEN " $@; --am__v_GEN_1 = --AM_V_at = $(am__v_at_@AM_V@) --am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) --am__v_at_0 = @ --am__v_at_1 = --DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) --depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp --am__maybe_remake_depfiles = depfiles --am__depfiles_remade = \ -- ./$(DEPDIR)/libmicrohttpd_ws_la-mhd_websocket.Plo \ -- ./$(DEPDIR)/libmicrohttpd_ws_la-sha1.Plo \ -- ./$(DEPDIR)/test_websocket.Po --am__mv = mv -f --COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ -- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) --LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ -- $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ -- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -- $(AM_CFLAGS) $(CFLAGS) --AM_V_CC = $(am__v_CC_@AM_V@) --am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) --am__v_CC_0 = @echo " CC " $@; --am__v_CC_1 = --CCLD = $(CC) --LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ -- $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ -- $(AM_LDFLAGS) $(LDFLAGS) -o $@ --AM_V_CCLD = $(am__v_CCLD_@AM_V@) --am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) --am__v_CCLD_0 = @echo " CCLD " $@; --am__v_CCLD_1 = --SOURCES = $(libmicrohttpd_ws_la_SOURCES) $(test_websocket_SOURCES) --DIST_SOURCES = $(libmicrohttpd_ws_la_SOURCES) \ -- $(test_websocket_SOURCES) --RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ -- ctags-recursive dvi-recursive html-recursive info-recursive \ -- install-data-recursive install-dvi-recursive \ -- install-exec-recursive install-html-recursive \ -- install-info-recursive install-pdf-recursive \ -- install-ps-recursive install-recursive installcheck-recursive \ -- installdirs-recursive pdf-recursive ps-recursive \ -- tags-recursive uninstall-recursive --am__can_run_installinfo = \ -- case $$AM_UPDATE_INFO_DIR in \ -- n|no|NO) false;; \ -- *) (install-info --version) >/dev/null 2>&1;; \ -- esac --DATA = $(noinst_DATA) --RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ -- distclean-recursive maintainer-clean-recursive --am__recursive_targets = \ -- $(RECURSIVE_TARGETS) \ -- $(RECURSIVE_CLEAN_TARGETS) \ -- $(am__extra_recursive_targets) --AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ -- check recheck distdir distdir-am --am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) --# Read a list of newline-separated strings from the standard input, --# and print each of them once, without duplicates. Input order is --# *not* preserved. --am__uniquify_input = $(AWK) '\ -- BEGIN { nonempty = 0; } \ -- { items[$$0] = 1; nonempty = 1; } \ -- END { if (nonempty) { for (i in items) print i; }; } \ --' --# Make sure the list of sources is unique. This is necessary because, --# e.g., the same source file might be shared among _SOURCES variables --# for different programs/libraries. --am__define_uniq_tagged_files = \ -- list='$(am__tagged_files)'; \ -- unique=`for i in $$list; do \ -- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -- done | $(am__uniquify_input)` --am__tty_colors_dummy = \ -- mgn= red= grn= lgn= blu= brg= std=; \ -- am__color_tests=no --am__tty_colors = { \ -- $(am__tty_colors_dummy); \ -- if test "X$(AM_COLOR_TESTS)" = Xno; then \ -- am__color_tests=no; \ -- elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ -- am__color_tests=yes; \ -- elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ -- am__color_tests=yes; \ -- fi; \ -- if test $$am__color_tests = yes; then \ -- red=''; \ -- grn=''; \ -- lgn=''; \ -- blu=''; \ -- mgn=''; \ -- brg=''; \ -- std=''; \ -- fi; \ --} --am__recheck_rx = ^[ ]*:recheck:[ ]* --am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* --am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* --# A command that, given a newline-separated list of test names on the --# standard input, print the name of the tests that are to be re-run --# upon "make recheck". --am__list_recheck_tests = $(AWK) '{ \ -- recheck = 1; \ -- while ((rc = (getline line < ($$0 ".trs"))) != 0) \ -- { \ -- if (rc < 0) \ -- { \ -- if ((getline line2 < ($$0 ".log")) < 0) \ -- recheck = 0; \ -- break; \ -- } \ -- else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ -- { \ -- recheck = 0; \ -- break; \ -- } \ -- else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ -- { \ -- break; \ -- } \ -- }; \ -- if (recheck) \ -- print $$0; \ -- close ($$0 ".trs"); \ -- close ($$0 ".log"); \ --}' --# A command that, given a newline-separated list of test names on the --# standard input, create the global log from their .trs and .log files. --am__create_global_log = $(AWK) ' \ --function fatal(msg) \ --{ \ -- print "fatal: making $@: " msg | "cat >&2"; \ -- exit 1; \ --} \ --function rst_section(header) \ --{ \ -- print header; \ -- len = length(header); \ -- for (i = 1; i <= len; i = i + 1) \ -- printf "="; \ -- printf "\n\n"; \ --} \ --{ \ -- copy_in_global_log = 1; \ -- global_test_result = "RUN"; \ -- while ((rc = (getline line < ($$0 ".trs"))) != 0) \ -- { \ -- if (rc < 0) \ -- fatal("failed to read from " $$0 ".trs"); \ -- if (line ~ /$(am__global_test_result_rx)/) \ -- { \ -- sub("$(am__global_test_result_rx)", "", line); \ -- sub("[ ]*$$", "", line); \ -- global_test_result = line; \ -- } \ -- else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ -- copy_in_global_log = 0; \ -- }; \ -- if (copy_in_global_log) \ -- { \ -- rst_section(global_test_result ": " $$0); \ -- while ((rc = (getline line < ($$0 ".log"))) != 0) \ -- { \ -- if (rc < 0) \ -- fatal("failed to read from " $$0 ".log"); \ -- print line; \ -- }; \ -- printf "\n"; \ -- }; \ -- close ($$0 ".trs"); \ -- close ($$0 ".log"); \ --}' --# Restructured Text title. --am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } --# Solaris 10 'make', and several other traditional 'make' implementations, --# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it --# by disabling -e (using the XSI extension "set +e") if it's set. --am__sh_e_setup = case $$- in *e*) set +e;; esac --# Default flags passed to test drivers. --am__common_driver_flags = \ -- --color-tests "$$am__color_tests" \ -- --enable-hard-errors "$$am__enable_hard_errors" \ -- --expect-failure "$$am__expect_failure" --# To be inserted before the command running the test. Creates the --# directory for the log if needed. Stores in $dir the directory --# containing $f, in $tst the test, in $log the log. Executes the --# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and --# passes TESTS_ENVIRONMENT. Set up options for the wrapper that --# will run the test scripts (or their associated LOG_COMPILER, if --# thy have one). --am__check_pre = \ --$(am__sh_e_setup); \ --$(am__vpath_adj_setup) $(am__vpath_adj) \ --$(am__tty_colors); \ --srcdir=$(srcdir); export srcdir; \ --case "$@" in \ -- */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ -- *) am__odir=.;; \ --esac; \ --test "x$$am__odir" = x"." || test -d "$$am__odir" \ -- || $(MKDIR_P) "$$am__odir" || exit $$?; \ --if test -f "./$$f"; then dir=./; \ --elif test -f "$$f"; then dir=; \ --else dir="$(srcdir)/"; fi; \ --tst=$$dir$$f; log='$@'; \ --if test -n '$(DISABLE_HARD_ERRORS)'; then \ -- am__enable_hard_errors=no; \ --else \ -- am__enable_hard_errors=yes; \ --fi; \ --case " $(XFAIL_TESTS) " in \ -- *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ -- am__expect_failure=yes;; \ -- *) \ -- am__expect_failure=no;; \ --esac; \ --$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) --# A shell command to get the names of the tests scripts with any registered --# extension removed (i.e., equivalently, the names of the test logs, with --# the '.log' extension removed). The result is saved in the shell variable --# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, --# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", --# since that might cause problem with VPATH rewrites for suffix-less tests. --# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. --am__set_TESTS_bases = \ -- bases='$(TEST_LOGS)'; \ -- bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ -- bases=`echo $$bases` --AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' --RECHECK_LOGS = $(TEST_LOGS) --TEST_SUITE_LOG = test-suite.log --TEST_EXTENSIONS = @EXEEXT@ .test --LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver --LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) --am__set_b = \ -- case '$@' in \ -- */*) \ -- case '$*' in \ -- */*) b='$*';; \ -- *) b=`echo '$@' | sed 's/\.log$$//'`; \ -- esac;; \ -- *) \ -- b='$*';; \ -- esac --am__test_logs1 = $(TESTS:=.log) --am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) --TEST_LOGS = $(am__test_logs2:.test.log=.log) --TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver --TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ -- $(TEST_LOG_FLAGS) --DIST_SUBDIRS = $(SUBDIRS) --am__DIST_COMMON = $(srcdir)/Makefile.in \ -- $(top_srcdir)/build-aux/depcomp \ -- $(top_srcdir)/build-aux/test-driver --DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) --am__relativize = \ -- dir0=`pwd`; \ -- sed_first='s,^\([^/]*\)/.*$$,\1,'; \ -- sed_rest='s,^[^/]*/*,,'; \ -- sed_last='s,^.*/\([^/]*\)$$,\1,'; \ -- sed_butlast='s,/*[^/]*$$,,'; \ -- while test -n "$$dir1"; do \ -- first=`echo "$$dir1" | sed -e "$$sed_first"`; \ -- if test "$$first" != "."; then \ -- if test "$$first" = ".."; then \ -- dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ -- dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ -- else \ -- first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ -- if test "$$first2" = "$$first"; then \ -- dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ -- else \ -- dir2="../$$dir2"; \ -- fi; \ -- dir0="$$dir0"/"$$first"; \ -- fi; \ -- fi; \ -- dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ -- done; \ -- reldir="$$dir2" --ACLOCAL = @ACLOCAL@ --AMTAR = @AMTAR@ --AM_ASAN_OPTIONS = @AM_ASAN_OPTIONS@ --AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ --AM_LSAN_OPTIONS = @AM_LSAN_OPTIONS@ --AM_UBSAN_OPTIONS = @AM_UBSAN_OPTIONS@ --AR = @AR@ --AS = @AS@ --AUTOCONF = @AUTOCONF@ --AUTOHEADER = @AUTOHEADER@ --AUTOMAKE = @AUTOMAKE@ --AWK = @AWK@ --CC = @CC@ --CCDEPMODE = @CCDEPMODE@ --CFLAGS = @CFLAGS@ --CFLAGS_ac = @CFLAGS_ac@ --CPP = @CPP@ --CPPFLAGS = @CPPFLAGS@ --CPPFLAGS_ac = @CPPFLAGS_ac@ --CPU_COUNT = @CPU_COUNT@ --CSCOPE = @CSCOPE@ --CTAGS = @CTAGS@ --CYGPATH_W = @CYGPATH_W@ --DEFS = @DEFS@ --DEPDIR = @DEPDIR@ --DLLTOOL = @DLLTOOL@ --DSYMUTIL = @DSYMUTIL@ --DUMPBIN = @DUMPBIN@ --ECHO_C = @ECHO_C@ --ECHO_N = @ECHO_N@ --ECHO_T = @ECHO_T@ --EGREP = @EGREP@ --EMPTY_VAR = @EMPTY_VAR@ --ETAGS = @ETAGS@ --EXEEXT = @EXEEXT@ --FGREP = @FGREP@ --FILECMD = @FILECMD@ --GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ --GNUTLS_CPPFLAGS = @GNUTLS_CPPFLAGS@ --GNUTLS_LDFLAGS = @GNUTLS_LDFLAGS@ --GNUTLS_LIBS = @GNUTLS_LIBS@ --GREP = @GREP@ --HAVE_CURL_BINARY = @HAVE_CURL_BINARY@ --HAVE_MAKEINFO_BINARY = @HAVE_MAKEINFO_BINARY@ --HIDDEN_VISIBILITY_CFLAGS = @HIDDEN_VISIBILITY_CFLAGS@ --INSTALL = @INSTALL@ --INSTALL_DATA = @INSTALL_DATA@ --INSTALL_PROGRAM = @INSTALL_PROGRAM@ --INSTALL_SCRIPT = @INSTALL_SCRIPT@ --INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ --LD = @LD@ --LDFLAGS = @LDFLAGS@ --LDFLAGS_ac = @LDFLAGS_ac@ --LIBCURL = @LIBCURL@ --LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ --LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ --LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ --LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ --LIBOBJS = @LIBOBJS@ --LIBS = @LIBS@ --LIBTOOL = @LIBTOOL@ --LIB_VERSION_AGE = @LIB_VERSION_AGE@ --LIB_VERSION_CURRENT = @LIB_VERSION_CURRENT@ --LIB_VERSION_REVISION = @LIB_VERSION_REVISION@ --LIPO = @LIPO@ --LN_S = @LN_S@ --LTLIBOBJS = @LTLIBOBJS@ --LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ --MAKEINFO = @MAKEINFO@ --MANIFEST_TOOL = @MANIFEST_TOOL@ --MHD_AUX_DIR = @MHD_AUX_DIR@ --MHD_LIBDEPS = @MHD_LIBDEPS@ --MHD_LIBDEPS_PKGCFG = @MHD_LIBDEPS_PKGCFG@ --MHD_LIB_CFLAGS = @MHD_LIB_CFLAGS@ --MHD_LIB_CPPFLAGS = @MHD_LIB_CPPFLAGS@ --MHD_LIB_LDFLAGS = @MHD_LIB_LDFLAGS@ --MHD_PLUGIN_INSTALL_PREFIX = @MHD_PLUGIN_INSTALL_PREFIX@ --MHD_REQ_PRIVATE = @MHD_REQ_PRIVATE@ --MHD_TLS_LIBDEPS = @MHD_TLS_LIBDEPS@ --MHD_TLS_LIB_CFLAGS = @MHD_TLS_LIB_CFLAGS@ --MHD_TLS_LIB_CPPFLAGS = @MHD_TLS_LIB_CPPFLAGS@ --MHD_TLS_LIB_LDFLAGS = @MHD_TLS_LIB_LDFLAGS@ --MHD_W32_DLL_SUFF = @MHD_W32_DLL_SUFF@ --MKDIR_P = @MKDIR_P@ --MS_LIB_TOOL = @MS_LIB_TOOL@ --NM = @NM@ --NMEDIT = @NMEDIT@ --OBJDUMP = @OBJDUMP@ --OBJEXT = @OBJEXT@ --OTOOL = @OTOOL@ --OTOOL64 = @OTOOL64@ --PACKAGE = @PACKAGE@ --PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ --PACKAGE_NAME = @PACKAGE_NAME@ --PACKAGE_STRING = @PACKAGE_STRING@ --PACKAGE_TARNAME = @PACKAGE_TARNAME@ --PACKAGE_URL = @PACKAGE_URL@ --PACKAGE_VERSION = @PACKAGE_VERSION@ --PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ --PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ --PACKAGE_VERSION_SUBMINOR = @PACKAGE_VERSION_SUBMINOR@ --PATH_SEPARATOR = @PATH_SEPARATOR@ --PKG_CONFIG = @PKG_CONFIG@ --PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ --PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ --PTHREAD_CC = @PTHREAD_CC@ --PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ --PTHREAD_CXX = @PTHREAD_CXX@ --PTHREAD_LIBS = @PTHREAD_LIBS@ --RANLIB = @RANLIB@ --RC = @RC@ --SED = @SED@ --SET_MAKE = @SET_MAKE@ --SHELL = @SHELL@ --SOCAT = @SOCAT@ --STRIP = @STRIP@ --TESTS_ENVIRONMENT_ac = @TESTS_ENVIRONMENT_ac@ --VERSION = @VERSION@ --W32CRT = @W32CRT@ --ZZUF = @ZZUF@ --_libcurl_config = @_libcurl_config@ --abs_builddir = @abs_builddir@ --abs_srcdir = @abs_srcdir@ --abs_top_builddir = @abs_top_builddir@ --abs_top_srcdir = @abs_top_srcdir@ --ac_configure_args = @ac_configure_args@ --ac_ct_AR = @ac_ct_AR@ --ac_ct_CC = @ac_ct_CC@ --ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ --am__include = @am__include@ --am__leading_dot = @am__leading_dot@ --am__quote = @am__quote@ --am__tar = @am__tar@ --am__untar = @am__untar@ --ax_pthread_config = @ax_pthread_config@ --bindir = @bindir@ --build = @build@ --build_alias = @build_alias@ --build_cpu = @build_cpu@ --build_os = @build_os@ --build_vendor = @build_vendor@ --builddir = @builddir@ --datadir = @datadir@ --datarootdir = @datarootdir@ --docdir = @docdir@ --dvidir = @dvidir@ --exec_prefix = @exec_prefix@ --host = @host@ --host_alias = @host_alias@ --host_cpu = @host_cpu@ --host_os = @host_os@ --host_vendor = @host_vendor@ --htmldir = @htmldir@ --includedir = @includedir@ --infodir = @infodir@ --install_sh = @install_sh@ --libdir = @libdir@ --libexecdir = @libexecdir@ --localedir = @localedir@ --localstatedir = @localstatedir@ --lt_cv_objdir = @lt_cv_objdir@ --mandir = @mandir@ --mkdir_p = @mkdir_p@ --oldincludedir = @oldincludedir@ --pdfdir = @pdfdir@ --prefix = @prefix@ --program_transform_name = @program_transform_name@ --psdir = @psdir@ --runstatedir = @runstatedir@ --sbindir = @sbindir@ --sharedstatedir = @sharedstatedir@ --srcdir = @srcdir@ --sysconfdir = @sysconfdir@ --target_alias = @target_alias@ --top_build_prefix = @top_build_prefix@ --top_builddir = @top_builddir@ --top_srcdir = @top_srcdir@ -- --# This Makefile.am is in the public domain --AM_CPPFLAGS = \ -- -I$(top_srcdir)/src/include \ -- -I$(top_srcdir)/src/microhttpd -- --AM_CFLAGS = $(HIDDEN_VISIBILITY_CFLAGS) --noinst_DATA = --MOSTLYCLEANFILES = --SUBDIRS = . --lib_LTLIBRARIES = \ -- libmicrohttpd_ws.la -- --libmicrohttpd_ws_la_SOURCES = \ -- sha1.c sha1.h \ -- mhd_websocket.c -- --libmicrohttpd_ws_la_CPPFLAGS = \ -- $(AM_CPPFLAGS) $(MHD_LIB_CPPFLAGS) \ -- -DBUILDING_MHD_LIB=1 -- --libmicrohttpd_ws_la_CFLAGS = \ -- $(AM_CFLAGS) $(MHD_LIB_CFLAGS) -- --libmicrohttpd_ws_la_LDFLAGS = \ -- $(MHD_LIB_LDFLAGS) \ -- $(W32_MHD_LIB_LDFLAGS) \ -- -version-info 0:0:0 -- --libmicrohttpd_ws_la_LIBADD = \ -- $(MHD_LIBDEPS) -- --TESTS = $(check_PROGRAMS) --test_websocket_SOURCES = \ -- test_websocket.c -- --test_websocket_LDADD = \ -- $(top_builddir)/src/microhttpd_ws/libmicrohttpd_ws.la \ -- $(top_builddir)/src/microhttpd/libmicrohttpd.la -- --all: all-recursive -- --.SUFFIXES: --.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs --$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -- @for dep in $?; do \ -- case '$(am__configure_deps)' in \ -- *$$dep*) \ -- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ -- && { if test -f $@; then exit 0; else break; fi; }; \ -- exit 1;; \ -- esac; \ -- done; \ -- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/microhttpd_ws/Makefile'; \ -- $(am__cd) $(top_srcdir) && \ -- $(AUTOMAKE) --gnu src/microhttpd_ws/Makefile --Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status -- @case '$?' in \ -- *config.status*) \ -- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ -- *) \ -- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ -- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ -- esac; -- --$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) -- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -- --$(top_srcdir)/configure: $(am__configure_deps) -- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh --$(ACLOCAL_M4): $(am__aclocal_m4_deps) -- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh --$(am__aclocal_m4_deps): -- --clean-checkPROGRAMS: -- @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ -- echo " rm -f" $$list; \ -- rm -f $$list || exit $$?; \ -- test -n "$(EXEEXT)" || exit 0; \ -- list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ -- echo " rm -f" $$list; \ -- rm -f $$list -- --install-libLTLIBRARIES: $(lib_LTLIBRARIES) -- @$(NORMAL_INSTALL) -- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ -- list2=; for p in $$list; do \ -- if test -f $$p; then \ -- list2="$$list2 $$p"; \ -- else :; fi; \ -- done; \ -- test -z "$$list2" || { \ -- echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ -- $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ -- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ -- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ -- } -- --uninstall-libLTLIBRARIES: -- @$(NORMAL_UNINSTALL) -- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ -- for p in $$list; do \ -- $(am__strip_dir) \ -- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ -- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ -- done -- --clean-libLTLIBRARIES: -- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) -- @list='$(lib_LTLIBRARIES)'; \ -- locs=`for p in $$list; do echo $$p; done | \ -- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ -- sort -u`; \ -- test -z "$$locs" || { \ -- echo rm -f $${locs}; \ -- rm -f $${locs}; \ -- } -- --libmicrohttpd_ws.la: $(libmicrohttpd_ws_la_OBJECTS) $(libmicrohttpd_ws_la_DEPENDENCIES) $(EXTRA_libmicrohttpd_ws_la_DEPENDENCIES) -- $(AM_V_CCLD)$(libmicrohttpd_ws_la_LINK) -rpath $(libdir) $(libmicrohttpd_ws_la_OBJECTS) $(libmicrohttpd_ws_la_LIBADD) $(LIBS) -- --test_websocket$(EXEEXT): $(test_websocket_OBJECTS) $(test_websocket_DEPENDENCIES) $(EXTRA_test_websocket_DEPENDENCIES) -- @rm -f test_websocket$(EXEEXT) -- $(AM_V_CCLD)$(LINK) $(test_websocket_OBJECTS) $(test_websocket_LDADD) $(LIBS) -- --mostlyclean-compile: -- -rm -f *.$(OBJEXT) -- --distclean-compile: -- -rm -f *.tab.c -- --@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmicrohttpd_ws_la-mhd_websocket.Plo@am__quote@ # am--include-marker --@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmicrohttpd_ws_la-sha1.Plo@am__quote@ # am--include-marker --@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_websocket.Po@am__quote@ # am--include-marker -- --$(am__depfiles_remade): -- @$(MKDIR_P) $(@D) -- @echo '# dummy' >$@-t && $(am__mv) $@-t $@ -- --am--depfiles: $(am__depfiles_remade) -- --.c.o: --@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ --@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ --@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po --@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ --@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ --@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< -- --.c.obj: --@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ --@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ --@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po --@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ --@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ --@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` -- --.c.lo: --@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ --@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ --@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo --@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ --@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ --@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< -- --libmicrohttpd_ws_la-sha1.lo: sha1.c --@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmicrohttpd_ws_la_CPPFLAGS) $(CPPFLAGS) $(libmicrohttpd_ws_la_CFLAGS) $(CFLAGS) -MT libmicrohttpd_ws_la-sha1.lo -MD -MP -MF $(DEPDIR)/libmicrohttpd_ws_la-sha1.Tpo -c -o libmicrohttpd_ws_la-sha1.lo `test -f 'sha1.c' || echo '$(srcdir)/'`sha1.c --@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmicrohttpd_ws_la-sha1.Tpo $(DEPDIR)/libmicrohttpd_ws_la-sha1.Plo --@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sha1.c' object='libmicrohttpd_ws_la-sha1.lo' libtool=yes @AMDEPBACKSLASH@ --@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ --@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmicrohttpd_ws_la_CPPFLAGS) $(CPPFLAGS) $(libmicrohttpd_ws_la_CFLAGS) $(CFLAGS) -c -o libmicrohttpd_ws_la-sha1.lo `test -f 'sha1.c' || echo '$(srcdir)/'`sha1.c -- --libmicrohttpd_ws_la-mhd_websocket.lo: mhd_websocket.c --@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmicrohttpd_ws_la_CPPFLAGS) $(CPPFLAGS) $(libmicrohttpd_ws_la_CFLAGS) $(CFLAGS) -MT libmicrohttpd_ws_la-mhd_websocket.lo -MD -MP -MF $(DEPDIR)/libmicrohttpd_ws_la-mhd_websocket.Tpo -c -o libmicrohttpd_ws_la-mhd_websocket.lo `test -f 'mhd_websocket.c' || echo '$(srcdir)/'`mhd_websocket.c --@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmicrohttpd_ws_la-mhd_websocket.Tpo $(DEPDIR)/libmicrohttpd_ws_la-mhd_websocket.Plo --@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mhd_websocket.c' object='libmicrohttpd_ws_la-mhd_websocket.lo' libtool=yes @AMDEPBACKSLASH@ --@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ --@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmicrohttpd_ws_la_CPPFLAGS) $(CPPFLAGS) $(libmicrohttpd_ws_la_CFLAGS) $(CFLAGS) -c -o libmicrohttpd_ws_la-mhd_websocket.lo `test -f 'mhd_websocket.c' || echo '$(srcdir)/'`mhd_websocket.c -- --mostlyclean-libtool: -- -rm -f *.lo -- --clean-libtool: -- -rm -rf .libs _libs -- --# This directory's subdirectories are mostly independent; you can cd --# into them and run 'make' without going through this Makefile. --# To change the values of 'make' variables: instead of editing Makefiles, --# (1) if the variable is set in 'config.status', edit 'config.status' --# (which will cause the Makefiles to be regenerated when you run 'make'); --# (2) otherwise, pass the desired values on the 'make' command line. --$(am__recursive_targets): -- @fail=; \ -- if $(am__make_keepgoing); then \ -- failcom='fail=yes'; \ -- else \ -- failcom='exit 1'; \ -- fi; \ -- dot_seen=no; \ -- target=`echo $@ | sed s/-recursive//`; \ -- case "$@" in \ -- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ -- *) list='$(SUBDIRS)' ;; \ -- esac; \ -- for subdir in $$list; do \ -- echo "Making $$target in $$subdir"; \ -- if test "$$subdir" = "."; then \ -- dot_seen=yes; \ -- local_target="$$target-am"; \ -- else \ -- local_target="$$target"; \ -- fi; \ -- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ -- || eval $$failcom; \ -- done; \ -- if test "$$dot_seen" = "no"; then \ -- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ -- fi; test -z "$$fail" -- --ID: $(am__tagged_files) -- $(am__define_uniq_tagged_files); mkid -fID $$unique --tags: tags-recursive --TAGS: tags -- --tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) -- set x; \ -- here=`pwd`; \ -- if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ -- include_option=--etags-include; \ -- empty_fix=.; \ -- else \ -- include_option=--include; \ -- empty_fix=; \ -- fi; \ -- list='$(SUBDIRS)'; for subdir in $$list; do \ -- if test "$$subdir" = .; then :; else \ -- test ! -f $$subdir/TAGS || \ -- set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ -- fi; \ -- done; \ -- $(am__define_uniq_tagged_files); \ -- shift; \ -- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ -- test -n "$$unique" || unique=$$empty_fix; \ -- if test $$# -gt 0; then \ -- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -- "$$@" $$unique; \ -- else \ -- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -- $$unique; \ -- fi; \ -- fi --ctags: ctags-recursive -- --CTAGS: ctags --ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) -- $(am__define_uniq_tagged_files); \ -- test -z "$(CTAGS_ARGS)$$unique" \ -- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -- $$unique -- --GTAGS: -- here=`$(am__cd) $(top_builddir) && pwd` \ -- && $(am__cd) $(top_srcdir) \ -- && gtags -i $(GTAGS_ARGS) "$$here" --cscopelist: cscopelist-recursive -- --cscopelist-am: $(am__tagged_files) -- list='$(am__tagged_files)'; \ -- case "$(srcdir)" in \ -- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ -- *) sdir=$(subdir)/$(srcdir) ;; \ -- esac; \ -- for i in $$list; do \ -- if test -f "$$i"; then \ -- echo "$(subdir)/$$i"; \ -- else \ -- echo "$$sdir/$$i"; \ -- fi; \ -- done >> $(top_builddir)/cscope.files -- --distclean-tags: -- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -- --# Recover from deleted '.trs' file; this should ensure that --# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create --# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells --# to avoid problems with "make -n". --.log.trs: -- rm -f $< $@ -- $(MAKE) $(AM_MAKEFLAGS) $< -- --# Leading 'am--fnord' is there to ensure the list of targets does not --# expand to empty, as could happen e.g. with make check TESTS=''. --am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) --am--force-recheck: -- @: -- --$(TEST_SUITE_LOG): $(TEST_LOGS) -- @$(am__set_TESTS_bases); \ -- am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ -- redo_bases=`for i in $$bases; do \ -- am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ -- done`; \ -- if test -n "$$redo_bases"; then \ -- redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ -- redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ -- if $(am__make_dryrun); then :; else \ -- rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ -- fi; \ -- fi; \ -- if test -n "$$am__remaking_logs"; then \ -- echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ -- "recursion detected" >&2; \ -- elif test -n "$$redo_logs"; then \ -- am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ -- fi; \ -- if $(am__make_dryrun); then :; else \ -- st=0; \ -- errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ -- for i in $$redo_bases; do \ -- test -f $$i.trs && test -r $$i.trs \ -- || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ -- test -f $$i.log && test -r $$i.log \ -- || { echo "$$errmsg $$i.log" >&2; st=1; }; \ -- done; \ -- test $$st -eq 0 || exit 1; \ -- fi -- @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ -- ws='[ ]'; \ -- results=`for b in $$bases; do echo $$b.trs; done`; \ -- test -n "$$results" || results=/dev/null; \ -- all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ -- pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ -- fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ -- skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ -- xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ -- xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ -- error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ -- if test `expr $$fail + $$xpass + $$error` -eq 0; then \ -- success=true; \ -- else \ -- success=false; \ -- fi; \ -- br='==================='; br=$$br$$br$$br$$br; \ -- result_count () \ -- { \ -- if test x"$$1" = x"--maybe-color"; then \ -- maybe_colorize=yes; \ -- elif test x"$$1" = x"--no-color"; then \ -- maybe_colorize=no; \ -- else \ -- echo "$@: invalid 'result_count' usage" >&2; exit 4; \ -- fi; \ -- shift; \ -- desc=$$1 count=$$2; \ -- if test $$maybe_colorize = yes && test $$count -gt 0; then \ -- color_start=$$3 color_end=$$std; \ -- else \ -- color_start= color_end=; \ -- fi; \ -- echo "$${color_start}# $$desc $$count$${color_end}"; \ -- }; \ -- create_testsuite_report () \ -- { \ -- result_count $$1 "TOTAL:" $$all "$$brg"; \ -- result_count $$1 "PASS: " $$pass "$$grn"; \ -- result_count $$1 "SKIP: " $$skip "$$blu"; \ -- result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ -- result_count $$1 "FAIL: " $$fail "$$red"; \ -- result_count $$1 "XPASS:" $$xpass "$$red"; \ -- result_count $$1 "ERROR:" $$error "$$mgn"; \ -- }; \ -- { \ -- echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ -- $(am__rst_title); \ -- create_testsuite_report --no-color; \ -- echo; \ -- echo ".. contents:: :depth: 2"; \ -- echo; \ -- for b in $$bases; do echo $$b; done \ -- | $(am__create_global_log); \ -- } >$(TEST_SUITE_LOG).tmp || exit 1; \ -- mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ -- if $$success; then \ -- col="$$grn"; \ -- else \ -- col="$$red"; \ -- test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ -- fi; \ -- echo "$${col}$$br$${std}"; \ -- echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ -- echo "$${col}$$br$${std}"; \ -- create_testsuite_report --maybe-color; \ -- echo "$$col$$br$$std"; \ -- if $$success; then :; else \ -- echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ -- if test -n "$(PACKAGE_BUGREPORT)"; then \ -- echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ -- fi; \ -- echo "$$col$$br$$std"; \ -- fi; \ -- $$success || exit 1 -- --check-TESTS: $(check_PROGRAMS) -- @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list -- @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list -- @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) -- @set +e; $(am__set_TESTS_bases); \ -- log_list=`for i in $$bases; do echo $$i.log; done`; \ -- trs_list=`for i in $$bases; do echo $$i.trs; done`; \ -- log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ -- $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ -- exit $$?; --recheck: all $(check_PROGRAMS) -- @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) -- @set +e; $(am__set_TESTS_bases); \ -- bases=`for i in $$bases; do echo $$i; done \ -- | $(am__list_recheck_tests)` || exit 1; \ -- log_list=`for i in $$bases; do echo $$i.log; done`; \ -- log_list=`echo $$log_list`; \ -- $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ -- am__force_recheck=am--force-recheck \ -- TEST_LOGS="$$log_list"; \ -- exit $$? --test_websocket.log: test_websocket$(EXEEXT) -- @p='test_websocket$(EXEEXT)'; \ -- b='test_websocket'; \ -- $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ -- --log-file $$b.log --trs-file $$b.trs \ -- $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ -- "$$tst" $(AM_TESTS_FD_REDIRECT) --.test.log: -- @p='$<'; \ -- $(am__set_b); \ -- $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ -- --log-file $$b.log --trs-file $$b.trs \ -- $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ -- "$$tst" $(AM_TESTS_FD_REDIRECT) --@am__EXEEXT_TRUE@.test$(EXEEXT).log: --@am__EXEEXT_TRUE@ @p='$<'; \ --@am__EXEEXT_TRUE@ $(am__set_b); \ --@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ --@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ --@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) --distdir: $(BUILT_SOURCES) -- $(MAKE) $(AM_MAKEFLAGS) distdir-am -- --distdir-am: $(DISTFILES) -- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ -- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ -- list='$(DISTFILES)'; \ -- dist_files=`for file in $$list; do echo $$file; done | \ -- sed -e "s|^$$srcdirstrip/||;t" \ -- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ -- case $$dist_files in \ -- */*) $(MKDIR_P) `echo "$$dist_files" | \ -- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ -- sort -u` ;; \ -- esac; \ -- for file in $$dist_files; do \ -- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ -- if test -d $$d/$$file; then \ -- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ -- if test -d "$(distdir)/$$file"; then \ -- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ -- fi; \ -- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ -- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ -- fi; \ -- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ -- else \ -- test -f "$(distdir)/$$file" \ -- || cp -p $$d/$$file "$(distdir)/$$file" \ -- || exit 1; \ -- fi; \ -- done -- @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ -- if test "$$subdir" = .; then :; else \ -- $(am__make_dryrun) \ -- || test -d "$(distdir)/$$subdir" \ -- || $(MKDIR_P) "$(distdir)/$$subdir" \ -- || exit 1; \ -- dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ -- $(am__relativize); \ -- new_distdir=$$reldir; \ -- dir1=$$subdir; dir2="$(top_distdir)"; \ -- $(am__relativize); \ -- new_top_distdir=$$reldir; \ -- echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ -- echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ -- ($(am__cd) $$subdir && \ -- $(MAKE) $(AM_MAKEFLAGS) \ -- top_distdir="$$new_top_distdir" \ -- distdir="$$new_distdir" \ -- am__remove_distdir=: \ -- am__skip_length_check=: \ -- am__skip_mode_fix=: \ -- distdir) \ -- || exit 1; \ -- fi; \ -- done --check-am: all-am -- $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) -- $(MAKE) $(AM_MAKEFLAGS) check-TESTS --check: check-recursive --all-am: Makefile $(LTLIBRARIES) $(DATA) --install-checkPROGRAMS: install-libLTLIBRARIES -- --installdirs: installdirs-recursive --installdirs-am: -- for dir in "$(DESTDIR)$(libdir)"; do \ -- test -z "$$dir" || $(MKDIR_P) "$$dir"; \ -- done --install: install-recursive --install-exec: install-exec-recursive --install-data: install-data-recursive --uninstall: uninstall-recursive -- --install-am: all-am -- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -- --installcheck: installcheck-recursive --install-strip: -- if test -z '$(STRIP)'; then \ -- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -- install; \ -- else \ -- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ -- fi --mostlyclean-generic: -- -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) -- -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -- -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -- -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) -- --clean-generic: -- --distclean-generic: -- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -- --maintainer-clean-generic: -- @echo "This command is intended for maintainers to use" -- @echo "it deletes files that may require special tools to rebuild." --clean: clean-recursive -- --clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ -- clean-libtool mostlyclean-am -- --distclean: distclean-recursive -- -rm -f ./$(DEPDIR)/libmicrohttpd_ws_la-mhd_websocket.Plo -- -rm -f ./$(DEPDIR)/libmicrohttpd_ws_la-sha1.Plo -- -rm -f ./$(DEPDIR)/test_websocket.Po -- -rm -f Makefile --distclean-am: clean-am distclean-compile distclean-generic \ -- distclean-tags -- --dvi: dvi-recursive -- --dvi-am: -- --html: html-recursive -- --html-am: -- --info: info-recursive -- --info-am: -- --install-data-am: -- --install-dvi: install-dvi-recursive -- --install-dvi-am: -- --install-exec-am: install-libLTLIBRARIES -- --install-html: install-html-recursive -- --install-html-am: -- --install-info: install-info-recursive -- --install-info-am: -- --install-man: -- --install-pdf: install-pdf-recursive -- --install-pdf-am: -- --install-ps: install-ps-recursive -- --install-ps-am: -- --installcheck-am: -- --maintainer-clean: maintainer-clean-recursive -- -rm -f ./$(DEPDIR)/libmicrohttpd_ws_la-mhd_websocket.Plo -- -rm -f ./$(DEPDIR)/libmicrohttpd_ws_la-sha1.Plo -- -rm -f ./$(DEPDIR)/test_websocket.Po -- -rm -f Makefile --maintainer-clean-am: distclean-am maintainer-clean-generic -- --mostlyclean: mostlyclean-recursive -- --mostlyclean-am: mostlyclean-compile mostlyclean-generic \ -- mostlyclean-libtool -- --pdf: pdf-recursive -- --pdf-am: -- --ps: ps-recursive -- --ps-am: -- --uninstall-am: uninstall-libLTLIBRARIES -- --.MAKE: $(am__recursive_targets) check-am install-am install-strip -- --.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ -- am--depfiles check check-TESTS check-am clean \ -- clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ -- clean-libtool cscopelist-am ctags ctags-am distclean \ -- distclean-compile distclean-generic distclean-libtool \ -- distclean-tags distdir dvi dvi-am html html-am info info-am \ -- install install-am install-data install-data-am install-dvi \ -- install-dvi-am install-exec install-exec-am install-html \ -- install-html-am install-info install-info-am \ -- install-libLTLIBRARIES install-man install-pdf install-pdf-am \ -- install-ps install-ps-am install-strip installcheck \ -- installcheck-am installdirs installdirs-am maintainer-clean \ -- maintainer-clean-generic mostlyclean mostlyclean-compile \ -- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ -- recheck tags tags-am uninstall uninstall-am \ -- uninstall-libLTLIBRARIES -- --.PRECIOUS: Makefile -- -- --$(top_builddir)/src/microhttpd/libmicrohttpd.la: $(top_builddir)/src/microhttpd/Makefile -- @echo ' cd $(top_builddir)/src/microhttpd && $(MAKE) $(AM_MAKEFLAGS) libmicrohttpd.la'; \ -- $(am__cd) $(top_builddir)/src/microhttpd && $(MAKE) $(AM_MAKEFLAGS) libmicrohttpd.la -- --# Tell versions [3.59,3.63) of GNU make to not export all variables. --# Otherwise a system limit (for SysV at least) may be exceeded. --.NOEXPORT: -diff --git a/src/microhttpd_ws/mhd_websocket.c b/src/microhttpd_ws/mhd_websocket.c -deleted file mode 100644 -index 935deee..0000000 ---- a/src/microhttpd_ws/mhd_websocket.c -+++ /dev/null -@@ -1,2443 +0,0 @@ --/* -- This file is part of libmicrohttpd -- Copyright (C) 2021 David Gausmann -- -- 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 microhttpd_ws/mhd_websocket.c -- * @brief Support for the websocket protocol -- * @author David Gausmann -- */ --#include "platform.h" --#include "microhttpd.h" --#include "microhttpd_ws.h" --#include "sha1.h" -- --struct MHD_WebSocketStream --{ -- /* The function pointer to malloc for payload (can be used to use different memory management) */ -- MHD_WebSocketMallocCallback malloc; -- /* The function pointer to realloc for payload (can be used to use different memory management) */ -- MHD_WebSocketReallocCallback realloc; -- /* The function pointer to free for payload (can be used to use different memory management) */ -- MHD_WebSocketFreeCallback free; -- /* A closure for the random number generator (only used for client mode; usually not required) */ -- void *cls_rng; -- /* The random number generator (only used for client mode; usually not required) */ -- MHD_WebSocketRandomNumberGenerator rng; -- /* The flags specified upon initialization. It may alter the behavior of decoding/encoding */ -- int flags; -- /* The current step for the decoder. 0 means start of a frame. */ -- char decode_step; -- /* Specifies whether the stream is valid (1) or not (0), -- if a close frame has been received this is (-1) to indicate that no data frames are allowed anymore */ -- char validity; -- /* The current step of the UTF-8 encoding check in the data payload */ -- char data_utf8_step; -- /* The current step of the UTF-8 encoding check in the control payload */ -- char control_utf8_step; -- /* if != 0 means that we expect a CONTINUATION frame */ -- char data_type; -- /* The start of the current frame (may differ from data_payload for CONTINUATION frames) */ -- char *data_payload_start; -- /* The buffer for the data frame */ -- char *data_payload; -- /* The buffer for the control frame */ -- char *control_payload; -- /* Configuration for the maximum allowed buffer size for payload data */ -- size_t max_payload_size; -- /* The current frame header size */ -- size_t frame_header_size; -- /* The current data payload size (can be greater than payload_size for fragmented frames) */ -- size_t data_payload_size; -- /* The size of the payload of the current frame (control or data) */ -- size_t payload_size; -- /* The processing offset to the start of the payload of the current frame (control or data) */ -- size_t payload_index; -- /* The frame header of the current frame (control or data) */ -- char frame_header[32]; -- /* The mask key of the current frame (control or data); this is 0 if no masking used */ -- char mask_key[4]; --}; -- --#define MHD_WEBSOCKET_FLAG_MASK_SERVERCLIENT MHD_WEBSOCKET_FLAG_CLIENT --#define MHD_WEBSOCKET_FLAG_MASK_FRAGMENTATION \ -- MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS --#define MHD_WEBSOCKET_FLAG_MASK_GENERATE_CLOSE_FRAMES \ -- MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR --#define MHD_WEBSOCKET_FLAG_MASK_ALL \ -- (MHD_WEBSOCKET_FLAG_MASK_SERVERCLIENT \ -- | MHD_WEBSOCKET_FLAG_MASK_FRAGMENTATION \ -- | MHD_WEBSOCKET_FLAG_MASK_GENERATE_CLOSE_FRAMES) -- --enum MHD_WebSocket_Opcode --{ -- MHD_WebSocket_Opcode_Continuation = 0x0, -- MHD_WebSocket_Opcode_Text = 0x1, -- MHD_WebSocket_Opcode_Binary = 0x2, -- MHD_WebSocket_Opcode_Close = 0x8, -- MHD_WebSocket_Opcode_Ping = 0x9, -- MHD_WebSocket_Opcode_Pong = 0xA --}; -- --enum MHD_WebSocket_DecodeStep --{ -- MHD_WebSocket_DecodeStep_Start = 0, -- MHD_WebSocket_DecodeStep_Length1ofX = 1, -- MHD_WebSocket_DecodeStep_Length1of2 = 2, -- MHD_WebSocket_DecodeStep_Length2of2 = 3, -- MHD_WebSocket_DecodeStep_Length1of8 = 4, -- MHD_WebSocket_DecodeStep_Length2of8 = 5, -- MHD_WebSocket_DecodeStep_Length3of8 = 6, -- MHD_WebSocket_DecodeStep_Length4of8 = 7, -- MHD_WebSocket_DecodeStep_Length5of8 = 8, -- MHD_WebSocket_DecodeStep_Length6of8 = 9, -- MHD_WebSocket_DecodeStep_Length7of8 = 10, -- MHD_WebSocket_DecodeStep_Length8of8 = 11, -- MHD_WebSocket_DecodeStep_Mask1Of4 = 12, -- MHD_WebSocket_DecodeStep_Mask2Of4 = 13, -- MHD_WebSocket_DecodeStep_Mask3Of4 = 14, -- MHD_WebSocket_DecodeStep_Mask4Of4 = 15, -- MHD_WebSocket_DecodeStep_HeaderCompleted = 16, -- MHD_WebSocket_DecodeStep_PayloadOfDataFrame = 17, -- MHD_WebSocket_DecodeStep_PayloadOfControlFrame = 18, -- MHD_WebSocket_DecodeStep_BrokenStream = 99 --}; -- --enum MHD_WebSocket_UTF8Result --{ -- MHD_WebSocket_UTF8Result_Invalid = 0, -- MHD_WebSocket_UTF8Result_Valid = 1, -- MHD_WebSocket_UTF8Result_Incomplete = 2 --}; -- --static void --MHD_websocket_copy_payload (char *dst, -- const char *src, -- size_t len, -- uint32_t mask, -- unsigned long mask_offset); -- --static int --MHD_websocket_check_utf8 (const char *buf, -- size_t buf_len, -- int *utf8_step, -- size_t *buf_offset); -- --static enum MHD_WEBSOCKET_STATUS --MHD_websocket_decode_header_complete (struct MHD_WebSocketStream *ws, -- char **payload, -- size_t *payload_len); -- --static enum MHD_WEBSOCKET_STATUS --MHD_websocket_decode_payload_complete (struct MHD_WebSocketStream *ws, -- char **payload, -- size_t *payload_len); -- --static char --MHD_websocket_encode_is_masked (struct MHD_WebSocketStream *ws); --static char --MHD_websocket_encode_overhead_size (struct MHD_WebSocketStream *ws, -- size_t payload_len); -- --static enum MHD_WEBSOCKET_STATUS --MHD_websocket_encode_data (struct MHD_WebSocketStream *ws, -- const char *payload, -- size_t payload_len, -- int fragmentation, -- char **frame, -- size_t *frame_len, -- char opcode); -- --static enum MHD_WEBSOCKET_STATUS --MHD_websocket_encode_ping_pong (struct MHD_WebSocketStream *ws, -- const char *payload, -- size_t payload_len, -- char **frame, -- size_t *frame_len, -- char opcode); -- --static uint32_t --MHD_websocket_generate_mask (struct MHD_WebSocketStream *ws); -- --static uint16_t --MHD_htons (uint16_t value); -- --static uint64_t --MHD_htonll (uint64_t value); -- -- --/** -- * Checks whether the HTTP version is 1.1 or above. -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_check_http_version (const char *http_version) --{ -- /* validate parameters */ -- if (NULL == http_version) -- { -- /* Like with the other check routines, */ -- /* NULL is threated as "value not given" and not as parameter error */ -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- -- /* Check whether the version has a valid format */ -- /* RFC 1945 3.1: The format must be "HTTP/x.x" where x is */ -- /* any digit and must appear at least once */ -- if (('H' != http_version[0]) || -- ('T' != http_version[1]) || -- ('T' != http_version[2]) || -- ('P' != http_version[3]) || -- ('/' != http_version[4])) -- { -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- -- /* Find the major and minor part of the version */ -- /* RFC 1945 3.1: Both numbers must be threated as separate integers. */ -- /* Leading zeros must be ignored and both integers may have multiple digits */ -- const char *major = NULL; -- const char *dot = NULL; -- size_t i = 5; -- for (;;) -- { -- char c = http_version[i]; -- if (('0' <= c) && ('9' >= c)) -- { -- if ((NULL == major) || -- ((http_version + i == major + 1) && ('0' == *major)) ) -- { -- major = http_version + i; -- } -- ++i; -- } -- else if ('.' == http_version[i]) -- { -- dot = http_version + i; -- ++i; -- break; -- } -- else -- { -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- } -- const char *minor = NULL; -- const char *end = NULL; -- for (;;) -- { -- char c = http_version[i]; -- if (('0' <= c) && ('9' >= c)) -- { -- if ((NULL == minor) || -- ((http_version + i == minor + 1) && ('0' == *minor)) ) -- { -- minor = http_version + i; -- } -- ++i; -- } -- else if (0 == c) -- { -- end = http_version + i; -- break; -- } -- else -- { -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- } -- if ((NULL == major) || (NULL == dot) || (NULL == minor) || (NULL == end)) -- { -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- if ((2 <= dot - major) || ('2' <= *major) || -- (('1' == *major) && ((2 <= end - minor) || ('1' <= *minor))) ) -- { -- return MHD_WEBSOCKET_STATUS_OK; -- } -- -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; --} -- -- --/** -- * Checks whether the "Connection" request header has the 'Upgrade' token. -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_check_connection_header (const char *connection_header) --{ -- /* validate parameters */ -- if (NULL == connection_header) -- { -- /* To be compatible with the return value */ -- /* of MHD_lookup_connection_value, */ -- /* NULL is threated as "value not given" and not as parameter error */ -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- -- /* Check whether the Connection includes an Upgrade token */ -- /* RFC 7230 6.1: Multiple tokens may appear. */ -- /* RFC 7230 3.2.6: Tokens are comma separated */ -- const char *token_start = NULL; -- const char *token_end = NULL; -- for (size_t i = 0; ; ++i) -- { -- char c = connection_header[i]; -- -- /* RFC 7230 3.2.6: The list of allowed characters is a token is: */ -- /* "!" / "#" / "$" / "%" / "&" / "'" / "*" / */ -- /* "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" */ -- /* DIGIT / ALPHA */ -- if (('!' == c) || ('#' == c) || ('$' == c) || ('%' == c) || -- ('&' == c) || ('\'' == c) || ('*' == c) || -- ('+' == c) || ('-' == c) || ('.' == c) || ('^' == c) || -- ('_' == c) || ('`' == c) || ('|' == c) || ('~' == c) || -- (('0' <= c) && ('9' >= c)) || -- (('A' <= c) && ('Z' >= c)) || (('a' <= c) && ('z' >= c)) ) -- { -- /* This is a valid token character */ -- if (NULL == token_start) -- { -- token_start = connection_header + i; -- } -- token_end = connection_header + i + 1; -- } -- else if ((' ' == c) || ('\t' == c)) -- { -- /* White-spaces around tokens will be ignored */ -- } -- else if ((',' == c) || (0 == c)) -- { -- /* Check the token (case-insensitive) */ -- if (NULL != token_start) -- { -- if (7 == (token_end - token_start) ) -- { -- if ( (('U' == token_start[0]) || ('u' == token_start[0])) && -- (('P' == token_start[1]) || ('p' == token_start[1])) && -- (('G' == token_start[2]) || ('g' == token_start[2])) && -- (('R' == token_start[3]) || ('r' == token_start[3])) && -- (('A' == token_start[4]) || ('a' == token_start[4])) && -- (('D' == token_start[5]) || ('d' == token_start[5])) && -- (('E' == token_start[6]) || ('e' == token_start[6])) ) -- { -- /* The token equals to "Upgrade" */ -- return MHD_WEBSOCKET_STATUS_OK; -- } -- } -- } -- if (0 == c) -- { -- break; -- } -- token_start = NULL; -- token_end = NULL; -- } -- else -- { -- /* RFC 7230 3.2.6: Other characters are not allowed */ -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- } -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; --} -- -- --/** -- * Checks whether the "Upgrade" request header has the "websocket" keyword. -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_check_upgrade_header (const char *upgrade_header) --{ -- /* validate parameters */ -- if (NULL == upgrade_header) -- { -- /* To be compatible with the return value */ -- /* of MHD_lookup_connection_value, */ -- /* NULL is threated as "value not given" and not as parameter error */ -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- -- /* Check whether the Connection includes an Upgrade token */ -- /* RFC 7230 6.1: Multiple tokens may appear. */ -- /* RFC 7230 3.2.6: Tokens are comma separated */ -- const char *keyword_start = NULL; -- const char *keyword_end = NULL; -- for (size_t i = 0; ; ++i) -- { -- char c = upgrade_header[i]; -- -- /* RFC 7230 3.2.6: The list of allowed characters is a token is: */ -- /* "!" / "#" / "$" / "%" / "&" / "'" / "*" / */ -- /* "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" */ -- /* DIGIT / ALPHA */ -- /* We also allow "/" here as the sub-delimiter for the protocol version */ -- if (('!' == c) || ('#' == c) || ('$' == c) || ('%' == c) || -- ('&' == c) || ('\'' == c) || ('*' == c) || -- ('+' == c) || ('-' == c) || ('.' == c) || ('^' == c) || -- ('_' == c) || ('`' == c) || ('|' == c) || ('~' == c) || -- ('/' == c) || -- (('0' <= c) && ('9' >= c)) || -- (('A' <= c) && ('Z' >= c)) || (('a' <= c) && ('z' >= c)) ) -- { -- /* This is a valid token character */ -- if (NULL == keyword_start) -- { -- keyword_start = upgrade_header + i; -- } -- keyword_end = upgrade_header + i + 1; -- } -- else if ((' ' == c) || ('\t' == c)) -- { -- /* White-spaces around tokens will be ignored */ -- } -- else if ((',' == c) || (0 == c)) -- { -- /* Check the token (case-insensitive) */ -- if (NULL != keyword_start) -- { -- if (9 == (keyword_end - keyword_start) ) -- { -- if ( (('W' == keyword_start[0]) || ('w' == keyword_start[0])) && -- (('E' == keyword_start[1]) || ('e' == keyword_start[1])) && -- (('B' == keyword_start[2]) || ('b' == keyword_start[2])) && -- (('S' == keyword_start[3]) || ('s' == keyword_start[3])) && -- (('O' == keyword_start[4]) || ('o' == keyword_start[4])) && -- (('C' == keyword_start[5]) || ('c' == keyword_start[5])) && -- (('K' == keyword_start[6]) || ('k' == keyword_start[6])) && -- (('E' == keyword_start[7]) || ('e' == keyword_start[7])) && -- (('T' == keyword_start[8]) || ('t' == keyword_start[8])) ) -- { -- /* The keyword equals to "websocket" */ -- return MHD_WEBSOCKET_STATUS_OK; -- } -- } -- } -- if (0 == c) -- { -- break; -- } -- keyword_start = NULL; -- keyword_end = NULL; -- } -- else -- { -- /* RFC 7230 3.2.6: Other characters are not allowed */ -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- } -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; --} -- -- --/** -- * Checks whether the "Sec-WebSocket-Version" request header -- * equals to "13" -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_check_version_header (const char *version_header) --{ -- /* validate parameters */ -- if (NULL == version_header) -- { -- /* To be compatible with the return value */ -- /* of MHD_lookup_connection_value, */ -- /* NULL is threated as "value not given" and not as parameter error */ -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- -- if (('1' == version_header[0]) && -- ('3' == version_header[1]) && -- (0 == version_header[2])) -- { -- /* The version equals to "13" */ -- return MHD_WEBSOCKET_STATUS_OK; -- } -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; --} -- -- --/** -- * Creates the response for the Sec-WebSocket-Accept header -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_create_accept_header (const char *sec_websocket_key, -- char *sec_websocket_accept) --{ -- /* initialize output variables for errors cases */ -- if (NULL != sec_websocket_accept) -- *sec_websocket_accept = 0; -- -- /* validate parameters */ -- if (NULL == sec_websocket_accept) -- { -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- } -- if (NULL == sec_websocket_key) -- { -- /* NULL is not a parameter error, */ -- /* because MHD_lookup_connection_value returns NULL */ -- /* if the header wasn't found */ -- return MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER; -- } -- -- /* build SHA1 hash of the given key and the UUID appended */ -- char sha1[20]; -- const char *suffix = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; -- int length = (int) strlen (sec_websocket_key); -- struct sha1_ctx ctx; -- MHD_SHA1_init (&ctx); -- MHD_SHA1_update (&ctx, (const uint8_t *) sec_websocket_key, length); -- MHD_SHA1_update (&ctx, (const uint8_t *) suffix, 36); -- MHD_SHA1_finish (&ctx, (uint8_t *) sha1); -- -- /* base64 encode that SHA1 hash */ -- /* (simple algorithm here; SHA1 has always 20 bytes, */ -- /* which will always result in a 28 bytes base64 hash) */ -- const char *base64_encoding_table = -- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -- for (int i = 0, j = 0; i < 20;) -- { -- uint32_t octet_a = i < 20 ? (unsigned char) sha1[i++] : 0; -- uint32_t octet_b = i < 20 ? (unsigned char) sha1[i++] : 0; -- uint32_t octet_c = i < 20 ? (unsigned char) sha1[i++] : 0; -- uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; -- -- sec_websocket_accept[j++] = base64_encoding_table[(triple >> 3 * 6) & 0x3F]; -- sec_websocket_accept[j++] = base64_encoding_table[(triple >> 2 * 6) & 0x3F]; -- sec_websocket_accept[j++] = base64_encoding_table[(triple >> 1 * 6) & 0x3F]; -- sec_websocket_accept[j++] = base64_encoding_table[(triple >> 0 * 6) & 0x3F]; -- -- } -- sec_websocket_accept[27] = '='; -- sec_websocket_accept[28] = 0; -- -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --/** -- * Initializes a new websocket stream -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_stream_init (struct MHD_WebSocketStream **ws, -- int flags, -- size_t max_payload_size) --{ -- return MHD_websocket_stream_init2 (ws, -- flags, -- max_payload_size, -- malloc, -- realloc, -- free, -- NULL, -- NULL); --} -- -- --/** -- * Initializes a new websocket stream with -- * additional parameters for allocation functions -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_stream_init2 (struct MHD_WebSocketStream **ws, -- int flags, -- size_t max_payload_size, -- MHD_WebSocketMallocCallback callback_malloc, -- MHD_WebSocketReallocCallback callback_realloc, -- MHD_WebSocketFreeCallback callback_free, -- void *cls_rng, -- MHD_WebSocketRandomNumberGenerator callback_rng) --{ -- /* initialize output variables for errors cases */ -- if (NULL != ws) -- *ws = NULL; -- -- /* validate parameters */ -- if ((NULL == ws) || -- (0 != (flags & ~MHD_WEBSOCKET_FLAG_MASK_ALL)) || -- ((uint64_t) 0x7FFFFFFFFFFFFFFF < max_payload_size) || -- (NULL == callback_malloc) || -- (NULL == callback_realloc) || -- (NULL == callback_free) || -- ((0 != (flags & MHD_WEBSOCKET_FLAG_CLIENT)) && -- (NULL == callback_rng))) -- { -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- } -- -- /* allocate stream */ -- struct MHD_WebSocketStream *ws_ = (struct MHD_WebSocketStream *) malloc ( -- sizeof (struct MHD_WebSocketStream)); -- if (NULL == ws_) -- return MHD_WEBSOCKET_STATUS_MEMORY_ERROR; -- -- /* initialize stream */ -- memset (ws_, 0, sizeof (struct MHD_WebSocketStream)); -- ws_->flags = flags; -- ws_->max_payload_size = max_payload_size; -- ws_->malloc = callback_malloc; -- ws_->realloc = callback_realloc; -- ws_->free = callback_free; -- ws_->cls_rng = cls_rng; -- ws_->rng = callback_rng; -- ws_->validity = MHD_WEBSOCKET_VALIDITY_VALID; -- -- /* return stream */ -- *ws = ws_; -- -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --/** -- * Frees a previously allocated websocket stream -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_stream_free (struct MHD_WebSocketStream *ws) --{ -- /* validate parameters */ -- if (NULL == ws) -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- -- /* free allocated payload data */ -- if (ws->data_payload) -- ws->free (ws->data_payload); -- if (ws->control_payload) -- ws->free (ws->control_payload); -- -- /* free the stream */ -- free (ws); -- -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --/** -- * Invalidates a websocket stream (no more decoding possible) -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_stream_invalidate (struct MHD_WebSocketStream *ws) --{ -- /* validate parameters */ -- if (NULL == ws) -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- -- /* invalidate stream */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --/** -- * Returns whether a websocket stream is valid -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_VALIDITY --MHD_websocket_stream_is_valid (struct MHD_WebSocketStream *ws) --{ -- /* validate parameters */ -- if (NULL == ws) -- return MHD_WEBSOCKET_VALIDITY_INVALID; -- -- return ws->validity; --} -- -- --/** -- * Decodes incoming data to a websocket frame -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_decode (struct MHD_WebSocketStream *ws, -- const char *streambuf, -- size_t streambuf_len, -- size_t *streambuf_read_len, -- char **payload, -- size_t *payload_len) --{ -- /* initialize output variables for errors cases */ -- if (NULL != streambuf_read_len) -- *streambuf_read_len = 0; -- if (NULL != payload) -- *payload = NULL; -- if (NULL != payload_len) -- *payload_len = 0; -- -- /* validate parameters */ -- if ((NULL == ws) || -- ((NULL == streambuf) && (0 != streambuf_len)) || -- (NULL == streambuf_read_len) || -- (NULL == payload) || -- (NULL == payload_len) ) -- { -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- } -- -- /* validate stream validity */ -- if (MHD_WEBSOCKET_VALIDITY_INVALID == ws->validity) -- return MHD_WEBSOCKET_STATUS_STREAM_BROKEN; -- -- /* decode loop */ -- size_t current = 0; -- while (current < streambuf_len) -- { -- switch (ws->decode_step) -- { -- /* start of frame */ -- case MHD_WebSocket_DecodeStep_Start: -- { -- /* The first byte contains the opcode, the fin flag and three reserved bits */ -- if (MHD_WEBSOCKET_VALIDITY_INVALID != ws->validity) -- { -- char opcode = streambuf [current]; -- if (0 != (opcode & 0x70)) -- { -- /* RFC 6455 5.2 RSV1-3: If a reserved flag is set */ -- /* (while it isn't specified by an extension) the communication must fail. */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- switch (opcode & 0x0F) -- { -- case MHD_WebSocket_Opcode_Continuation: -- if (0 == ws->data_type) -- { -- /* RFC 6455 5.4: Continuation frame without previous data frame */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- if (MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES == -- ws->validity) -- { -- /* RFC 6455 5.5.1: After a close frame has been sent, */ -- /* no data frames may be sent (so we don't accept data frames */ -- /* for decoding anymore) */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- break; -- -- case MHD_WebSocket_Opcode_Text: -- case MHD_WebSocket_Opcode_Binary: -- if (0 != ws->data_type) -- { -- /* RFC 6455 5.4: Continuation expected, but new data frame */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- if (MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES == -- ws->validity) -- { -- /* RFC 6455 5.5.1: After a close frame has been sent, */ -- /* no data frames may be sent (so we don't accept data frames */ -- /* for decoding anymore) */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- break; -- -- case MHD_WebSocket_Opcode_Close: -- case MHD_WebSocket_Opcode_Ping: -- case MHD_WebSocket_Opcode_Pong: -- if ((opcode & 0x80) == 0) -- { -- /* RFC 6455 5.4: Control frames may not be fragmented */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- if (MHD_WebSocket_Opcode_Close == (opcode & 0x0F)) -- { -- /* RFC 6455 5.5.1: After a close frame has been sent, */ -- /* no data frames may be sent (so we don't accept data frames */ -- /* for decoding anymore) */ -- ws->validity = -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES; -- } -- break; -- -- default: -- /* RFC 6455 5.2 OPCODE: Only six opcodes are specified. */ -- /* All other are invalid in version 13 of the protocol. */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- } -- ws->frame_header [ws->frame_header_size++] = streambuf [current++]; -- ws->decode_step = MHD_WebSocket_DecodeStep_Length1ofX; -- } -- break; -- -- case MHD_WebSocket_DecodeStep_Length1ofX: -- { -- /* The second byte specifies whether the data is masked and the size */ -- /* (the client MUST mask the payload, the server MUST NOT mask the payload) */ -- char frame_len = streambuf [current]; -- char is_masked = (frame_len & 0x80); -- frame_len &= 0x7f; -- if (MHD_WEBSOCKET_VALIDITY_INVALID != ws->validity) -- { -- if (0 != is_masked) -- { -- if (MHD_WEBSOCKET_FLAG_CLIENT == (ws->flags -- & MHD_WEBSOCKET_FLAG_CLIENT)) -- { -- /* RFC 6455 5.1: All frames from the server must be unmasked */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- } -- else -- { -- if (MHD_WEBSOCKET_FLAG_SERVER == (ws->flags -- & MHD_WEBSOCKET_FLAG_CLIENT)) -- { -- /* RFC 6455 5.1: All frames from the client must be masked */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- } -- if (126 <= frame_len) -- { -- if (0 != (ws->frame_header [0] & 0x08)) -- { -- /* RFC 6455 5.5: Control frames may not have more payload than 125 bytes */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- } -- if (1 == frame_len) -- { -- if (MHD_WebSocket_Opcode_Close == (ws->frame_header [0] & 0x0F)) -- { -- /* RFC 6455 5.5.1: The close frame must have at least */ -- /* two bytes of payload if payload is used */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- } -- } -- ws->frame_header [ws->frame_header_size++] = streambuf [current++]; -- -- if (126 == frame_len) -- { -- ws->decode_step = MHD_WebSocket_DecodeStep_Length1of2; -- } -- else if (127 == frame_len) -- { -- ws->decode_step = MHD_WebSocket_DecodeStep_Length1of8; -- } -- else -- { -- size_t size = (size_t) frame_len; -- if ((SIZE_MAX < size) || -- (ws->max_payload_size && (ws->max_payload_size < size)) ) -- { -- /* RFC 6455 7.4.1 1009: If the message is too big to process, we may close the connection */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_MAXIMUM_ALLOWED_PAYLOAD_SIZE_EXCEEDED, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED; -- } -- ws->payload_size = size; -- if (0 != is_masked) -- { -- /* with mask */ -- ws->decode_step = MHD_WebSocket_DecodeStep_Mask1Of4; -- } -- else -- { -- /* without mask */ -- *((uint32_t *) ws->mask_key) = 0; -- ws->decode_step = MHD_WebSocket_DecodeStep_HeaderCompleted; -- } -- } -- } -- break; -- -- /* Payload size first byte of 2 bytes */ -- case MHD_WebSocket_DecodeStep_Length1of2: -- /* Payload size first 7 bytes of 8 bytes */ -- case MHD_WebSocket_DecodeStep_Length1of8: -- case MHD_WebSocket_DecodeStep_Length2of8: -- case MHD_WebSocket_DecodeStep_Length3of8: -- case MHD_WebSocket_DecodeStep_Length4of8: -- case MHD_WebSocket_DecodeStep_Length5of8: -- case MHD_WebSocket_DecodeStep_Length6of8: -- case MHD_WebSocket_DecodeStep_Length7of8: -- /* Mask first 3 bytes of 4 bytes */ -- case MHD_WebSocket_DecodeStep_Mask1Of4: -- case MHD_WebSocket_DecodeStep_Mask2Of4: -- case MHD_WebSocket_DecodeStep_Mask3Of4: -- ws->frame_header [ws->frame_header_size++] = streambuf [current++]; -- ++ws->decode_step; -- break; -- -- /* 2 byte length finished */ -- case MHD_WebSocket_DecodeStep_Length2of2: -- { -- ws->frame_header [ws->frame_header_size++] = streambuf [current++]; -- size_t size = (size_t) MHD_htons ( -- *((uint16_t *) &ws->frame_header [2])); -- if (125 >= size) -- { -- /* RFC 6455 5.2 Payload length: The minimal number of bytes */ -- /* must be used for the length */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- if ((SIZE_MAX < size) || -- (ws->max_payload_size && (ws->max_payload_size < size)) ) -- { -- /* RFC 6455 7.4.1 1009: If the message is too big to process, */ -- /* we may close the connection */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_MAXIMUM_ALLOWED_PAYLOAD_SIZE_EXCEEDED, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED; -- } -- ws->payload_size = size; -- if (0 != (ws->frame_header [1] & 0x80)) -- { -- /* with mask */ -- ws->decode_step = MHD_WebSocket_DecodeStep_Mask1Of4; -- } -- else -- { -- /* without mask */ -- *((uint32_t *) ws->mask_key) = 0; -- ws->decode_step = MHD_WebSocket_DecodeStep_HeaderCompleted; -- } -- } -- break; -- -- /* 8 byte length finished */ -- case MHD_WebSocket_DecodeStep_Length8of8: -- { -- ws->frame_header [ws->frame_header_size++] = streambuf [current++]; -- uint64_t size = MHD_htonll (*((uint64_t *) &ws->frame_header [2])); -- if (0x7fffffffffffffff < size) -- { -- /* RFC 6455 5.2 frame-payload-length-63: The length may */ -- /* not exceed 0x7fffffffffffffff */ -- ws->decode_step = MHD_WebSocket_DecodeStep_BrokenStream; -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- if (65535 >= size) -- { -- /* RFC 6455 5.2 Payload length: The minimal number of bytes */ -- /* must be used for the length */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_PROTOCOL_ERROR, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- } -- if ((SIZE_MAX < size) || -- (ws->max_payload_size && (ws->max_payload_size < size)) ) -- { -- /* RFC 6455 7.4.1 1009: If the message is too big to process, */ -- /* we may close the connection */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_MAXIMUM_ALLOWED_PAYLOAD_SIZE_EXCEEDED, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED; -- } -- ws->payload_size = (size_t) size; -- -- if (0 != (ws->frame_header [1] & 0x80)) -- { -- /* with mask */ -- ws->decode_step = MHD_WebSocket_DecodeStep_Mask1Of4; -- } -- else -- { -- /* without mask */ -- *((uint32_t *) ws->mask_key) = 0; -- ws->decode_step = MHD_WebSocket_DecodeStep_HeaderCompleted; -- } -- } -- break; -- -- /* mask finished */ -- case MHD_WebSocket_DecodeStep_Mask4Of4: -- ws->frame_header [ws->frame_header_size++] = streambuf [current++]; -- *((uint32_t *) ws->mask_key) = *((uint32_t *) &ws->frame_header [ws-> -- frame_header_size -- - 4]); -- ws->decode_step = MHD_WebSocket_DecodeStep_HeaderCompleted; -- break; -- -- /* header finished */ -- case MHD_WebSocket_DecodeStep_HeaderCompleted: -- /* return or assign either to data or control */ -- { -- int ret = MHD_websocket_decode_header_complete (ws, -- payload, -- payload_len); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- *streambuf_read_len = current; -- return ret; -- } -- } -- break; -- -- /* payload data */ -- case MHD_WebSocket_DecodeStep_PayloadOfDataFrame: -- case MHD_WebSocket_DecodeStep_PayloadOfControlFrame: -- { -- size_t bytes_needed = ws->payload_size - ws->payload_index; -- size_t bytes_remaining = streambuf_len - current; -- size_t bytes_to_take = bytes_needed < bytes_remaining ? bytes_needed : -- bytes_remaining; -- if (0 != bytes_to_take) -- { -- size_t utf8_start = ws->payload_index; -- char *decode_payload = ws->decode_step == -- MHD_WebSocket_DecodeStep_PayloadOfDataFrame ? -- ws->data_payload_start : -- ws->control_payload; -- -- /* copy the new payload data (with unmasking if necessary */ -- MHD_websocket_copy_payload (decode_payload + ws->payload_index, -- &streambuf [current], -- bytes_to_take, -- *((uint32_t *) ws->mask_key), -- (unsigned long) (ws->payload_index -- & 0x03)); -- current += bytes_to_take; -- ws->payload_index += bytes_to_take; -- if (((MHD_WebSocket_DecodeStep_PayloadOfDataFrame == -- ws->decode_step) && -- (MHD_WebSocket_Opcode_Text == ws->data_type)) || -- ((MHD_WebSocket_DecodeStep_PayloadOfControlFrame == -- ws->decode_step) && -- (MHD_WebSocket_Opcode_Close == (ws->frame_header [0] & 0x0f)) && -- (2 < ws->payload_index)) ) -- { -- /* RFC 6455 8.1: We need to check the UTF-8 validity */ -- int utf8_step; -- char *decode_payload_utf8; -- size_t bytes_to_check; -- size_t utf8_error_offset = 0; -- if (MHD_WebSocket_DecodeStep_PayloadOfDataFrame == ws->decode_step) -- { -- utf8_step = ws->data_utf8_step; -- decode_payload_utf8 = decode_payload + utf8_start; -- bytes_to_check = bytes_to_take; -- } -- else -- { -- utf8_step = ws->control_utf8_step; -- if ((MHD_WebSocket_Opcode_Close == (ws->frame_header [0] -- & 0x0f)) && -- (2 > utf8_start) ) -- { -- /* The first two bytes of the close frame are binary content and */ -- /* must be skipped in the UTF-8 check */ -- utf8_start = 2; -- utf8_error_offset = 2; -- } -- decode_payload_utf8 = decode_payload + utf8_start; -- bytes_to_check = bytes_to_take - utf8_start; -- } -- size_t utf8_check_offset = 0; -- int utf8_result = MHD_websocket_check_utf8 (decode_payload_utf8, -- bytes_to_check, -- &utf8_step, -- &utf8_check_offset); -- if (MHD_WebSocket_UTF8Result_Invalid != utf8_result) -- { -- /* memorize current validity check step to continue later */ -- ws->data_utf8_step = utf8_step; -- } -- else -- { -- /* RFC 6455 8.1: We must fail on broken UTF-8 sequence */ -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_MALFORMED_UTF8, -- 0, -- 0, -- payload, -- payload_len); -- } -- *streambuf_read_len = current - bytes_to_take -- + utf8_check_offset + utf8_error_offset; -- return MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR; -- } -- } -- } -- } -- -- if (ws->payload_size == ws->payload_index) -- { -- /* all payload data of the current frame has been received */ -- int ret = MHD_websocket_decode_payload_complete (ws, -- payload, -- payload_len); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- *streambuf_read_len = current; -- return ret; -- } -- } -- break; -- -- case MHD_WebSocket_DecodeStep_BrokenStream: -- *streambuf_read_len = current; -- return MHD_WEBSOCKET_STATUS_STREAM_BROKEN; -- } -- } -- -- /* Special treatment for zero payload length messages */ -- if (MHD_WebSocket_DecodeStep_HeaderCompleted == ws->decode_step) -- { -- int ret = MHD_websocket_decode_header_complete (ws, -- payload, -- payload_len); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- *streambuf_read_len = current; -- return ret; -- } -- } -- switch (ws->decode_step) -- { -- case MHD_WebSocket_DecodeStep_PayloadOfDataFrame: -- case MHD_WebSocket_DecodeStep_PayloadOfControlFrame: -- if (ws->payload_size == ws->payload_index) -- { -- /* all payload data of the current frame has been received */ -- int ret = MHD_websocket_decode_payload_complete (ws, -- payload, -- payload_len); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- *streambuf_read_len = current; -- return ret; -- } -- } -- break; -- } -- *streambuf_read_len = current; -- -- /* more data needed */ -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --static enum MHD_WEBSOCKET_STATUS --MHD_websocket_decode_header_complete (struct MHD_WebSocketStream *ws, -- char **payload, -- size_t *payload_len) --{ -- /* assign either to data or control */ -- char opcode = ws->frame_header [0] & 0x0f; -- switch (opcode) -- { -- case MHD_WebSocket_Opcode_Continuation: -- { -- /* validate payload size */ -- size_t new_size_total = ws->payload_size + ws->data_payload_size; -- if ((0 != ws->max_payload_size) && (ws->max_payload_size < -- new_size_total) ) -- { -- /* RFC 6455 7.4.1 1009: If the message is too big to process, */ -- /* we may close the connection */ -- ws->decode_step = MHD_WebSocket_DecodeStep_BrokenStream; -- ws->validity = MHD_WEBSOCKET_VALIDITY_INVALID; -- if (0 != (ws->flags -- & MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR)) -- { -- MHD_websocket_encode_close (ws, -- MHD_WEBSOCKET_CLOSEREASON_MAXIMUM_ALLOWED_PAYLOAD_SIZE_EXCEEDED, -- 0, -- 0, -- payload, -- payload_len); -- } -- return MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED; -- } -- /* allocate buffer for continued data frame */ -- char *new_buf = NULL; -- if (0 != new_size_total) -- { -- new_buf = ws->realloc (ws->data_payload, new_size_total + 1); -- if (NULL == new_buf) -- { -- return MHD_WEBSOCKET_STATUS_MEMORY_ERROR; -- } -- new_buf [new_size_total] = 0; -- ws->data_payload_start = &new_buf[ws->data_payload_size]; -- } -- else -- { -- ws->data_payload_start = new_buf; -- } -- ws->data_payload = new_buf; -- ws->data_payload_size = new_size_total; -- } -- ws->decode_step = MHD_WebSocket_DecodeStep_PayloadOfDataFrame; -- break; -- -- case MHD_WebSocket_Opcode_Text: -- case MHD_WebSocket_Opcode_Binary: -- /* allocate buffer for data frame */ -- { -- size_t new_size_total = ws->payload_size; -- char *new_buf = NULL; -- if (0 != new_size_total) -- { -- new_buf = ws->malloc (new_size_total + 1); -- if (NULL == new_buf) -- { -- return MHD_WEBSOCKET_STATUS_MEMORY_ERROR; -- } -- new_buf [new_size_total] = 0; -- } -- ws->data_payload = new_buf; -- ws->data_payload_start = new_buf; -- ws->data_payload_size = new_size_total; -- ws->data_type = opcode; -- } -- ws->decode_step = MHD_WebSocket_DecodeStep_PayloadOfDataFrame; -- break; -- -- case MHD_WebSocket_Opcode_Close: -- case MHD_WebSocket_Opcode_Ping: -- case MHD_WebSocket_Opcode_Pong: -- /* allocate buffer for control frame */ -- { -- size_t new_size_total = ws->payload_size; -- char *new_buf = NULL; -- if (0 != new_size_total) -- { -- new_buf = ws->malloc (new_size_total + 1); -- if (NULL == new_buf) -- { -- return MHD_WEBSOCKET_STATUS_MEMORY_ERROR; -- } -- new_buf[new_size_total] = 0; -- } -- ws->control_payload = new_buf; -- } -- ws->decode_step = MHD_WebSocket_DecodeStep_PayloadOfControlFrame; -- break; -- } -- -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --static enum MHD_WEBSOCKET_STATUS --MHD_websocket_decode_payload_complete (struct MHD_WebSocketStream *ws, -- char **payload, -- size_t *payload_len) --{ -- /* all payload data of the current frame has been received */ -- char is_continue = MHD_WebSocket_Opcode_Continuation == -- (ws->frame_header [0] & 0x0F); -- char is_fin = ws->frame_header [0] & 0x80; -- if (0 != is_fin) -- { -- /* the frame is complete */ -- if (MHD_WebSocket_DecodeStep_PayloadOfDataFrame == ws->decode_step) -- { -- /* data frame */ -- char data_type = ws->data_type; -- if ((0 != (ws->flags & MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS)) && -- (0 != is_continue)) -- { -- data_type |= 0x40; /* mark as last fragment */ -- } -- *payload = ws->data_payload; -- *payload_len = ws->data_payload_size; -- ws->data_payload = 0; -- ws->data_payload_start = 0; -- ws->data_payload_size = 0; -- ws->decode_step = MHD_WebSocket_DecodeStep_Start; -- ws->payload_index = 0; -- ws->data_type = 0; -- ws->frame_header_size = 0; -- return data_type; -- } -- else -- { -- /* control frame */ -- *payload = ws->control_payload; -- *payload_len = ws->payload_size; -- ws->control_payload = 0; -- ws->decode_step = MHD_WebSocket_DecodeStep_Start; -- ws->payload_index = 0; -- ws->frame_header_size = 0; -- return (ws->frame_header [0] & 0x0f); -- } -- } -- else if (0 != (ws->flags & MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS)) -- { -- /* RFC 6455 5.4: To allow streaming, the user can choose */ -- /* to return fragments */ -- if ((MHD_WebSocket_Opcode_Text == ws->data_type) && -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != ws->data_utf8_step) ) -- { -- /* the last UTF-8 sequence is incomplete, so we keep the start of -- that and only return the part before */ -- size_t given_utf8 = 0; -- switch (ws->data_utf8_step) -- { -- /* one byte given */ -- case MHD_WEBSOCKET_UTF8STEP_UTF2TAIL_1OF1: -- case MHD_WEBSOCKET_UTF8STEP_UTF3TAIL1_1OF2: -- case MHD_WEBSOCKET_UTF8STEP_UTF3TAIL2_1OF2: -- case MHD_WEBSOCKET_UTF8STEP_UTF3TAIL_1OF2: -- case MHD_WEBSOCKET_UTF8STEP_UTF4TAIL1_1OF3: -- case MHD_WEBSOCKET_UTF8STEP_UTF4TAIL2_1OF3: -- case MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_1OF3: -- given_utf8 = 1; -- break; -- /* two bytes given */ -- case MHD_WEBSOCKET_UTF8STEP_UTF3TAIL_2OF2: -- case MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_2OF3: -- given_utf8 = 2; -- break; -- /* three bytes given */ -- case MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_3OF3: -- given_utf8 = 3; -- break; -- } -- size_t new_len = ws->data_payload_size - given_utf8; -- if (0 != new_len) -- { -- char *next_payload = ws->malloc (given_utf8 + 1); -- if (NULL == next_payload) -- { -- return MHD_WEBSOCKET_STATUS_MEMORY_ERROR; -- } -- memcpy (next_payload, -- ws->data_payload_start + ws->payload_index - given_utf8, -- given_utf8); -- next_payload[given_utf8] = 0; -- -- ws->data_payload[new_len] = 0; -- *payload = ws->data_payload; -- *payload_len = new_len; -- ws->data_payload = next_payload; -- ws->data_payload_size = given_utf8; -- } -- else -- { -- *payload = NULL; -- *payload_len = 0; -- } -- ws->decode_step = MHD_WebSocket_DecodeStep_Start; -- ws->payload_index = 0; -- ws->frame_header_size = 0; -- if (0 != is_continue) -- return ws->data_type | 0x20; /* mark as middle fragment */ -- else -- return ws->data_type | 0x10; /* mark as first fragment */ -- } -- else -- { -- /* we simply pass the entire data frame */ -- *payload = ws->data_payload; -- *payload_len = ws->data_payload_size; -- ws->data_payload = 0; -- ws->data_payload_start = 0; -- ws->data_payload_size = 0; -- ws->decode_step = MHD_WebSocket_DecodeStep_Start; -- ws->payload_index = 0; -- ws->frame_header_size = 0; -- if (0 != is_continue) -- return ws->data_type | 0x20; /* mark as middle fragment */ -- else -- return ws->data_type | 0x10; /* mark as first fragment */ -- } -- } -- else -- { -- /* RFC 6455 5.4: We must await a continuation frame to get */ -- /* the remainder of this data frame */ -- ws->decode_step = MHD_WebSocket_DecodeStep_Start; -- ws->frame_header_size = 0; -- ws->payload_index = 0; -- return MHD_WEBSOCKET_STATUS_OK; -- } --} -- -- --/** -- * Splits the received close reason -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_split_close_reason (const char *payload, -- size_t payload_len, -- unsigned short *reason_code, -- const char **reason_utf8, -- size_t *reason_utf8_len) --{ -- /* initialize output variables for errors cases */ -- if (NULL != reason_code) -- *reason_code = MHD_WEBSOCKET_CLOSEREASON_NO_REASON; -- if (NULL != reason_utf8) -- *reason_utf8 = NULL; -- if (NULL != reason_utf8_len) -- *reason_utf8_len = 0; -- -- /* validate parameters */ -- if ((NULL == payload) && (0 != payload_len)) -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- if (1 == payload_len) -- return MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR; -- if (125 < payload_len) -- return MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED; -- -- /* decode reason code */ -- if (2 > payload_len) -- { -- if (NULL != reason_code) -- *reason_code = MHD_WEBSOCKET_CLOSEREASON_NO_REASON; -- } -- else -- { -- if (NULL != reason_code) -- *reason_code = MHD_htons (*((uint16_t *) payload)); -- } -- -- /* decode reason text */ -- if (2 >= payload_len) -- { -- if (NULL != reason_utf8) -- *reason_utf8 = NULL; -- if (NULL != reason_utf8_len) -- *reason_utf8_len = 0; -- } -- else -- { -- if (NULL != reason_utf8) -- *reason_utf8 = payload + 2; -- if (NULL != reason_utf8_len) -- *reason_utf8_len = payload_len - 2; -- } -- -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --/** -- * Encodes a text into a websocket text frame -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_encode_text (struct MHD_WebSocketStream *ws, -- const char *payload_utf8, -- size_t payload_utf8_len, -- int fragmentation, -- char **frame, -- size_t *frame_len, -- int *utf8_step) --{ -- /* initialize output variables for errors cases */ -- if (NULL != frame) -- *frame = NULL; -- if (NULL != frame_len) -- *frame_len = 0; -- if ((NULL != utf8_step) && -- ((MHD_WEBSOCKET_FRAGMENTATION_FIRST == fragmentation) || -- (MHD_WEBSOCKET_FRAGMENTATION_NONE == fragmentation) )) -- { -- /* the old UTF-8 step will be ignored for new fragments */ -- *utf8_step = MHD_WEBSOCKET_UTF8STEP_NORMAL; -- } -- -- /* validate parameters */ -- if ((NULL == ws) || -- ((0 != payload_utf8_len) && (NULL == payload_utf8)) || -- (NULL == frame) || -- (NULL == frame_len) || -- (MHD_WEBSOCKET_FRAGMENTATION_NONE > fragmentation) || -- (MHD_WEBSOCKET_FRAGMENTATION_LAST < fragmentation) || -- ((MHD_WEBSOCKET_FRAGMENTATION_NONE != fragmentation) && -- (NULL == utf8_step)) ) -- { -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- } -- -- /* check max length */ -- if ((uint64_t) 0x7FFFFFFFFFFFFFFF < (uint64_t) payload_utf8_len) -- { -- return MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED; -- } -- -- /* check UTF-8 */ -- int utf8_result = MHD_websocket_check_utf8 (payload_utf8, -- payload_utf8_len, -- utf8_step, -- NULL); -- if ((MHD_WebSocket_UTF8Result_Invalid == utf8_result) || -- ((MHD_WebSocket_UTF8Result_Incomplete == utf8_result) && -- (MHD_WEBSOCKET_FRAGMENTATION_NONE == fragmentation)) ) -- { -- return MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR; -- } -- -- /* encode data */ -- return MHD_websocket_encode_data (ws, -- payload_utf8, -- payload_utf8_len, -- fragmentation, -- frame, -- frame_len, -- MHD_WebSocket_Opcode_Text); --} -- -- --/** -- * Encodes binary data into a websocket binary frame -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_encode_binary (struct MHD_WebSocketStream *ws, -- const char *payload, -- size_t payload_len, -- int fragmentation, -- char **frame, -- size_t *frame_len) --{ -- /* initialize output variables for errors cases */ -- if (NULL != frame) -- *frame = NULL; -- if (NULL != frame_len) -- *frame_len = 0; -- -- /* validate parameters */ -- if ((NULL == ws) || -- ((0 != payload_len) && (NULL == payload)) || -- (NULL == frame) || -- (NULL == frame_len) || -- (MHD_WEBSOCKET_FRAGMENTATION_NONE > fragmentation) || -- (MHD_WEBSOCKET_FRAGMENTATION_LAST < fragmentation) ) -- { -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- } -- -- /* check max length */ -- if ((uint64_t) 0x7FFFFFFFFFFFFFFF < (uint64_t) payload_len) -- { -- return MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED; -- } -- -- return MHD_websocket_encode_data (ws, -- payload, -- payload_len, -- fragmentation, -- frame, -- frame_len, -- MHD_WebSocket_Opcode_Binary); --} -- -- --/** -- * Internal function for encoding text/binary data into a websocket frame -- */ --static enum MHD_WEBSOCKET_STATUS --MHD_websocket_encode_data (struct MHD_WebSocketStream *ws, -- const char *payload, -- size_t payload_len, -- int fragmentation, -- char **frame, -- size_t *frame_len, -- char opcode) --{ -- /* calculate length and masking */ -- char is_masked = MHD_websocket_encode_is_masked (ws); -- size_t overhead_len = MHD_websocket_encode_overhead_size (ws, payload_len); -- size_t total_len = overhead_len + payload_len; -- uint32_t mask = 0 != is_masked ? MHD_websocket_generate_mask (ws) : 0; -- -- /* allocate memory */ -- char *result = ws->malloc (total_len + 1); -- if (NULL == result) -- return MHD_WEBSOCKET_STATUS_MEMORY_ERROR; -- result [total_len] = 0; -- *frame = result; -- *frame_len = total_len; -- -- /* add the opcode */ -- switch (fragmentation) -- { -- case MHD_WEBSOCKET_FRAGMENTATION_NONE: -- *(result++) = 0x80 | opcode; -- break; -- case MHD_WEBSOCKET_FRAGMENTATION_FIRST: -- *(result++) = opcode; -- break; -- case MHD_WEBSOCKET_FRAGMENTATION_FOLLOWING: -- *(result++) = MHD_WebSocket_Opcode_Continuation; -- break; -- case MHD_WEBSOCKET_FRAGMENTATION_LAST: -- *(result++) = 0x80 | MHD_WebSocket_Opcode_Continuation; -- break; -- } -- -- /* add the length */ -- if (126 > payload_len) -- { -- *(result++) = is_masked | (char) payload_len; -- } -- else if (65536 > payload_len) -- { -- *(result++) = is_masked | 126; -- *((uint16_t *) result) = MHD_htons ((uint16_t) payload_len); -- result += 2; -- } -- else -- { -- *(result++) = is_masked | 127; -- *((uint64_t *) result) = MHD_htonll ((uint64_t) payload_len); -- result += 8; -- -- } -- -- /* add the mask */ -- if (0 != is_masked) -- { -- *(result++) = ((char *) &mask)[0]; -- *(result++) = ((char *) &mask)[1]; -- *(result++) = ((char *) &mask)[2]; -- *(result++) = ((char *) &mask)[3]; -- } -- -- /* add the payload */ -- if (0 != payload_len) -- { -- MHD_websocket_copy_payload (result, -- payload, -- payload_len, -- mask, -- 0); -- } -- -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --/** -- * Encodes a websocket ping frame -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_encode_ping (struct MHD_WebSocketStream *ws, -- const char *payload, -- size_t payload_len, -- char **frame, -- size_t *frame_len) --{ -- /* encode the ping frame */ -- return MHD_websocket_encode_ping_pong (ws, -- payload, -- payload_len, -- frame, -- frame_len, -- MHD_WebSocket_Opcode_Ping); --} -- -- --/** -- * Encodes a websocket pong frame -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_encode_pong (struct MHD_WebSocketStream *ws, -- const char *payload, -- size_t payload_len, -- char **frame, -- size_t *frame_len) --{ -- /* encode the pong frame */ -- return MHD_websocket_encode_ping_pong (ws, -- payload, -- payload_len, -- frame, -- frame_len, -- MHD_WebSocket_Opcode_Pong); --} -- -- --/** -- * Internal function for encoding ping/pong frames -- */ --static enum MHD_WEBSOCKET_STATUS --MHD_websocket_encode_ping_pong (struct MHD_WebSocketStream *ws, -- const char *payload, -- size_t payload_len, -- char **frame, -- size_t *frame_len, -- char opcode) --{ -- /* initialize output variables for errors cases */ -- if (NULL != frame) -- *frame = NULL; -- if (NULL != frame_len) -- *frame_len = 0; -- -- /* validate the parameters */ -- if ((NULL == ws) || -- ((0 != payload_len) && (NULL == payload)) || -- (NULL == frame) || -- (NULL == frame_len) ) -- { -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- } -- -- /* RFC 6455 5.5: Control frames may only have up to 125 bytes of payload data */ -- if (125 < payload_len) -- return MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED; -- -- /* calculate length and masking */ -- char is_masked = MHD_websocket_encode_is_masked (ws); -- size_t overhead_len = MHD_websocket_encode_overhead_size (ws, payload_len); -- size_t total_len = overhead_len + payload_len; -- uint32_t mask = is_masked != 0 ? MHD_websocket_generate_mask (ws) : 0; -- -- /* allocate memory */ -- char *result = ws->malloc (total_len + 1); -- if (NULL == result) -- return MHD_WEBSOCKET_STATUS_MEMORY_ERROR; -- result [total_len] = 0; -- *frame = result; -- *frame_len = total_len; -- -- /* add the opcode */ -- *(result++) = 0x80 | opcode; -- -- /* add the length */ -- *(result++) = is_masked | (char) payload_len; -- -- /* add the mask */ -- if (0 != is_masked) -- { -- *(result++) = ((char *) &mask)[0]; -- *(result++) = ((char *) &mask)[1]; -- *(result++) = ((char *) &mask)[2]; -- *(result++) = ((char *) &mask)[3]; -- } -- -- /* add the payload */ -- if (0 != payload_len) -- { -- MHD_websocket_copy_payload (result, -- payload, -- payload_len, -- mask, -- 0); -- } -- -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --/** -- * Encodes a websocket close frame -- */ --_MHD_EXTERN enum MHD_WEBSOCKET_STATUS --MHD_websocket_encode_close (struct MHD_WebSocketStream *ws, -- unsigned short reason_code, -- const char *reason_utf8, -- size_t reason_utf8_len, -- char **frame, -- size_t *frame_len) --{ -- /* initialize output variables for errors cases */ -- if (NULL != frame) -- *frame = NULL; -- if (NULL != frame_len) -- *frame_len = 0; -- -- /* validate the parameters */ -- if ((NULL == ws) || -- ((0 != reason_utf8_len) && (NULL == reason_utf8)) || -- (NULL == frame) || -- (NULL == frame_len) || -- ((MHD_WEBSOCKET_CLOSEREASON_NO_REASON != reason_code) && -- (1000 > reason_code)) || -- ((0 != reason_utf8_len) && -- (MHD_WEBSOCKET_CLOSEREASON_NO_REASON == reason_code)) ) -- { -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- } -- -- /* RFC 6455 5.5: Control frames may only have up to 125 bytes of payload data, */ -- /* but in this case only 123 bytes, because 2 bytes are reserved */ -- /* for the close reason code. */ -- if (123 < reason_utf8_len) -- return MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED; -- -- /* RFC 6455 5.5.1: If close payload data is given, it must be valid UTF-8 */ -- if (0 != reason_utf8_len) -- { -- int utf8_result = MHD_websocket_check_utf8 (reason_utf8, -- reason_utf8_len, -- NULL, -- NULL); -- if (MHD_WebSocket_UTF8Result_Valid != utf8_result) -- return MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR; -- } -- -- /* calculate length and masking */ -- char is_masked = MHD_websocket_encode_is_masked (ws); -- size_t payload_len = (MHD_WEBSOCKET_CLOSEREASON_NO_REASON != reason_code ? -- 2 + reason_utf8_len : 0); -- size_t overhead_len = MHD_websocket_encode_overhead_size (ws, payload_len); -- size_t total_len = overhead_len + payload_len; -- uint32_t mask = is_masked != 0 ? MHD_websocket_generate_mask (ws) : 0; -- -- /* allocate memory */ -- char *result = ws->malloc (total_len + 1); -- if (NULL == result) -- return MHD_WEBSOCKET_STATUS_MEMORY_ERROR; -- result [total_len] = 0; -- *frame = result; -- *frame_len = total_len; -- -- /* add the opcode */ -- *(result++) = 0x88; -- -- /* add the length */ -- *(result++) = is_masked | (char) payload_len; -- -- /* add the mask */ -- if (0 != is_masked) -- { -- *(result++) = ((char *) &mask)[0]; -- *(result++) = ((char *) &mask)[1]; -- *(result++) = ((char *) &mask)[2]; -- *(result++) = ((char *) &mask)[3]; -- } -- -- /* add the payload */ -- if (0 != reason_code) -- { -- /* close reason code */ -- uint16_t reason_code_nb = MHD_htons (reason_code); -- MHD_websocket_copy_payload (result, -- (const char *) &reason_code_nb, -- 2, -- mask, -- 0); -- result += 2; -- -- /* custom reason payload */ -- if (0 != reason_utf8_len) -- { -- MHD_websocket_copy_payload (result, -- reason_utf8, -- reason_utf8_len, -- mask, -- 2); -- } -- } -- -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --/** -- * Returns the 0x80 prefix for masked data, 0x00 otherwise -- */ --static char --MHD_websocket_encode_is_masked (struct MHD_WebSocketStream *ws) --{ -- return (ws->flags & MHD_WEBSOCKET_FLAG_MASK_SERVERCLIENT) == -- MHD_WEBSOCKET_FLAG_CLIENT ? 0x80 : 0x00; --} -- -- --/** -- * Calculates the size of the overhead in bytes -- */ --static char --MHD_websocket_encode_overhead_size (struct MHD_WebSocketStream *ws, -- size_t payload_len) --{ -- return 2 + (MHD_websocket_encode_is_masked (ws) != 0 ? 4 : 0) + (125 < -- payload_len ? -- (65535 < -- payload_len -- ? 8 : 2) : 0); --} -- -- --/** -- * Copies the payload to the destination (using mask) -- */ --static void --MHD_websocket_copy_payload (char *dst, -- const char *src, -- size_t len, -- uint32_t mask, -- unsigned long mask_offset) --{ -- if (0 != len) -- { -- if (0 == mask) -- { -- /* when the mask is zero, we can just copy the data */ -- memcpy (dst, src, len); -- } -- else -- { -- /* mask is used */ -- char mask_[4]; -- *((uint32_t *) mask_) = mask; -- for (size_t i = 0; i < len; ++i) -- { -- dst[i] = src[i] ^ mask_[(i + mask_offset) & 3]; -- } -- } -- } --} -- -- --/** -- * Checks a UTF-8 sequence -- */ --static int --MHD_websocket_check_utf8 (const char *buf, -- size_t buf_len, -- int *utf8_step, -- size_t *buf_offset) --{ -- int utf8_step_ = (NULL != utf8_step) ? *utf8_step : -- MHD_WEBSOCKET_UTF8STEP_NORMAL; -- -- for (size_t i = 0; i < buf_len; ++i) -- { -- unsigned char character = (unsigned char) buf[i]; -- switch (utf8_step_) -- { -- case MHD_WEBSOCKET_UTF8STEP_NORMAL: -- if ((0x00 <= character) && (0x7F >= character)) -- { -- /* RFC 3629 4: single byte UTF-8 sequence */ -- /* (nothing to do here) */ -- } -- else if ((0xC2 <= character) && (0xDF >= character)) -- { -- /* RFC 3629 4: two byte UTF-8 sequence */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF2TAIL_1OF1; -- } -- else if (0xE0 == character) -- { -- /* RFC 3629 4: three byte UTF-8 sequence, but the second byte must be 0xA0-0xBF */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF3TAIL1_1OF2; -- } -- else if (0xED == character) -- { -- /* RFC 3629 4: three byte UTF-8 sequence, but the second byte must be 0x80-0x9F */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF3TAIL2_1OF2; -- } -- else if (((0xE1 <= character) && (0xEC >= character)) || -- ((0xEE <= character) && (0xEF >= character)) ) -- { -- /* RFC 3629 4: three byte UTF-8 sequence, both tail bytes must be 0x80-0xBF */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF3TAIL_1OF2; -- } -- else if (0xF0 == character) -- { -- /* RFC 3629 4: four byte UTF-8 sequence, but the second byte must be 0x90-0xBF */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL1_1OF3; -- } -- else if (0xF4 == character) -- { -- /* RFC 3629 4: four byte UTF-8 sequence, but the second byte must be 0x80-0x8F */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL2_1OF3; -- } -- else if ((0xF1 <= character) && (0xF3 >= character)) -- { -- /* RFC 3629 4: four byte UTF-8 sequence, all three tail bytes must be 0x80-0xBF */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_1OF3; -- } -- else -- { -- /* RFC 3629 4: Invalid UTF-8 byte */ -- if (NULL != buf_offset) -- *buf_offset = i; -- return MHD_WebSocket_UTF8Result_Invalid; -- } -- break; -- -- case MHD_WEBSOCKET_UTF8STEP_UTF3TAIL1_1OF2: -- if ((0xA0 <= character) && (0xBF >= character)) -- { -- /* RFC 3629 4: Second byte of three byte UTF-8 sequence */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF3TAIL_2OF2; -- } -- else -- { -- /* RFC 3629 4: Invalid UTF-8 byte */ -- if (NULL != buf_offset) -- *buf_offset = i; -- return MHD_WebSocket_UTF8Result_Invalid; -- } -- break; -- -- case MHD_WEBSOCKET_UTF8STEP_UTF3TAIL2_1OF2: -- if ((0x80 <= character) && (0x9F >= character)) -- { -- /* RFC 3629 4: Second byte of three byte UTF-8 sequence */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF3TAIL_2OF2; -- } -- else -- { -- /* RFC 3629 4: Invalid UTF-8 byte */ -- if (NULL != buf_offset) -- *buf_offset = i; -- return MHD_WebSocket_UTF8Result_Invalid; -- } -- break; -- -- case MHD_WEBSOCKET_UTF8STEP_UTF3TAIL_1OF2: -- if ((0x80 <= character) && (0xBF >= character)) -- { -- /* RFC 3629 4: Second byte of three byte UTF-8 sequence */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF3TAIL_2OF2; -- } -- else -- { -- /* RFC 3629 4: Invalid UTF-8 byte */ -- if (NULL != buf_offset) -- *buf_offset = i; -- return MHD_WebSocket_UTF8Result_Invalid; -- } -- break; -- -- case MHD_WEBSOCKET_UTF8STEP_UTF4TAIL1_1OF3: -- if ((0x90 <= character) && (0xBF >= character)) -- { -- /* RFC 3629 4: Second byte of four byte UTF-8 sequence */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_2OF3; -- } -- else -- { -- /* RFC 3629 4: Invalid UTF-8 byte */ -- if (NULL != buf_offset) -- *buf_offset = i; -- return MHD_WebSocket_UTF8Result_Invalid; -- } -- break; -- -- case MHD_WEBSOCKET_UTF8STEP_UTF4TAIL2_1OF3: -- if ((0x80 <= character) && (0x8F >= character)) -- { -- /* RFC 3629 4: Second byte of four byte UTF-8 sequence */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_2OF3; -- } -- else -- { -- /* RFC 3629 4: Invalid UTF-8 byte */ -- if (NULL != buf_offset) -- *buf_offset = i; -- return MHD_WebSocket_UTF8Result_Invalid; -- } -- break; -- -- case MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_1OF3: -- if ((0x80 <= character) && (0xBF >= character)) -- { -- /* RFC 3629 4: Second byte of four byte UTF-8 sequence */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_2OF3; -- } -- else -- { -- /* RFC 3629 4: Invalid UTF-8 byte */ -- if (NULL != buf_offset) -- *buf_offset = i; -- return MHD_WebSocket_UTF8Result_Invalid; -- } -- break; -- -- case MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_2OF3: -- if ((0x80 <= character) && (0xBF >= character)) -- { -- /* RFC 3629 4: Third byte of four byte UTF-8 sequence */ -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_3OF3; -- } -- else -- { -- /* RFC 3629 4: Invalid UTF-8 byte */ -- if (NULL != buf_offset) -- *buf_offset = i; -- return MHD_WebSocket_UTF8Result_Invalid; -- } -- break; -- -- /* RFC 3629 4: Second byte of two byte UTF-8 sequence */ -- case MHD_WEBSOCKET_UTF8STEP_UTF2TAIL_1OF1: -- /* RFC 3629 4: Third byte of three byte UTF-8 sequence */ -- case MHD_WEBSOCKET_UTF8STEP_UTF3TAIL_2OF2: -- /* RFC 3629 4: Fourth byte of four byte UTF-8 sequence */ -- case MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_3OF3: -- if ((0x80 <= character) && (0xBF >= character)) -- { -- utf8_step_ = MHD_WEBSOCKET_UTF8STEP_NORMAL; -- } -- else -- { -- /* RFC 3629 4: Invalid UTF-8 byte */ -- if (NULL != buf_offset) -- *buf_offset = i; -- return MHD_WebSocket_UTF8Result_Invalid; -- } -- break; -- -- default: -- /* Invalid last step...? */ -- if (NULL != buf_offset) -- *buf_offset = i; -- return MHD_WebSocket_UTF8Result_Invalid; -- } -- } -- -- /* return values */ -- if (NULL != utf8_step) -- *utf8_step = utf8_step_; -- if (NULL != buf_offset) -- *buf_offset = buf_len; -- if (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step_) -- { -- return MHD_WebSocket_UTF8Result_Incomplete; -- } -- return MHD_WebSocket_UTF8Result_Valid; --} -- -- --/** -- * Generates a mask for masking by calling -- * a random number generator. -- */ --static uint32_t --MHD_websocket_generate_mask (struct MHD_WebSocketStream *ws) --{ -- unsigned char mask_[4]; -- if (NULL != ws->rng) -- { -- size_t offset = 0; -- while (offset < 4) -- { -- size_t encoded = ws->rng (ws->cls_rng, -- mask_ + offset, -- 4 - offset); -- offset += encoded; -- } -- } -- else -- { -- /* this case should never happen */ -- mask_ [0] = 0; -- mask_ [1] = 0; -- mask_ [2] = 0; -- mask_ [3] = 0; -- } -- -- return *((uint32_t *) mask_); --} -- -- --/** -- * Calls the malloc function associated with the websocket steam -- */ --_MHD_EXTERN void * --MHD_websocket_malloc (struct MHD_WebSocketStream *ws, -- size_t buf_len) --{ -- if (NULL == ws) -- { -- return NULL; -- } -- -- return ws->malloc (buf_len); --} -- -- --/** -- * Calls the realloc function associated with the websocket steam -- */ --_MHD_EXTERN void * --MHD_websocket_realloc (struct MHD_WebSocketStream *ws, -- void *buf, -- size_t new_buf_len) --{ -- if (NULL == ws) -- { -- return NULL; -- } -- -- return ws->realloc (buf, new_buf_len); --} -- -- --/** -- * Calls the free function associated with the websocket steam -- */ --_MHD_EXTERN int --MHD_websocket_free (struct MHD_WebSocketStream *ws, -- void *buf) --{ -- if (NULL == ws) -- { -- return MHD_WEBSOCKET_STATUS_PARAMETER_ERROR; -- } -- -- ws->free (buf); -- -- return MHD_WEBSOCKET_STATUS_OK; --} -- -- --/** -- * Converts a 16 bit value into network byte order (MSB first) -- * in dependence of the host system -- */ --static uint16_t --MHD_htons (uint16_t value) --{ -- uint16_t endian = 0x0001; -- -- if (((char *) &endian)[0] == 0x01) -- { -- /* least significant byte first */ -- ((char *) &endian)[0] = ((char *) &value)[1]; -- ((char *) &endian)[1] = ((char *) &value)[0]; -- return endian; -- } -- else -- { -- /* most significant byte first */ -- return value; -- } --} -- -- --/** -- * Converts a 64 bit value into network byte order (MSB first) -- * in dependence of the host system -- */ --static uint64_t --MHD_htonll (uint64_t value) --{ -- uint64_t endian = 0x0000000000000001; -- -- if (((char *) &endian)[0] == 0x01) -- { -- /* least significant byte first */ -- ((char *) &endian)[0] = ((char *) &value)[7]; -- ((char *) &endian)[1] = ((char *) &value)[6]; -- ((char *) &endian)[2] = ((char *) &value)[5]; -- ((char *) &endian)[3] = ((char *) &value)[4]; -- ((char *) &endian)[4] = ((char *) &value)[3]; -- ((char *) &endian)[5] = ((char *) &value)[2]; -- ((char *) &endian)[6] = ((char *) &value)[1]; -- ((char *) &endian)[7] = ((char *) &value)[0]; -- return endian; -- } -- else -- { -- /* most significant byte first */ -- return value; -- } --} -diff --git a/src/microhttpd_ws/sha1.c b/src/microhttpd_ws/sha1.c -deleted file mode 100644 -index 1e9da5c..0000000 ---- a/src/microhttpd_ws/sha1.c -+++ /dev/null -@@ -1,378 +0,0 @@ --/* -- This file is part of libmicrohttpd -- Copyright (C) 2019-2021 Karlson2k (Evgeny Grin) -- -- libmicrohttpd 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, see . --*/ -- --/** -- * @file microhttpd/sha1.c -- * @brief Calculation of SHA-1 digest as defined in FIPS PUB 180-4 (2015) -- * @author Karlson2k (Evgeny Grin) -- */ -- --#include "sha1.h" -- --#include --#ifdef HAVE_MEMORY_H --#include --#endif /* HAVE_MEMORY_H */ --#include "mhd_bithelpers.h" --#include "mhd_assert.h" -- --/** -- * Initialise structure for SHA-1 calculation. -- * -- * @param ctx_ must be a `struct sha1_ctx *` -- */ --void --MHD_SHA1_init (void *ctx_) --{ -- struct sha1_ctx *const ctx = ctx_; -- /* Initial hash values, see FIPS PUB 180-4 paragraph 5.3.1 */ -- /* Just some "magic" numbers defined by standard */ -- ctx->H[0] = UINT32_C (0x67452301); -- ctx->H[1] = UINT32_C (0xefcdab89); -- ctx->H[2] = UINT32_C (0x98badcfe); -- ctx->H[3] = UINT32_C (0x10325476); -- ctx->H[4] = UINT32_C (0xc3d2e1f0); -- -- /* Initialise number of bytes. */ -- ctx->count = 0; --} -- -- --/** -- * Base of SHA-1 transformation. -- * Gets full 512 bits / 64 bytes block of data and updates hash values; -- * @param H hash values -- * @param data data, must be exactly 64 bytes long -- */ --static void --sha1_transform (uint32_t H[_SHA1_DIGEST_LENGTH], -- const uint8_t data[SHA1_BLOCK_SIZE]) --{ -- /* Working variables, -- see FIPS PUB 180-4 paragraph 6.1.3 */ -- uint32_t a = H[0]; -- uint32_t b = H[1]; -- uint32_t c = H[2]; -- uint32_t d = H[3]; -- uint32_t e = H[4]; -- -- /* Data buffer, used as cyclic buffer. -- See FIPS PUB 180-4 paragraphs 5.2.1, 6.1.3 */ -- uint32_t W[16]; -- -- /* 'Ch' and 'Maj' macro functions are defined with -- widely-used optimization. -- See FIPS PUB 180-4 formulae 4.1. */ --#define Ch(x,y,z) ( (z) ^ ((x) & ((y) ^ (z))) ) --#define Maj(x,y,z) ( ((x) & (y)) ^ ((z) & ((x) ^ (y))) ) -- /* Unoptimized (original) versions: */ --/* #define Ch(x,y,z) ( ( (x) & (y) ) ^ ( ~(x) & (z) ) ) */ --/* #define Maj(x,y,z) ( ((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)) ) */ --#define Par(x,y,z) ( (x) ^ (y) ^ (z) ) -- -- /* Single step of SHA-1 computation, -- see FIPS PUB 180-4 paragraph 6.1.3 step 3. -- * Note: instead of reassigning all working variables on each step, -- variables are rotated for each step: -- SHA1STEP32 (a, b, c, d, e, func, K00, W[0]); -- SHA1STEP32 (e, a, b, c, d, func, K00, W[1]); -- so current 'vC' will be used as 'vD' on the next step, -- current 'vE' will be used as 'vA' on the next step. -- * Note: 'wt' must be used exactly one time in this macro as it change other data as well -- every time when used. */ -- --#define SHA1STEP32(vA,vB,vC,vD,vE,ft,kt,wt) do { \ -- (vE) += _MHD_ROTL32 ((vA), 5) + ft ((vB), (vC), (vD)) + (kt) + (wt); \ -- (vB) = _MHD_ROTL32 ((vB), 30); } while (0) -- -- /* Get value of W(t) from input data buffer, -- See FIPS PUB 180-4 paragraph 6.1.3. -- Input data must be read in big-endian bytes order, -- see FIPS PUB 180-4 paragraph 3.1.2. */ --#define GET_W_FROM_DATA(buf,t) \ -- _MHD_GET_32BIT_BE (((const uint8_t*) (buf)) + (t) * SHA1_BYTES_IN_WORD) -- --#ifndef _MHD_GET_32BIT_BE_UNALIGNED -- if (0 != (((uintptr_t) data) % _MHD_UINT32_ALIGN)) -- { -- /* Copy the unaligned input data to the aligned buffer */ -- memcpy (W, data, SHA1_BLOCK_SIZE); -- /* The W[] buffer itself will be used as the source of the data, -- * but data will be reloaded in correct bytes order during -- * the next steps */ -- data = (uint8_t *) W; -- } --#endif /* _MHD_GET_32BIT_BE_UNALIGNED */ -- --/* SHA-1 values of Kt for t=0..19, see FIPS PUB 180-4 paragraph 4.2.1. */ --#define K00 UINT32_C(0x5a827999) --/* SHA-1 values of Kt for t=20..39, see FIPS PUB 180-4 paragraph 4.2.1.*/ --#define K20 UINT32_C(0x6ed9eba1) --/* SHA-1 values of Kt for t=40..59, see FIPS PUB 180-4 paragraph 4.2.1.*/ --#define K40 UINT32_C(0x8f1bbcdc) --/* SHA-1 values of Kt for t=60..79, see FIPS PUB 180-4 paragraph 4.2.1.*/ --#define K60 UINT32_C(0xca62c1d6) -- -- /* During first 16 steps, before making any calculations on each step, -- the W element is read from input data buffer as big-endian value and -- stored in array of W elements. */ -- /* Note: instead of using K constants as array, all K values are specified -- individually for each step. */ -- SHA1STEP32 (a, b, c, d, e, Ch, K00, W[0] = GET_W_FROM_DATA (data, 0)); -- SHA1STEP32 (e, a, b, c, d, Ch, K00, W[1] = GET_W_FROM_DATA (data, 1)); -- SHA1STEP32 (d, e, a, b, c, Ch, K00, W[2] = GET_W_FROM_DATA (data, 2)); -- SHA1STEP32 (c, d, e, a, b, Ch, K00, W[3] = GET_W_FROM_DATA (data, 3)); -- SHA1STEP32 (b, c, d, e, a, Ch, K00, W[4] = GET_W_FROM_DATA (data, 4)); -- SHA1STEP32 (a, b, c, d, e, Ch, K00, W[5] = GET_W_FROM_DATA (data, 5)); -- SHA1STEP32 (e, a, b, c, d, Ch, K00, W[6] = GET_W_FROM_DATA (data, 6)); -- SHA1STEP32 (d, e, a, b, c, Ch, K00, W[7] = GET_W_FROM_DATA (data, 7)); -- SHA1STEP32 (c, d, e, a, b, Ch, K00, W[8] = GET_W_FROM_DATA (data, 8)); -- SHA1STEP32 (b, c, d, e, a, Ch, K00, W[9] = GET_W_FROM_DATA (data, 9)); -- SHA1STEP32 (a, b, c, d, e, Ch, K00, W[10] = GET_W_FROM_DATA (data, 10)); -- SHA1STEP32 (e, a, b, c, d, Ch, K00, W[11] = GET_W_FROM_DATA (data, 11)); -- SHA1STEP32 (d, e, a, b, c, Ch, K00, W[12] = GET_W_FROM_DATA (data, 12)); -- SHA1STEP32 (c, d, e, a, b, Ch, K00, W[13] = GET_W_FROM_DATA (data, 13)); -- SHA1STEP32 (b, c, d, e, a, Ch, K00, W[14] = GET_W_FROM_DATA (data, 14)); -- SHA1STEP32 (a, b, c, d, e, Ch, K00, W[15] = GET_W_FROM_DATA (data, 15)); -- -- /* 'W' generation and assignment for 16 <= t <= 79. -- See FIPS PUB 180-4 paragraph 6.1.3. -- As only last 16 'W' are used in calculations, it is possible to -- use 16 elements array of W as cyclic buffer. */ --#define Wgen(w,t) _MHD_ROTL32((w)[(t + 13) & 0xf] ^ (w)[(t + 8) & 0xf] \ -- ^ (w)[(t + 2) & 0xf] ^ (w)[t & 0xf], 1) -- -- /* During last 60 steps, before making any calculations on each step, -- W element is generated from W elements of cyclic buffer and generated value -- stored back in cyclic buffer. */ -- /* Note: instead of using K constants as array, all K values are specified -- individually for each step, see FIPS PUB 180-4 paragraph 4.2.1. */ -- SHA1STEP32 (e, a, b, c, d, Ch, K00, W[16 & 0xf] = Wgen (W, 16)); -- SHA1STEP32 (d, e, a, b, c, Ch, K00, W[17 & 0xf] = Wgen (W, 17)); -- SHA1STEP32 (c, d, e, a, b, Ch, K00, W[18 & 0xf] = Wgen (W, 18)); -- SHA1STEP32 (b, c, d, e, a, Ch, K00, W[19 & 0xf] = Wgen (W, 19)); -- SHA1STEP32 (a, b, c, d, e, Par, K20, W[20 & 0xf] = Wgen (W, 20)); -- SHA1STEP32 (e, a, b, c, d, Par, K20, W[21 & 0xf] = Wgen (W, 21)); -- SHA1STEP32 (d, e, a, b, c, Par, K20, W[22 & 0xf] = Wgen (W, 22)); -- SHA1STEP32 (c, d, e, a, b, Par, K20, W[23 & 0xf] = Wgen (W, 23)); -- SHA1STEP32 (b, c, d, e, a, Par, K20, W[24 & 0xf] = Wgen (W, 24)); -- SHA1STEP32 (a, b, c, d, e, Par, K20, W[25 & 0xf] = Wgen (W, 25)); -- SHA1STEP32 (e, a, b, c, d, Par, K20, W[26 & 0xf] = Wgen (W, 26)); -- SHA1STEP32 (d, e, a, b, c, Par, K20, W[27 & 0xf] = Wgen (W, 27)); -- SHA1STEP32 (c, d, e, a, b, Par, K20, W[28 & 0xf] = Wgen (W, 28)); -- SHA1STEP32 (b, c, d, e, a, Par, K20, W[29 & 0xf] = Wgen (W, 29)); -- SHA1STEP32 (a, b, c, d, e, Par, K20, W[30 & 0xf] = Wgen (W, 30)); -- SHA1STEP32 (e, a, b, c, d, Par, K20, W[31 & 0xf] = Wgen (W, 31)); -- SHA1STEP32 (d, e, a, b, c, Par, K20, W[32 & 0xf] = Wgen (W, 32)); -- SHA1STEP32 (c, d, e, a, b, Par, K20, W[33 & 0xf] = Wgen (W, 33)); -- SHA1STEP32 (b, c, d, e, a, Par, K20, W[34 & 0xf] = Wgen (W, 34)); -- SHA1STEP32 (a, b, c, d, e, Par, K20, W[35 & 0xf] = Wgen (W, 35)); -- SHA1STEP32 (e, a, b, c, d, Par, K20, W[36 & 0xf] = Wgen (W, 36)); -- SHA1STEP32 (d, e, a, b, c, Par, K20, W[37 & 0xf] = Wgen (W, 37)); -- SHA1STEP32 (c, d, e, a, b, Par, K20, W[38 & 0xf] = Wgen (W, 38)); -- SHA1STEP32 (b, c, d, e, a, Par, K20, W[39 & 0xf] = Wgen (W, 39)); -- SHA1STEP32 (a, b, c, d, e, Maj, K40, W[40 & 0xf] = Wgen (W, 40)); -- SHA1STEP32 (e, a, b, c, d, Maj, K40, W[41 & 0xf] = Wgen (W, 41)); -- SHA1STEP32 (d, e, a, b, c, Maj, K40, W[42 & 0xf] = Wgen (W, 42)); -- SHA1STEP32 (c, d, e, a, b, Maj, K40, W[43 & 0xf] = Wgen (W, 43)); -- SHA1STEP32 (b, c, d, e, a, Maj, K40, W[44 & 0xf] = Wgen (W, 44)); -- SHA1STEP32 (a, b, c, d, e, Maj, K40, W[45 & 0xf] = Wgen (W, 45)); -- SHA1STEP32 (e, a, b, c, d, Maj, K40, W[46 & 0xf] = Wgen (W, 46)); -- SHA1STEP32 (d, e, a, b, c, Maj, K40, W[47 & 0xf] = Wgen (W, 47)); -- SHA1STEP32 (c, d, e, a, b, Maj, K40, W[48 & 0xf] = Wgen (W, 48)); -- SHA1STEP32 (b, c, d, e, a, Maj, K40, W[49 & 0xf] = Wgen (W, 49)); -- SHA1STEP32 (a, b, c, d, e, Maj, K40, W[50 & 0xf] = Wgen (W, 50)); -- SHA1STEP32 (e, a, b, c, d, Maj, K40, W[51 & 0xf] = Wgen (W, 51)); -- SHA1STEP32 (d, e, a, b, c, Maj, K40, W[52 & 0xf] = Wgen (W, 52)); -- SHA1STEP32 (c, d, e, a, b, Maj, K40, W[53 & 0xf] = Wgen (W, 53)); -- SHA1STEP32 (b, c, d, e, a, Maj, K40, W[54 & 0xf] = Wgen (W, 54)); -- SHA1STEP32 (a, b, c, d, e, Maj, K40, W[55 & 0xf] = Wgen (W, 55)); -- SHA1STEP32 (e, a, b, c, d, Maj, K40, W[56 & 0xf] = Wgen (W, 56)); -- SHA1STEP32 (d, e, a, b, c, Maj, K40, W[57 & 0xf] = Wgen (W, 57)); -- SHA1STEP32 (c, d, e, a, b, Maj, K40, W[58 & 0xf] = Wgen (W, 58)); -- SHA1STEP32 (b, c, d, e, a, Maj, K40, W[59 & 0xf] = Wgen (W, 59)); -- SHA1STEP32 (a, b, c, d, e, Par, K60, W[60 & 0xf] = Wgen (W, 60)); -- SHA1STEP32 (e, a, b, c, d, Par, K60, W[61 & 0xf] = Wgen (W, 61)); -- SHA1STEP32 (d, e, a, b, c, Par, K60, W[62 & 0xf] = Wgen (W, 62)); -- SHA1STEP32 (c, d, e, a, b, Par, K60, W[63 & 0xf] = Wgen (W, 63)); -- SHA1STEP32 (b, c, d, e, a, Par, K60, W[64 & 0xf] = Wgen (W, 64)); -- SHA1STEP32 (a, b, c, d, e, Par, K60, W[65 & 0xf] = Wgen (W, 65)); -- SHA1STEP32 (e, a, b, c, d, Par, K60, W[66 & 0xf] = Wgen (W, 66)); -- SHA1STEP32 (d, e, a, b, c, Par, K60, W[67 & 0xf] = Wgen (W, 67)); -- SHA1STEP32 (c, d, e, a, b, Par, K60, W[68 & 0xf] = Wgen (W, 68)); -- SHA1STEP32 (b, c, d, e, a, Par, K60, W[69 & 0xf] = Wgen (W, 69)); -- SHA1STEP32 (a, b, c, d, e, Par, K60, W[70 & 0xf] = Wgen (W, 70)); -- SHA1STEP32 (e, a, b, c, d, Par, K60, W[71 & 0xf] = Wgen (W, 71)); -- SHA1STEP32 (d, e, a, b, c, Par, K60, W[72 & 0xf] = Wgen (W, 72)); -- SHA1STEP32 (c, d, e, a, b, Par, K60, W[73 & 0xf] = Wgen (W, 73)); -- SHA1STEP32 (b, c, d, e, a, Par, K60, W[74 & 0xf] = Wgen (W, 74)); -- SHA1STEP32 (a, b, c, d, e, Par, K60, W[75 & 0xf] = Wgen (W, 75)); -- SHA1STEP32 (e, a, b, c, d, Par, K60, W[76 & 0xf] = Wgen (W, 76)); -- SHA1STEP32 (d, e, a, b, c, Par, K60, W[77 & 0xf] = Wgen (W, 77)); -- SHA1STEP32 (c, d, e, a, b, Par, K60, W[78 & 0xf] = Wgen (W, 78)); -- SHA1STEP32 (b, c, d, e, a, Par, K60, W[79 & 0xf] = Wgen (W, 79)); -- -- /* Compute intermediate hash. -- See FIPS PUB 180-4 paragraph 6.1.3 step 4. */ -- H[0] += a; -- H[1] += b; -- H[2] += c; -- H[3] += d; -- H[4] += e; --} -- -- --/** -- * Process portion of bytes. -- * -- * @param ctx_ must be a `struct sha1_ctx *` -- * @param data bytes to add to hash -- * @param length number of bytes in @a data -- */ --void --MHD_SHA1_update (void *ctx_, -- const uint8_t *data, -- size_t length) --{ -- struct sha1_ctx *const ctx = ctx_; -- unsigned bytes_have; /**< Number of bytes in buffer */ -- -- mhd_assert ((data != NULL) || (length == 0)); -- -- if (0 == length) -- return; /* Do nothing */ -- -- /* Note: (count & (SHA1_BLOCK_SIZE-1)) -- equal (count % SHA1_BLOCK_SIZE) for this block size. */ -- bytes_have = (unsigned) (ctx->count & (SHA1_BLOCK_SIZE - 1)); -- ctx->count += length; -- -- if (0 != bytes_have) -- { -- unsigned bytes_left = SHA1_BLOCK_SIZE - bytes_have; -- if (length >= bytes_left) -- { /* Combine new data with the data in the buffer and -- process the full block. */ -- memcpy (ctx->buffer + bytes_have, -- data, -- bytes_left); -- data += bytes_left; -- length -= bytes_left; -- sha1_transform (ctx->H, ctx->buffer); -- bytes_have = 0; -- } -- } -- -- while (SHA1_BLOCK_SIZE <= length) -- { /* Process any full blocks of new data directly, -- without copying to the buffer. */ -- sha1_transform (ctx->H, data); -- data += SHA1_BLOCK_SIZE; -- length -= SHA1_BLOCK_SIZE; -- } -- -- if (0 != length) -- { /* Copy incomplete block of new data (if any) -- to the buffer. */ -- memcpy (ctx->buffer + bytes_have, data, length); -- } --} -- -- --/** -- * Size of "length" padding addition in bytes. -- * See FIPS PUB 180-4 paragraph 5.1.1. -- */ --#define SHA1_SIZE_OF_LEN_ADD (64 / 8) -- --/** -- * Finalise SHA-1 calculation, return digest. -- * -- * @param ctx_ must be a `struct sha1_ctx *` -- * @param[out] digest set to the hash, must be #SHA1_DIGEST_SIZE bytes -- */ --void --MHD_SHA1_finish (void *ctx_, -- uint8_t digest[SHA1_DIGEST_SIZE]) --{ -- struct sha1_ctx *const ctx = ctx_; -- uint64_t num_bits; /**< Number of processed bits */ -- unsigned bytes_have; /**< Number of bytes in buffer */ -- -- num_bits = ctx->count << 3; -- /* Note: (count & (SHA1_BLOCK_SIZE-1)) -- equals (count % SHA1_BLOCK_SIZE) for this block size. */ -- bytes_have = (unsigned) (ctx->count & (SHA1_BLOCK_SIZE - 1)); -- -- /* Input data must be padded with bit "1" and with length of data in bits. -- See FIPS PUB 180-4 paragraph 5.1.1. */ -- /* Data is always processed in form of bytes (not by individual bits), -- therefore position of first padding bit in byte is always predefined (0x80). */ -- /* Buffer always have space at least for one byte (as full buffers are -- processed immediately). */ -- ctx->buffer[bytes_have++] = 0x80; -- -- if (SHA1_BLOCK_SIZE - bytes_have < SHA1_SIZE_OF_LEN_ADD) -- { /* No space in current block to put total length of message. -- Pad current block with zeros and process it. */ -- if (SHA1_BLOCK_SIZE > bytes_have) -- memset (ctx->buffer + bytes_have, 0, SHA1_BLOCK_SIZE - bytes_have); -- /* Process full block. */ -- sha1_transform (ctx->H, ctx->buffer); -- /* Start new block. */ -- bytes_have = 0; -- } -- -- /* Pad the rest of the buffer with zeros. */ -- memset (ctx->buffer + bytes_have, 0, -- SHA1_BLOCK_SIZE - SHA1_SIZE_OF_LEN_ADD - bytes_have); -- /* Put the number of bits in the processed message as a big-endian value. */ -- _MHD_PUT_64BIT_BE_SAFE (ctx->buffer + SHA1_BLOCK_SIZE - SHA1_SIZE_OF_LEN_ADD, -- num_bits); -- /* Process the full final block. */ -- sha1_transform (ctx->H, ctx->buffer); -- -- /* Put final hash/digest in BE mode */ --#ifndef _MHD_PUT_32BIT_BE_UNALIGNED -- if (0 != ((uintptr_t) digest) % _MHD_UINT32_ALIGN) -- { -- uint32_t alig_dgst[_SHA1_DIGEST_LENGTH]; -- _MHD_PUT_32BIT_BE (alig_dgst + 0, ctx->H[0]); -- _MHD_PUT_32BIT_BE (alig_dgst + 1, ctx->H[1]); -- _MHD_PUT_32BIT_BE (alig_dgst + 2, ctx->H[2]); -- _MHD_PUT_32BIT_BE (alig_dgst + 3, ctx->H[3]); -- _MHD_PUT_32BIT_BE (alig_dgst + 4, ctx->H[4]); -- /* Copy result to unaligned destination address */ -- memcpy (digest, alig_dgst, SHA1_DIGEST_SIZE); -- } -- else --#else /* _MHD_PUT_32BIT_BE_UNALIGNED */ -- if (1) --#endif /* _MHD_PUT_32BIT_BE_UNALIGNED */ -- { -- _MHD_PUT_32BIT_BE (digest + 0 * SHA1_BYTES_IN_WORD, ctx->H[0]); -- _MHD_PUT_32BIT_BE (digest + 1 * SHA1_BYTES_IN_WORD, ctx->H[1]); -- _MHD_PUT_32BIT_BE (digest + 2 * SHA1_BYTES_IN_WORD, ctx->H[2]); -- _MHD_PUT_32BIT_BE (digest + 3 * SHA1_BYTES_IN_WORD, ctx->H[3]); -- _MHD_PUT_32BIT_BE (digest + 4 * SHA1_BYTES_IN_WORD, ctx->H[4]); -- } -- -- /* Erase potentially sensitive data. */ -- memset (ctx, 0, sizeof(struct sha1_ctx)); --} -diff --git a/src/microhttpd_ws/sha1.h b/src/microhttpd_ws/sha1.h -deleted file mode 100644 -index 851a442..0000000 ---- a/src/microhttpd_ws/sha1.h -+++ /dev/null -@@ -1,110 +0,0 @@ --/* -- This file is part of libmicrohttpd -- Copyright (C) 2019-2021 Karlson2k (Evgeny Grin) -- -- 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, see . --*/ -- --/** -- * @file microhttpd/sha1.h -- * @brief Calculation of SHA-1 digest -- * @author Karlson2k (Evgeny Grin) -- */ -- --#ifndef MHD_SHA1_H --#define MHD_SHA1_H 1 -- --#include "mhd_options.h" --#include --#ifdef HAVE_STDDEF_H --#include /* for size_t */ --#endif /* HAVE_STDDEF_H */ -- --/** -- * SHA-1 digest is kept internally as 5 32-bit words. -- */ --#define _SHA1_DIGEST_LENGTH 5 -- --/** -- * Number of bits in single SHA-1 word -- */ --#define SHA1_WORD_SIZE_BITS 32 -- --/** -- * Number of bytes in single SHA-1 word -- */ --#define SHA1_BYTES_IN_WORD (SHA1_WORD_SIZE_BITS / 8) -- --/** -- * Size of SHA-1 digest in bytes -- */ --#define SHA1_DIGEST_SIZE (_SHA1_DIGEST_LENGTH * SHA1_BYTES_IN_WORD) -- --/** -- * Size of SHA-1 digest string in chars including termination NUL -- */ --#define SHA1_DIGEST_STRING_SIZE ((SHA1_DIGEST_SIZE) * 2 + 1) -- --/** -- * Size of single processing block in bits -- */ --#define SHA1_BLOCK_SIZE_BITS 512 -- --/** -- * Size of single processing block in bytes -- */ --#define SHA1_BLOCK_SIZE (SHA1_BLOCK_SIZE_BITS / 8) -- -- --struct sha1_ctx --{ -- uint32_t H[_SHA1_DIGEST_LENGTH]; /**< Intermediate hash value / digest at end of calculation */ -- uint8_t buffer[SHA1_BLOCK_SIZE]; /**< SHA256 input data buffer */ -- uint64_t count; /**< number of bytes, mod 2^64 */ --}; -- --/** -- * Initialise structure for SHA-1 calculation. -- * -- * @param ctx must be a `struct sha1_ctx *` -- */ --void --MHD_SHA1_init (void *ctx_); -- -- --/** -- * Process portion of bytes. -- * -- * @param ctx_ must be a `struct sha1_ctx *` -- * @param data bytes to add to hash -- * @param length number of bytes in @a data -- */ --void --MHD_SHA1_update (void *ctx_, -- const uint8_t *data, -- size_t length); -- -- --/** -- * Finalise SHA-1 calculation, return digest. -- * -- * @param ctx_ must be a `struct sha1_ctx *` -- * @param[out] digest set to the hash, must be #SHA1_DIGEST_SIZE bytes -- */ --void --MHD_SHA1_finish (void *ctx_, -- uint8_t digest[SHA1_DIGEST_SIZE]); -- --#endif /* MHD_SHA1_H */ -diff --git a/src/microhttpd_ws/test_websocket.c b/src/microhttpd_ws/test_websocket.c -deleted file mode 100644 -index b824b9c..0000000 ---- a/src/microhttpd_ws/test_websocket.c -+++ /dev/null -@@ -1,10105 +0,0 @@ --/* -- This file is part of libmicrohttpd -- Copyright (C) 2021 David Gausmann -- -- libmicrohttpd is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published -- by the Free Software Foundation; either version 3, or (at your -- option) any later version. -- -- libmicrohttpd 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 -- General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with libmicrohttpd; see the file COPYING. If not, write to the -- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -- Boston, MA 02110-1301, USA. --*/ --/** -- * @file test_websocket.c -- * @brief Testcase for WebSocket decoding/encoding -- * @author David Gausmann -- */ --#include "microhttpd.h" --#include "microhttpd_ws.h" --#include --#include --#include --#include --#include -- --#if SIZE_MAX >= 0x100000000 -- #define ENABLE_64BIT_TESTS 1 --#endif -- --int disable_alloc = 0; --size_t open_allocs = 0; -- --/** -- * Custom `malloc()` function used for memory tests -- */ --static void * --test_malloc (size_t buf_len) --{ -- if (0 != disable_alloc) -- return NULL; -- void *result = malloc (buf_len); -- if (NULL != result) -- ++open_allocs; -- return result; --} -- -- --/** -- * Custom `realloc()` function used for memory tests -- */ --static void * --test_realloc (void *buf, size_t buf_len) --{ -- if (0 != disable_alloc) -- return NULL; -- void *result = realloc (buf, buf_len); -- if ((NULL != result) && (NULL == buf)) -- ++open_allocs; -- return result; --} -- -- --/** -- * Custom `free()` function used for memory tests -- */ --static void --test_free (void *buf) --{ -- if (NULL != buf) -- --open_allocs; -- free (buf); --} -- -- --/** -- * Custom `rng()` function used for client mode tests -- */ --static size_t --test_rng (void *cls, void *buf, size_t buf_len) --{ -- for (size_t i = 0; i < buf_len; ++i) -- { -- ((char *) buf) [i] = (char) (rand () % 0xFF); -- } -- -- return buf_len; --} -- -- --/** -- * Helper function which allocates a big amount of data -- */ --static void --allocate_length_test_data (char **buf1, -- char **buf2, -- size_t buf_len, -- const char *buf1_prefix, -- size_t buf1_prefix_len) --{ -- if (NULL != *buf1) -- free (*buf1); -- if (NULL != *buf2) -- free (*buf2); -- *buf1 = (char *) malloc (buf_len + buf1_prefix_len); -- *buf2 = (char *) malloc (buf_len); -- if ((NULL == buf1) || (NULL == buf2)) -- return; -- memcpy (*buf1, -- buf1_prefix, -- buf1_prefix_len); -- for (size_t i = 0; i < buf_len; i += 64) -- { -- size_t bytes_to_copy = buf_len - i; -- if (64 < bytes_to_copy) -- bytes_to_copy = 64; -- memcpy (*buf1 + i + buf1_prefix_len, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-", -- bytes_to_copy); -- memcpy (*buf2 + i, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-", -- bytes_to_copy); -- } --} -- -- --/** -- * Helper function which performs a single decoder test -- */ --static int --test_decode_single (unsigned int test_line, -- int flags, size_t max_payload_size, size_t decode_count, -- size_t buf_step, -- const char *buf, size_t buf_len, -- const char *expected_payload, size_t expected_payload_len, -- int expected_return, int expected_valid, size_t -- expected_streambuf_read_len) --{ -- struct MHD_WebSocketStream *ws = NULL; -- int ret = MHD_WEBSOCKET_STATUS_OK; -- -- /* initialize stream */ -- ret = MHD_websocket_stream_init2 (&ws, -- flags, -- max_payload_size, -- malloc, -- realloc, -- free, -- NULL, -- test_rng); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "Allocation failed for decode test in line %u.\n", -- (unsigned int) test_line); -- return 1; -- } -- -- /* perform decoding in a loop */ -- size_t streambuf_read_len = 0; -- size_t payload_len = 0; -- char *payload = NULL; -- for (size_t i = 0; i < decode_count; ++i) -- { -- size_t streambuf_read_len_ = 0; -- size_t bytes_to_take = buf_len - streambuf_read_len; -- if ((0 != buf_step) && (buf_step < bytes_to_take)) -- bytes_to_take = buf_step; -- ret = MHD_websocket_decode (ws, buf + streambuf_read_len, bytes_to_take, -- &streambuf_read_len_, &payload, &payload_len); -- streambuf_read_len += streambuf_read_len_; -- if (i + 1 < decode_count) -- { -- if (payload) -- { -- MHD_websocket_free (ws, payload); -- payload = NULL; -- payload_len = 0; -- } -- } -- } -- -- /* check the (last) result */ -- if (ret != expected_return) -- { -- fprintf (stderr, -- "Decode test failed in line %u: The return value should be %d, but is %d\n", -- (unsigned int) test_line, -- (int) expected_return, -- (int) ret); -- MHD_websocket_free (ws, payload); -- MHD_websocket_stream_free (ws); -- return 1; -- } -- if (payload_len != expected_payload_len) -- { -- fprintf (stderr, -- "Decode test failed in line %u: The payload_len should be %u, but is %u\n", -- (unsigned int) test_line, -- (unsigned int) expected_payload_len, -- (unsigned int) payload_len); -- MHD_websocket_free (ws, payload); -- MHD_websocket_stream_free (ws); -- return 1; -- } -- if (0 != payload_len) -- { -- if (NULL == payload) -- { -- fprintf (stderr, -- "Decode test failed in line %u: The payload is NULL\n", -- (unsigned int) test_line); -- MHD_websocket_free (ws, payload); -- MHD_websocket_stream_free (ws); -- return 1; -- } -- else if (NULL == expected_payload) -- { -- fprintf (stderr, -- "Decode test failed in line %u: The expected_payload is NULL (wrong test declaration)\n", -- (unsigned int) test_line); -- MHD_websocket_free (ws, payload); -- MHD_websocket_stream_free (ws); -- return 1; -- } -- else if (0 != memcmp (payload, expected_payload, payload_len)) -- { -- fprintf (stderr, -- "Decode test failed in line %u: The payload differs from the expected_payload\n", -- (unsigned int) test_line); -- MHD_websocket_free (ws, payload); -- MHD_websocket_stream_free (ws); -- return 1; -- } -- } -- else -- { -- if (NULL != payload) -- { -- fprintf (stderr, -- "Decode test failed in line %u: The payload is not NULL, but payload_len is 0\n", -- (unsigned int) test_line); -- MHD_websocket_free (ws, payload); -- MHD_websocket_stream_free (ws); -- return 1; -- } -- else if (NULL != expected_payload) -- { -- fprintf (stderr, -- "Decode test failed in line %u: The expected_payload is not NULL, but expected_payload_len is 0 (wrong test declaration)\n", -- (unsigned int) test_line); -- MHD_websocket_free (ws, payload); -- MHD_websocket_stream_free (ws); -- return 1; -- } -- } -- if (streambuf_read_len != expected_streambuf_read_len) -- { -- fprintf (stderr, -- "Decode test failed in line %u: The streambuf_read_len should be %u, but is %u\n", -- (unsigned int) test_line, -- (unsigned int) expected_streambuf_read_len, -- (unsigned int) streambuf_read_len); -- MHD_websocket_free (ws, payload); -- MHD_websocket_stream_free (ws); -- return 1; -- } -- ret = MHD_websocket_stream_is_valid (ws); -- if (ret != expected_valid) -- { -- fprintf (stderr, -- "Decode test failed in line %u: The stream validity should be %u, but is %u\n", -- (unsigned int) test_line, -- (int) expected_valid, -- (int) ret); -- MHD_websocket_free (ws, payload); -- MHD_websocket_stream_free (ws); -- return 1; -- } -- -- /* cleanup */ -- MHD_websocket_free (ws, payload); -- MHD_websocket_stream_free (ws); -- -- return 0; --} -- -- --/** -- * Test procedure for `MHD_websocket_stream_init()` and -- * `MHD_websocket_stream_init2()` -- */ --int --test_inits () --{ -- int failed = 0; -- struct MHD_WebSocketStream *ws; -- int ret; -- -- /* -- ------------------------------------------------------------------------------ -- All valid flags -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: all valid flags for init (only the even ones work) */ -- for (int i = 0; i < 7; ++i) -- { -- ws = NULL; -- ret = MHD_websocket_stream_init (&ws, -- i, -- 0); -- if (((0 == (i & MHD_WEBSOCKET_FLAG_CLIENT)) && -- ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws))) || -- ((0 != (i & MHD_WEBSOCKET_FLAG_CLIENT)) && -- ((MHD_WEBSOCKET_STATUS_OK == ret) || -- (NULL != ws)))) -- { -- fprintf (stderr, -- "Init test failed in line %u for flags %d.\n", -- (unsigned int) __LINE__, -- (int) i); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- } -- /* Regular test: all valid flags for init2 */ -- for (int i = 0; i < 7; ++i) -- { -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- i, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- test_rng); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for flags %d.\n", -- (unsigned int) __LINE__, -- (int) i); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- } -- /* Fail test: Invalid flags for init */ -- for (int i = 4; i < 32; ++i) -- { -- int flags = 1 << i; -- ws = NULL; -- ret = MHD_websocket_stream_init (&ws, -- flags, -- 0); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for invalid flags %d.\n", -- (unsigned int) __LINE__, -- (int) flags); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- } -- /* Fail test: Invalid flag for init2 */ -- for (int i = 4; i < 32; ++i) -- { -- int flags = 1 << i; -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- flags, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for invalid flags %d.\n", -- (unsigned int) __LINE__, -- (int) flags); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- } -- -- /* -- ------------------------------------------------------------------------------ -- max_payload_size -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: max_payload_size = 0 for init */ -- ws = NULL; -- ret = MHD_websocket_stream_init (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for max_payload_size 0.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Regular test: max_payload_size = 0 for init2 */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for max_payload_size 0.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Edge test (success): max_payload_size = 1 for init */ -- ws = NULL; -- ret = MHD_websocket_stream_init (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 1); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for max_payload_size 1.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Edge test (success): max_payload_size = 1 for init2 */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 1, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for max_payload_size 1.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Regular test: max_payload_size = 1000 for init */ -- ws = NULL; -- ret = MHD_websocket_stream_init (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 1000); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for max_payload_size 1000.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Regular test: max_payload_size = 1000 for init2 */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 1000, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for max_payload_size 1000.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } --#ifdef ENABLE_64BIT_TESTS -- /* Edge test (success): max_payload_size = 0x7FFFFFFFFFFFFFFF for init */ -- ws = NULL; -- ret = MHD_websocket_stream_init (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- (uint64_t) 0x7FFFFFFFFFFFFFFF); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for max_payload_size 0x7FFFFFFFFFFFFFFF.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Edge test (success): max_payload_size = 0x7FFFFFFFFFFFFFFF for init2 */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- (uint64_t) 0x7FFFFFFFFFFFFFFF, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for max_payload_size 0x7FFFFFFFFFFFFFFF.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Edge test (fail): max_payload_size = 0x8000000000000000 for init */ -- ws = NULL; -- ret = MHD_websocket_stream_init (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- (uint64_t) 0x8000000000000000); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for max_payload_size 0x8000000000000000.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Edge test (fail): max_payload_size = 0x8000000000000000 for init2 */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- (uint64_t) 0x8000000000000000, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u for max_payload_size 0x8000000000000000.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } --#endif -- -- /* -- ------------------------------------------------------------------------------ -- Missing parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: websocket stream variable missing for init */ -- ws = NULL; -- ret = MHD_websocket_stream_init (NULL, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Fail test: websocket stream variable missing for init2 */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (NULL, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Fail test: malloc missing for init2 */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- NULL, -- test_realloc, -- test_free, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Fail test: realloc missing for init2 */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- NULL, -- test_free, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Fail test: free missing for init2 */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- NULL, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Regular test: rng given for server mode (will be ignored) */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- test_rng); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Regular test: cls_rng given for server mode (will be ignored) */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- (void *) 12345, -- test_rng); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Regular test: rng given for client mode */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- test_rng); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL == ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- /* Fail test: rng not given for client mode */ -- ws = NULL; -- ret = MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != ws) ) -- { -- fprintf (stderr, -- "Init test failed in line %u %u.\n", -- (unsigned int) __LINE__, ret); -- ++failed; -- } -- if (NULL != ws) -- { -- MHD_websocket_stream_free (ws); -- ws = NULL; -- } -- -- return failed != 0 ? 0x01 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_create_accept_header()` -- */ --int --test_accept () --{ -- int failed = 0; -- char accept_key[29]; -- int ret; -- -- /* -- ------------------------------------------------------------------------------ -- accepting -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Test case from RFC6455 4.2.2 */ -- memset (accept_key, 0, 29); -- ret = MHD_websocket_create_accept_header ("dGhlIHNhbXBsZSBub25jZQ==", -- accept_key); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (0 != memcmp (accept_key, "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", 29))) -- { -- fprintf (stderr, -- "Accept test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Missing parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: missing sec-key value */ -- memset (accept_key, 0, 29); -- ret = MHD_websocket_create_accept_header (NULL, -- accept_key); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "Accept test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: missing accept variable */ -- memset (accept_key, 0, 29); -- ret = MHD_websocket_create_accept_header ("dGhlIHNhbXBsZSBub25jZQ==", -- NULL); -- if (MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) -- { -- fprintf (stderr, -- "Accept test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- return failed != 0 ? 0x02 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_decode()` -- */ --int --test_decodes () --{ -- int failed = 0; -- char *buf1 = NULL, *buf2 = NULL; -- -- /* -- ------------------------------------------------------------------------------ -- text frame -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Masked text frame from RFC 6455, must succeed for server */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x85\x37\xfa\x21\x3d\x7f\x9f\x4d\x51\x58", -- 11, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Regular test: Unmasked text frame from RFC 6455, must succeed for client */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x05\x48\x65\x6c\x6c\x6f", -- 7, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 7); -- /* Fail test: Unmasked text frame from RFC 6455, must fail for server */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x05\x48\x65\x6c\x6c\x6f", -- 7, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Fail test: Masked text frame from RFC 6455, must fail for client */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x85\x37\xfa\x21\x3d\x7f\x9f\x4d\x51\x58", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Regular test: Text frame with UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x90\x00\x00\x00\x00" "This is my n" -- "\xC3\xB6" "te", -- 22, -- "This is my n" "\xC3\xB6" "te", -- 16, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 22); -- /* Fail test: Text frame with with invalid UTF-8 */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8F\x00\x00\x00\x00" "This is my n" "\xFF" -- "te", -- 21, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 18); -- /* Fail test: Text frame with broken UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8F\x00\x00\x00\x00" "This is my n" "\xC3" -- "te", -- 21, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 19); -- /* Regular test: Text frame without payload and mask (caller = server) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x80\x01\x02\x03\x04", -- 6, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 6); -- /* Fail test: Text frame without payload and no mask (caller = server) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x00", -- 2, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Regular test: Text frame without payload and mask (caller = client) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x00", -- 2, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 2); -- /* Fail test: Text frame without payload and no mask (caller = client) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x80\x01\x02\x03\x04", -- 6, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- -- /* -- ------------------------------------------------------------------------------ -- binary frame -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Masked binary frame (decoder = server) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x82\x85\x37\xfa\x21\x3d\x7f\x9f\x4d\x51\x58", -- 11, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Regular test: Unmasked binary frame (decoder = client) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x82\x05\x48\x65\x6c\x6c\x6f", -- 7, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 7); -- /* Fail test: Unmasked binary frame (decoder = server) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x82\x05\x48\x65\x6c\x6c\x6f", -- 7, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Fail test: Masked binary frame (decoder = client) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x82\x85\x37\xfa\x21\x3d\x7f\x9f\x4d\x51\x58", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Regular test: Binary frame without payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x82\x80\x00\x00\x00\x00", -- 6, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 6); -- /* Regular test: Fragmented binary frame without payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x02\x80\x00\x00\x00\x00\x80\x80\x00\x00\x00\x00", -- 12, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 12); -- /* Regular test: Fragmented binary frame without payload, fragments to the caller, 1st call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x02\x80\x00\x00\x00\x00\x80\x80\x00\x00\x00\x00", -- 12, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_BINARY_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 6); -- /* Regular test: Fragmented binary frame without payload, fragments to the caller, 2nd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x02\x80\x00\x00\x00\x00\x80\x80\x00\x00\x00\x00", -- 12, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_BINARY_LAST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 12); -- /* Regular test: Fragmented binary frame with payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x02\x83\x00\x00\x00\x00\x01\x02\x03\x80\x83\x00\x00\x00\x00\x04\x05\x06", -- 18, -- "\x01\x02\x03\x04\x05\x06", -- 6, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 18); -- /* Regular test: Fragmented binary frame with payload, fragments to the caller, 1st call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x02\x83\x00\x00\x00\x00\x01\x02\x03\x80\x83\x00\x00\x00\x00\x04\x05\x06", -- 18, -- "\x01\x02\x03", -- 3, -- MHD_WEBSOCKET_STATUS_BINARY_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 9); -- /* Regular test: Fragmented binary frame without payload, fragments to the caller, 2nd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x02\x83\x00\x00\x00\x00\x01\x02\x03\x80\x83\x00\x00\x00\x00\x04\x05\x06", -- 18, -- "\x04\x05\x06", -- 3, -- MHD_WEBSOCKET_STATUS_BINARY_LAST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 18); -- /* Regular test: Fragmented binary frame with payload, fragments to the caller, 1st call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x02\x83\x00\x00\x00\x00\x01\x02\x03\x00\x83\x00\x00\x00\x00\x04\x05\x06\x00\x83\x00\x00\x00\x00\x07\x08\x09\x80\x83\x00\x00\x00\x00\x0A\x0B\x0C", -- 36, -- "\x01\x02\x03", -- 3, -- MHD_WEBSOCKET_STATUS_BINARY_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 9); -- /* Regular test: Fragmented binary frame without payload, fragments to the caller, 2nd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x02\x83\x00\x00\x00\x00\x01\x02\x03\x00\x83\x00\x00\x00\x00\x04\x05\x06\x00\x83\x00\x00\x00\x00\x07\x08\x09\x80\x83\x00\x00\x00\x00\x0A\x0B\x0C", -- 36, -- "\x04\x05\x06", -- 3, -- MHD_WEBSOCKET_STATUS_BINARY_NEXT_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 18); -- /* Regular test: Fragmented binary frame without payload, fragments to the caller, 3rd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 3, -- 0, -- "\x02\x83\x00\x00\x00\x00\x01\x02\x03\x00\x83\x00\x00\x00\x00\x04\x05\x06\x00\x83\x00\x00\x00\x00\x07\x08\x09\x80\x83\x00\x00\x00\x00\x0A\x0B\x0C", -- 36, -- "\x07\x08\x09", -- 3, -- MHD_WEBSOCKET_STATUS_BINARY_NEXT_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 27); -- /* Regular test: Fragmented binary frame without payload, fragments to the caller, 4th call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 4, -- 0, -- "\x02\x83\x00\x00\x00\x00\x01\x02\x03\x00\x83\x00\x00\x00\x00\x04\x05\x06\x00\x83\x00\x00\x00\x00\x07\x08\x09\x80\x83\x00\x00\x00\x00\x0A\x0B\x0C", -- 36, -- "\x0A\x0B\x0C", -- 3, -- MHD_WEBSOCKET_STATUS_BINARY_LAST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 36); -- /* Regular test: Binary frame with bytes which look like invalid UTF-8 character */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x82\x85\x00\x00\x00\x00" "Hell\xf6", -- 11, -- "Hell\xf6", -- 5, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Regular test: Binary frame with bytes which look like broken UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x82\x85\x00\x00\x00\x00" "H\xC3llo", -- 11, -- "H\xC3llo", -- 5, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Regular test: Binary frame with bytes which look like valid UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x82\x85\x00\x00\x00\x00" "H\xC3\xA4lo", -- 11, -- "H\xC3\xA4lo", -- 5, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Regular test: Fragmented binary frame with bytes which look like valid UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x02\x82\x00\x00\x00\x00" "H\xC3" -- "\x80\x83\x00\x00\x00\x00" "\xA4lo", -- 17, -- "H\xC3\xA4lo", -- 5, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- /* Regular test: Fragmented binary frame with bytes which look like valid UTF-8 sequence, -- fragments to the caller, 1st call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x02\x82\x00\x00\x00\x00" "H\xC3" -- "\x80\x83\x00\x00\x00\x00" "\xA4lo", -- 17, -- "H\xC3", -- 2, -- MHD_WEBSOCKET_STATUS_BINARY_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 8); -- /* Regular test: Fragmented binary frame with bytes which look like valid UTF-8 sequence, -- fragments to the caller, 2nd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x02\x82\x00\x00\x00\x00" "H\xC3" -- "\x80\x83\x00\x00\x00\x00" "\xA4lo", -- 17, -- "\xA4lo", -- 3, -- MHD_WEBSOCKET_STATUS_BINARY_LAST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- -- /* -- ------------------------------------------------------------------------------ -- close frame -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Close frame with no payload but with mask (decoder = server) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x80\x00\x00\x00\x00", -- 6, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 6); -- /* Regular test: Close frame with no payload (decoder = client) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x00", -- 2, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 2); -- /* Fail test: Close frame with no payload and no mask (decoder = server) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x00", -- 2, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Fail test: Close frame with no payload but with mask (decoder = client) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x80\x00\x00\x00\x00", -- 6, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Regular test: Close frame with 2 byte payload for close reason */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x82\x00\x00\x00\x00\x03\xEB", -- 8, -- "\x03\xEB", -- 2, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 8); -- /* Fail test: Close frame with 1 byte payload (no valid close reason) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x81\x00\x00\x00\x00\x03", -- 7, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Regular test: Close frame with close reason and UTF-8 description */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x95\x00\x00\x00\x00\x03\xEB" -- "Something was wrong", -- 27, -- "\x03\xEB" "Something was wrong", -- 21, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 27); -- /* Regular test: Close frame with close reason and UTF-8 description (with UTF-8 sequence) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x96\x00\x00\x00\x00\x03\xEB" -- "Something was wr" "\xC3\xB6" "ng", -- 28, -- "\x03\xEB" "Something was wr" "\xC3\xB6" "ng", -- 22, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 28); -- /* Fail test: Close frame with close reason and invalid UTF-8 in description */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x95\x00\x00\x00\x00\x03\xEB" -- "Something was wr" "\xFF" "ng", -- 27, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 24); -- /* Fail test: Close frame with close reason and broken UTF-8 sequence in description */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x95\x00\x00\x00\x00\x03\xEB" -- "Something was wr" "\xC3" "ng", -- 27, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 25); -- /* Edge test (success): Close frame with 125 bytes of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\xFD\x00\x00\x00\x00\x03\xEB" -- "Something was wrong, so I decided to close this websocket. I hope you are not angry. But this is also the 123 cap test. :-)", -- 131, -- "\x03\xEB" -- "Something was wrong, so I decided to close this websocket. I hope you are not angry. But this is also the 123 cap test. :-)", -- 125, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 131); -- /* Edge test (failure): Close frame with 126 bytes of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\xFE\x00\x7e\x00\x00\x00\x00\x03\xEB" -- "Something was wrong, so I decided to close this websocket. I hope you are not angry. But this is also the 123 cap test. >:-)", -- 134, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Fail test: Close frame with 500 bytes of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\xFE\x01\xf4\x00\x00\x00\x00\x03\xEB" -- "The payload of this test isn't parsed.", -- 49, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Edge test (failure): Close frame with 65535 bytes of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\xFE\xff\xff\x00\x00\x00\x00\x03\xEB" -- "The payload of this test isn't parsed.", -- 49, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Edge test (failure): Close frame with 65536 bytes of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\xFF\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03\xEB" -- "The payload of this test isn't parsed.", -- 54, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Fail test: Close frame with 1000000 bytes of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\xFF\x00\x00\x00\x00\x00\x0F\x42\x40\x00\x00\x00\x00\x03\xEB" -- "The payload of this test isn't parsed.", -- 54, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- -- /* -- ------------------------------------------------------------------------------ -- ping frame -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Ping frame with no payload but with mask (decoder = server) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\x80\x00\x00\x00\x00", -- 6, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 6); -- /* Regular test: Ping frame with no payload (decoder = client) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\x00", -- 2, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 2); -- /* Fail test: Ping frame with no payload and no mask (decoder = server) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\x00", -- 2, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Fail test: Ping frame with no payload but with mask (decoder = client) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\x80\x00\x00\x00\x00", -- 6, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Regular test: Ping frame with some (masked) payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\x88\x01\x20\x03\x40\xFF\xFF\xFF\xFF\x00\x00\x00\x00", -- 14, -- "\xFE\xDF\xFC\xBF\x01\x20\x03\x40", -- 8, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 14); -- /* Edge test (success): Ping frame with one byte of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\x81\x00\x00\x00\x00" "a", -- 7, -- "a", -- 1, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 7); -- /* Edge test (success): Ping frame with 125 bytes of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\xFD\x00\x00\x00\x00" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 131, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 125, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 131); -- /* Edge test (fail): Ping frame with 126 bytes of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\xFE\x00\x7E\x00\x00\x00\x00" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", -- 134, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Regular test: Ping frame with UTF-8 data */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\x90\x00\x00\x00\x00" "Ping is bin" -- "\xC3\xA4" "ry.", -- 22, -- "Ping is bin" "\xC3\xA4" "ry.", -- 16, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 22); -- /* Regular test: Ping frame with invalid UTF-8 data */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\x8F\x00\x00\x00\x00" "Ping is bin" "\xFF" -- "ry.", -- 21, -- "Ping is bin" "\xFF" "ry.", -- 15, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 21); -- /* Regular test: Ping frame with broken UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\x8F\x00\x00\x00\x00" "Ping is bin" "\xC3" -- "ry.", -- 21, -- "Ping is bin" "\xC3" "ry.", -- 15, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 21); -- -- /* -- ------------------------------------------------------------------------------ -- pong frame -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Pong frame with no payload but with mask (decoder = server) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\x80\x00\x00\x00\x00", -- 6, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 6); -- /* Regular test: Pong frame with no payload (decoder = client) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\x00", -- 2, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 2); -- /* Fail test: Pong frame with no payload and no mask (decoder = server) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\x00", -- 2, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Fail test: Pong frame with no payload but with mask (decoder = client) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_CLIENT -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\x80\x00\x00\x00\x00", -- 6, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Regular test: Pong frame with some (masked) payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\x88\x01\x20\x03\x40\xFF\xFF\xFF\xFF\x00\x00\x00\x00", -- 14, -- "\xFE\xDF\xFC\xBF\x01\x20\x03\x40", -- 8, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 14); -- /* Edge test (success): Pong frame with one byte of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\x81\x00\x00\x00\x00" "a", -- 7, -- "a", -- 1, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 7); -- /* Edge test (success): Pong frame with 125 bytes of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\xFD\x00\x00\x00\x00" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 131, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 125, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 131); -- /* Edge test (fail): Pong frame with 126 bytes of payload */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\xFE\x00\x7E\x00\x00\x00\x00" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", -- 134, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 1); -- /* Regular test: Pong frame with UTF-8 data */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\x90\x00\x00\x00\x00" "Pong is bin" -- "\xC3\xA4" "ry.", -- 22, -- "Pong is bin" "\xC3\xA4" "ry.", -- 16, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 22); -- /* Regular test: Pong frame with invalid UTF-8 data */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\x8F\x00\x00\x00\x00" "Pong is bin" "\xFF" -- "ry.", -- 21, -- "Pong is bin" "\xFF" "ry.", -- 15, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 21); -- /* Regular test: Pong frame with broken UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8A\x8F\x00\x00\x00\x00" "Pong is bin" "\xC3" -- "ry.", -- 21, -- "Pong is bin" "\xC3" "ry.", -- 15, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 21); -- -- /* -- ------------------------------------------------------------------------------ -- fragmentation -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Fragmented, masked text frame, we are the server and don't want fragments as caller */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x83\x37\xfa\x21\x3d\x7f\x9f\x4d\x80\x82\x3d\x37\xfa\x21\x51\x58", -- 17, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- /* Regular test: Fragmented, masked text frame, we are the server and don't want fragments as caller, but call decode two times */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x01\x83\x37\xfa\x21\x3d\x7f\x9f\x4d\x80\x82\x3d\x37\xfa\x21\x51\x58", -- 17, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_OK, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- /* Regular test: Fragmented, masked text frame, we are the server and want fragments, one call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x83\x37\xfa\x21\x3d\x7f\x9f\x4d\x80\x82\x3d\x37\xfa\x21\x51\x58", -- 17, -- "Hel", -- 3, -- MHD_WEBSOCKET_STATUS_TEXT_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 9); -- /* Regular test: Fragmented, masked text frame, we are the server and want fragments, second call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x01\x83\x37\xfa\x21\x3d\x7f\x9f\x4d\x80\x82\x3d\x37\xfa\x21\x51\x58", -- 17, -- "lo", -- 2, -- MHD_WEBSOCKET_STATUS_TEXT_LAST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- /* Regular test: Fragmented, masked text frame, we are the server and want fragments, third call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 3, -- 0, -- "\x01\x83\x37\xfa\x21\x3d\x7f\x9f\x4d\x80\x82\x3d\x37\xfa\x21\x51\x58", -- 17, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_OK, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- /* Regular test: Fragmented, masked text frame, we are the server and want fragments, 1st call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x83\x37\xfa\x21\x3d\x7f\x9f\x4d\x00\x81\x3d\x37\xfa\x21\x51\x80\x81\x37\x37\xfa\x21\x58", -- 23, -- "Hel", -- 3, -- MHD_WEBSOCKET_STATUS_TEXT_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 9); -- /* Regular test: Fragmented, masked text frame, we are the server and want fragments, 2nd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x01\x83\x37\xfa\x21\x3d\x7f\x9f\x4d\x00\x81\x3d\x37\xfa\x21\x51\x80\x81\x37\x37\xfa\x21\x58", -- 23, -- "l", -- 1, -- MHD_WEBSOCKET_STATUS_TEXT_NEXT_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Regular test: Fragmented, masked text frame, we are the server and want fragments, 3rd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 3, -- 0, -- "\x01\x83\x37\xfa\x21\x3d\x7f\x9f\x4d\x00\x81\x3d\x37\xfa\x21\x51\x80\x81\x37\x37\xfa\x21\x58", -- 23, -- "o", -- 1, -- MHD_WEBSOCKET_STATUS_TEXT_LAST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 23); -- -- -- /* -- ------------------------------------------------------------------------------ -- invalid flags -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Template with valid data for the next tests (this one must succeed) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x85\x00\x00\x00\x00Hello", -- 11, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Fail test: RSV1 flag set */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x91\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: RSV2 flag set */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\xA1\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: RSV3 flag set */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\xC1\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- -- /* -- ------------------------------------------------------------------------------ -- invalid opcodes -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: Invalid opcode 0 (0 is usually valid, but only if there was a data frame before) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x80\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Invalid opcode 3 */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x83\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Invalid opcode 4 */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x84\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Invalid opcode 5 */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x85\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Invalid opcode 6 */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x86\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Invalid opcode 7 */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x87\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Invalid opcode 0x0B */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8B\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Invalid opcode 0x0C */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8c\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Invalid opcode 0x0D */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8d\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Invalid opcode 0x0E */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8e\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Invalid opcode 0x0F */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x8f\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- -- -- /* -- ------------------------------------------------------------------------------ -- control frames without FIN flag -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: Close frame without FIN flag */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x08\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Ping frame without FIN flag */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x09\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Fail test: Pong frame without FIN flag */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x0a\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- -- /* -- ------------------------------------------------------------------------------ -- length checks (without max_payload_len) -- ------------------------------------------------------------------------------ -- */ -- /* Edge test (success): 0 bytes of payload (requires 1 byte length) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x80\x00\x00\x00\x00", -- 6, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 6); -- /* Edge test (success): 1 byte of payload (requires 1 byte length) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x81\x00\x00\x00\x00" "a", -- 7, -- "a", -- 1, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 7); -- /* Edge test (success): 125 bytes of payload (requires 1 byte length) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\xfd\x00\x00\x00\x00" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 131, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 125, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 131); -- /* Edge test (success): 126 bytes of payload (requires 2 byte length) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\xfe\x00\x7e\x00\x00\x00\x00" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", -- 134, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", -- 126, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 134); -- /* Edge test (success): 65535 bytes of payload (requires 2 byte length) */ -- allocate_length_test_data (&buf1, -- &buf2, -- 65535, -- "\x81\xfe\xff\xff\x00\x00\x00\x00", -- 8); -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- buf1, -- 65535 + 8, -- buf2, -- 65535, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 65535 + 8); -- /* Edge test (success): 65536 bytes of payload (requires 8 byte length) */ -- allocate_length_test_data (&buf1, -- &buf2, -- 65536, -- "\x81\xff\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", -- 14); -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- buf1, -- 65536 + 14, -- buf2, -- 65536, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 65536 + 14); -- /* Regular test: 1 MB of payload */ -- allocate_length_test_data (&buf1, -- &buf2, -- 1048576, -- "\x81\xff\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", -- 14); -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- buf1, -- 1048576 + 14, -- buf2, -- 1048576, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 1048576 + 14); -- /* Regular test: 100 MB of payload */ -- allocate_length_test_data (&buf1, -- &buf2, -- 104857600, -- "\x81\xff\x00\x00\x00\x00\x06\x40\x00\x00\x00\x00\x00\x00", -- 14); -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- buf1, -- 104857600 + 14, -- buf2, -- 104857600, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 104857600 + 14); -- if (NULL != buf1) -- { -- free (buf1); -- buf1 = NULL; -- } -- if (NULL != buf2) -- { -- free (buf2); -- buf2 = NULL; -- } --#ifdef ENABLE_64BIT_TESTS -- /* Edge test (success): Maximum allowed length (here is only the header checked) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\xff\x7f\xff\xff\xff\xff\xff\xff\xff", -- 10, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_OK, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 10); --#else -- /* Edge test (fail): Maximum allowed length -- (the size is allowed, but the system cannot handle this amount of memory) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\xff\x7f\xff\xff\xff\xff\xff\xff\xff", -- 10, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 10); --#endif -- /* Edge test (fail): Too big payload length */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\xff\x80\x00\x00\x00\x00\x00\x00\x00", -- 10, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 10); -- /* Edge test (fail): Too big payload length */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\xff\xff\xff\xff\xff\xff\xff\xff\xff", -- 10, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 10); -- /* Fail test: Not the smallest payload length syntax used (2 byte instead of 1 byte) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\xfe\x00\x05\x00\x00\x00\x00" "abcde", -- 13, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 4); -- /* Fail test: Not the smallest payload length syntax used (8 byte instead of 1 byte) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\xff\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00" -- "abcde", -- 13, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 10); -- /* Fail test: Not the smallest payload length syntax used (8 byte instead of 2 byte) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00" -- "abcde", -- 13, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 10); -- -- /* -- ------------------------------------------------------------------------------ -- length checks (with max_payload_len) -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Frame with less payload than specified as limit */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 100, -- 1, -- 0, -- "\x81\x85\x00\x00\x00\x00" "Hello", -- 11, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Edge test (success): Frame with the same payload as the specified limit */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 5, -- 1, -- 0, -- "\x81\x85\x00\x00\x00\x00" "Hello", -- 11, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Edge test (fail): Frame with more payload than specified as limit */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 4, -- 1, -- 0, -- "\x81\x85\x00\x00\x00\x00" "Hello", -- 11, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 2); -- /* Regular test: Fragmented frames with the sum of payload less than specified as limit */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 100, -- 1, -- 0, -- "\x01\x83\x00\x00\x00\x00" -- "Hel\x80\x82\x00\x00\x00\x00" "lo", -- 17, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- /* Edge test (success): Fragmented frames with the sum of payload equal to the specified limit */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 5, -- 1, -- 0, -- "\x01\x83\x00\x00\x00\x00" -- "Hel\x80\x82\x00\x00\x00\x00" "lo", -- 17, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- /* Edge test (fail): Fragmented frames with the sum of payload more than specified as limit */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 4, -- 1, -- 0, -- "\x01\x83\x00\x00\x00\x00" -- "Hel\x80\x82\x00\x00\x00\x00" "lo", -- 17, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 15); -- /* Edge test (success): Fragmented frames with the sum of payload greater than -- the specified limit, but we take fragments (one call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 5, -- 1, -- 0, -- "\x01\x83\x00\x00\x00\x00" -- "Hel\x80\x82\x00\x00\x00\x00" "lo", -- 17, -- "Hel", -- 3, -- MHD_WEBSOCKET_STATUS_TEXT_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 9); -- /* Edge test (success): Fragmented frames with the sum of payload greater than -- the specified limit, but we take fragments (two calls) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 5, -- 2, -- 0, -- "\x01\x83\x00\x00\x00\x00" -- "Hel\x80\x82\x00\x00\x00\x00" "lo", -- 17, -- "lo", -- 2, -- MHD_WEBSOCKET_STATUS_TEXT_LAST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- -- /* -- ------------------------------------------------------------------------------ -- UTF-8 sequences -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: No UTF-8 characters */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 a ", -- 16, -- " a ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Fail test: A UTF-8 tail character without sequence start character */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xA4 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 7); -- /* Regular test: A two byte UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xC3\xA4 ", -- 16, -- " \xC3\xA4 ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Fail test: A broken two byte UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xC3 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Fail test: A two byte UTF-8 sequence with one UTF-8 tail too much */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xC3\xA4\xA4 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 9); -- /* Regular test: A three byte UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEF\x8F\x8F ", -- 16, -- " \xEF\x8F\x8F ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Fail test: A broken byte UTF-8 sequence (two of three bytes) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEF\x8F ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 9); -- /* Fail test: A broken byte UTF-8 sequence (one of three bytes) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEF ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Fail test: A three byte UTF-8 sequence followed by one UTF-8 tail byte */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEF\x8F\x8F\x8F ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 10); -- /* Regular test: A four byte UTF-8 sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF2\x8F\x8F\x8F ", -- 16, -- " \xF2\x8F\x8F\x8F ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Fail test: A broken four byte UTF-8 sequence (three of four bytes) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF2\x8F\x8F ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 10); -- /* Fail test: A broken four byte UTF-8 sequence (two of four bytes) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF2\x8F ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 9); -- /* Fail test: A broken four byte UTF-8 sequence (one of four bytes) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF2 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Fail test: A four byte UTF-8 sequence followed by UTF-8 tail */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF2\x8F\x8F\x8F\x8F ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 11); -- /* Fail test: A five byte UTF-8 sequence (only up to four bytes allowed) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xFB\x8F\x8F\x8F\x8F ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 7); -- /* Fail test: A six byte UTF-8 sequence (only up to four bytes allowed) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xFD\x8F\x8F\x8F\x8F\x8F ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 7); -- /* Fail test: A seven byte UTF-8 sequence (only up to four bytes allowed) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xFE\x8F\x8F\x8F\x8F\x8F\x8F ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 7); -- /* Fail test: A eight byte UTF-8 sequence (only up to four bytes allowed) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xFF\x8F\x8F\x8F\x8F\x8F\x8F\x8F ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 7); -- /* Edge test (success): The maximum allowed UTF-8 character */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF4\x8F\xBF\xBF ", -- 16, -- " \xF4\x8F\xBF\xBF ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (fail): The maximum allowed UTF-8 character + 1 */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF4\x90\x80\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (success): The last valid UTF8-1 character */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \x7F ", -- 16, -- " \x7F ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (fail): The value after the last valid UTF8-1 character */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 7); -- /* Edge test (fail): The value before the first valid UTF8-2 character */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xC1\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 7); -- /* Edge test (success): The first valid UTF8-2 character */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xC2\x80 ", -- 16, -- " \xC2\x80 ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (success): The last valid UTF8-2 character */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xDF\xBF ", -- 16, -- " \xDF\xBF ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (fail): The value after the lst valid UTF8-2 character */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xE0\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (fail): The value before the first valid UTF8-3 character (tail 1) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xE0\x9F\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (success): The first valid UTF8-3 character (tail 1) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xE0\xA0\x80 ", -- 16, -- " \xE0\xA0\x80 ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (success): The last valid UTF8-3 character (tail 1) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xE0\xBF\xBF ", -- 16, -- " \xE0\xBF\xBF ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (fail): The value after the first valid UTF8-3 character (tail 1) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xE0\xC0\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (success): The first valid UTF8-3 character (tail 2) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xE1\x80\x80 ", -- 16, -- " \xE1\x80\x80 ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (success): The last valid UTF8-3 character (tail 2) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEC\xBF\xBF ", -- 16, -- " \xEC\xBF\xBF ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (fail): The value after the last valid UTF8-3 character (tail 2) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEC\xC0\xBF ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (fail): The value before the first valid UTF8-3 character (tail 3) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xED\x7F\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (success): The first valid UTF8-3 character (tail 3) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xED\x80\x80 ", -- 16, -- " \xED\x80\x80 ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (success): The last valid UTF8-3 character (tail 3) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xED\x9F\xBF ", -- 16, -- " \xED\x9F\xBF ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (fail): The value after the last valid UTF8-3 character (tail 3) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xED\xA0\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (fail): The value before the first valid UTF8-3 character (tail 4) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEE\x7F\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (success): The first valid UTF8-3 character (tail 4) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEE\x80\x80 ", -- 16, -- " \xEE\x80\x80 ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (success): The last valid UTF8-3 character (tail 4) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEF\xBF\xBF ", -- 16, -- " \xEF\xBF\xBF ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (fail): The value after the last valid UTF8-3 character (tail 4) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEF\xBF\xC0 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 9); -- /* Edge test (fail): The value after the last valid UTF8-3 character (tail 4) #2 */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xEF\xC0\xBF ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (fail): The value before the first valid UTF8-4 character (tail 1) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF0\x8F\x80\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (success): The first valid UTF8-4 character (tail 1) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF0\x90\x80\x80 ", -- 16, -- " \xF0\x90\x80\x80 ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (success): The last valid UTF8-4 character (tail 1) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF0\xBF\xBF\xBF ", -- 16, -- " \xF0\xBF\xBF\xBF ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (success): The first valid UTF8-4 character (tail 2) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF1\x80\x80\x80 ", -- 16, -- " \xF1\x80\x80\x80 ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (success): The last valid UTF8-4 character (tail 2) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF3\xBF\xBF\xBF ", -- 16, -- " \xF3\xBF\xBF\xBF ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (fail): A value before the last valid UTF8-4 character in the second byte (tail 2) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF3\x7F\x80\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (fail): A value after the last valid UTF8-4 character in the second byte (tail 2) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF3\xC0\x80\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (success): The first valid UTF8-4 character (tail 3) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF4\x80\x80\x80 ", -- 16, -- " \xF4\x80\x80\x80 ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (success): The last valid UTF8-4 character (tail 3) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF4\x8F\xBF\xBF ", -- 16, -- " \xF4\x8F\xBF\xBF ", -- 10, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 16); -- /* Edge test (fail): The value after the last valid UTF8-4 character (tail 3) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF4\x90\x80\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 8); -- /* Edge test (fail): The first byte value the last valid UTF8-4 character */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x8A\x00\x00\x00\x00 \xF5\x90\x80\x80 ", -- 16, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 7); -- -- /* -- ------------------------------------------------------------------------------ -- Unfinished UTF-8 sequence between fragmented text frame -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: UTF-8 sequence between fragments, no fragmentation for the caller */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x8D\x00\x00\x00\x00" "This is my n" -- "\xC3\x80\x83\x00\x00\x00\x00\xB6" "te", -- 28, -- "This is my n" "\xC3\xB6" "te", -- 16, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 28); -- /* Regular test: UTF-8 sequence between fragments, fragmentation for the caller, 1st call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x8D\x00\x00\x00\x00" "This is my n" -- "\xC3\x80\x83\x00\x00\x00\x00\xB6" "te", -- 28, -- "This is my n", -- 12, -- MHD_WEBSOCKET_STATUS_TEXT_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 19); -- /* Regular test: UTF-8 sequence between fragments, fragmentation for the caller, 2nd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x01\x8D\x00\x00\x00\x00" "This is my n" -- "\xC3\x80\x83\x00\x00\x00\x00\xB6" "te", -- 28, -- "\xC3\xB6" "te", -- 4, -- MHD_WEBSOCKET_STATUS_TEXT_LAST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 28); -- /* Edge test (success): UTF-8 sequence between fragments, but nothing before, fragmentation for the caller, 1st call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x81\x00\x00\x00\x00\xC3\x80\x81\x00\x00\x00\x00\xB6", -- 14, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_TEXT_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 7); -- /* Edge test (success): UTF-8 sequence between fragments, but nothing before, fragmentation for the caller, 2nd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x01\x81\x00\x00\x00\x00\xC3\x80\x81\x00\x00\x00\x00\xB6", -- 14, -- "\xC3\xB6", -- 2, -- MHD_WEBSOCKET_STATUS_TEXT_LAST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 14); -- -- /* -- ------------------------------------------------------------------------------ -- Decoding with broken stream -- ------------------------------------------------------------------------------ -- */ -- /* Failure test: Invalid sequence */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\xFF\x81\x85\x00\x00\x00\x00" "Hello", -- 12, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Failure test: Call after invalidated stream */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\xFF\x81\x85\x00\x00\x00\x00" "Hello", -- 12, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_STREAM_BROKEN, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Failure test: Call after invalidated stream (but with different buffer) */ -- { -- struct MHD_WebSocketStream *ws; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0)) -- { -- size_t streambuf_read_len = 0; -- char *payload = NULL; -- size_t payload_len = 0; -- int ret = 0; -- ret = MHD_websocket_decode (ws, -- "\xFF", -- 1, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if (MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR != ret) -- { -- fprintf (stderr, -- "Test failed in line %u: The return value should be -1, but is %d\n", -- (unsigned int) __LINE__, -- (int) ret); -- ++failed; -- } -- else -- { -- ret = MHD_websocket_decode (ws, -- "\x81\x85\x00\x00\x00\x00" "Hello", -- 11, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if (MHD_WEBSOCKET_STATUS_STREAM_BROKEN != ret) -- { -- fprintf (stderr, -- "Test failed in line %u: The return value should be -2, but is %d\n", -- (unsigned int) __LINE__, -- (int) ret); -- ++failed; -- } -- } -- MHD_websocket_stream_free (ws); -- } -- else -- { -- fprintf (stderr, -- "Individual test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- -- /* -- ------------------------------------------------------------------------------ -- frame after close frame -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Close frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x88\x80\x00\x00\x00\x00\x81\x85\x00\x00\x00\x00" -- "Hello", -- 17, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 6); -- /* Failure test: Text frame after close frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x88\x80\x00\x00\x00\x00\x81\x85\x00\x00\x00\x00" -- "Hello", -- 17, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 6); -- /* Failure test: Binary frame after close frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x88\x80\x00\x00\x00\x00\x82\x85\x00\x00\x00\x00" -- "Hello", -- 17, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 6); -- /* Failure test: Continue frame after close frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x88\x80\x00\x00\x00\x00\x80\x85\x00\x00\x00\x00" -- "Hello", -- 17, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 6); -- /* Regular test: Ping frame after close frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x88\x80\x00\x00\x00\x00\x89\x85\x00\x00\x00\x00" -- "Hello", -- 17, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 17); -- /* Regular test: Pong frame after close frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x88\x80\x00\x00\x00\x00\x8A\x85\x00\x00\x00\x00" -- "Hello", -- 17, -- "Hello", -- 5, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 17); -- /* Regular test: Close frame after close frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x88\x80\x00\x00\x00\x00\x88\x80\x00\x00\x00\x00", -- 12, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 12); -- -- /* -- ------------------------------------------------------------------------------ -- decoding byte-by-byte -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Text frame, 2 bytes per loop, 1st call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 2, -- "\x81\x91\x01\x02\x04\x08" "Ujm{!kw(uja(ugw|/", -- 23, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_OK, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 2); -- /* Regular test: Text frame, 2 bytes per loop, 11th call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 11, -- 2, -- "\x81\x91\x01\x02\x04\x08" "Ujm{!kw(uja(ugw|/", -- 23, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_OK, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 22); -- /* Regular test: Text frame, 2 bytes per loop, 12th call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 12, -- 2, -- "\x81\x91\x01\x02\x04\x08" "Ujm{!kw(uja(ugw|/", -- 23, -- "This is the test.", -- 17, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 23); -- /* Regular test: Text frame, 1 byte per loop, 1st call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 1, -- "\x81\x91\x01\x02\x04\x08" "Ujm{!kw(uja(ugw|/", -- 23, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_OK, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 1); -- /* Regular test: Text frame, 1 byte per loop, 22nd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 22, -- 1, -- "\x81\x91\x01\x02\x04\x08" "Ujm{!kw(uja(ugw|/", -- 23, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_OK, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 22); -- /* Regular test: Text frame, 1 byte per loop, 23rd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 23, -- 1, -- "\x81\x91\x01\x02\x04\x08" "Ujm{!kw(uja(ugw|/", -- 23, -- "This is the test.", -- 17, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 23); -- -- /* -- ------------------------------------------------------------------------------ -- mix of fragmented data frames and control frames -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Fragmented text frame mixed with one ping frame (1st call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x89\x80\x00\x00\x00\x00" -- "\x80\x8C\x00\x00\x00\x00" "is the test.", -- 35, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- /* Regular test: Fragmented text frame mixed with one ping frame (2nd call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x89\x80\x00\x00\x00\x00" -- "\x80\x8C\x00\x00\x00\x00" "is the test.", -- 35, -- "This is the test.", -- 17, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 35); -- /* Regular test: Fragmented text frame mixed with one close frame (1st call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x88\x80\x00\x00\x00\x00" -- "\x80\x8C\x00\x00\x00\x00" "is the test.", -- 35, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 17); -- /* Fail test: Fragmented text frame mixed with one ping frame (2nd call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x88\x80\x00\x00\x00\x00" -- "\x80\x8C\x00\x00\x00\x00" "is the test.", -- 35, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 17); -- /* Regular test: Fragmented text frame mixed with one ping frame, the caller wants fragments (1st call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x89\x80\x00\x00\x00\x00" -- "\x80\x8C\x00\x00\x00\x00" "is the test.", -- 35, -- "This ", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Regular test: Fragmented text frame mixed with one ping frame, the caller wants fragments (2nd call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x89\x80\x00\x00\x00\x00" -- "\x80\x8C\x00\x00\x00\x00" "is the test.", -- 35, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 17); -- /* Regular test: Fragmented text frame mixed with one ping frame, the caller wants fragments (3rd call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 3, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x89\x80\x00\x00\x00\x00" -- "\x80\x8C\x00\x00\x00\x00" "is the test.", -- 35, -- "is the test.", -- 12, -- MHD_WEBSOCKET_STATUS_TEXT_LAST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 35); -- -- /* -- ------------------------------------------------------------------------------ -- mix of fragmented data frames and data frames -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: Fragmented text frame mixed with one non-fragmented binary frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x82\x81\x00\x00\x00\x00" -- "a\x80\x8C\x00\x00\x00\x00" "is the test.", -- 36, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 11); -- /* Regular test: Fragmented text frame mixed with one non-fragmented binary frame; the caller wants fragments; 1st call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x82\x81\x00\x00\x00\x00" -- "a\x80\x8C\x00\x00\x00\x00" "is the test.", -- 36, -- "This ", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FIRST_FRAGMENT, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Fail test: Fragmented text frame mixed with one non-fragmented binary frame; the caller wants fragments; 2nd call */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x82\x81\x00\x00\x00\x00" -- "a\x80\x8C\x00\x00\x00\x00" "is the test.", -- 36, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 11); -- /* Fail test: Fragmented text frame mixed with one fragmented binary frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x02\x81\x00\x00\x00\x00" -- "a\x80\x8C\x00\x00\x00\x00" "is the test.", -- 36, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 11); -- /* Fail test: Fragmented text frame, continue frame, non-fragmented binary frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x00\x8C\x00\x00\x00\x00" -- "is the test.\x82\x81\x00\x00\x00\x00" "a", -- 36, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 29); -- /* Fail test: Fragmented text frame, continue frame, fragmented binary frame */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x01\x85\x00\x00\x00\x00" -- "This \x00\x8C\x00\x00\x00\x00" -- "is the test.\x02\x81\x00\x00\x00\x00" "a", -- 36, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 29); -- -- /* -- ------------------------------------------------------------------------------ -- multiple data frames -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Text frame, binary frame, text frame (1st call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x81\x85\x00\x00\x00\x00" -- "This \x82\x87\x00\x00\x00\x00" -- "is the \x81\x85\x00\x00\x00\x00" "test.", -- 35, -- "This ", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Regular test: Text frame, binary frame, text frame (2nd call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x81\x85\x00\x00\x00\x00" -- "This \x82\x87\x00\x00\x00\x00" -- "is the \x81\x85\x00\x00\x00\x00" "test.", -- 35, -- "is the ", -- 7, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 24); -- /* Regular test: Text frame, binary frame, text frame (3rd call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 3, -- 0, -- "\x81\x85\x00\x00\x00\x00" -- "This \x82\x87\x00\x00\x00\x00" -- "is the \x81\x85\x00\x00\x00\x00" "test.", -- 35, -- "test.", -- 5, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 35); -- /* -- ------------------------------------------------------------------------------ -- multiple control frames -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Ping frame, pong frame, close frame (1st call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- "\x89\x85\x00\x00\x00\x00" -- "This \x8A\x87\x00\x00\x00\x00" -- "is the \x88\x85\x00\x00\x00\x00" "test.", -- 35, -- "This ", -- 5, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 11); -- /* Regular test: Ping frame, pong frame, close frame (2nd call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 2, -- 0, -- "\x89\x85\x00\x00\x00\x00" -- "This \x8A\x87\x00\x00\x00\x00" -- "is the \x88\x85\x00\x00\x00\x00" "test.", -- 35, -- "is the ", -- 7, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- 24); -- /* Regular test: Ping frame, pong frame, close frame (3rd call) */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 3, -- 0, -- "\x89\x85\x00\x00\x00\x00" -- "This \x8A\x87\x00\x00\x00\x00" -- "is the \x88\x85\x00\x00\x00\x00" "test.", -- 35, -- "test.", -- 5, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- 35); -- -- /* -- ------------------------------------------------------------------------------ -- generated close frames for errors -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Close frame generated for protocol error */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS -- | -- MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR, -- 0, -- 1, -- 0, -- "\xFF", -- 1, -- "\x88\x02\x03\xEA", -- 4, -- MHD_WEBSOCKET_STATUS_PROTOCOL_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 0); -- /* Regular test: Close frame generated for UTF-8 sequence error */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS -- | -- MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR, -- 0, -- 1, -- 0, -- "\x81\x85\x00\x00\x00\x00T\xFFst.", -- 11, -- "\x88\x02\x03\xEF", -- 4, -- MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 7); -- /* Regular test: Close frame generated for message size exceeded */ -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS -- | -- MHD_WEBSOCKET_FLAG_GENERATE_CLOSE_FRAMES_ON_ERROR, -- 3, -- 1, -- 0, -- "\x81\x85\x00\x00\x00\x00T\xFFst.", -- 11, -- "\x88\x02\x03\xF1", -- 4, -- MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED, -- MHD_WEBSOCKET_VALIDITY_INVALID, -- 2); -- -- /* -- ------------------------------------------------------------------------------ -- terminating NUL character -- ------------------------------------------------------------------------------ -- */ -- { -- struct MHD_WebSocketStream *ws; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0)) -- { -- size_t streambuf_read_len = 0; -- char *payload = NULL; -- size_t payload_len = 0; -- int ret = 0; -- -- /* Regular test: text frame */ -- ret = MHD_websocket_decode (ws, -- "\x81\x85\x00\x00\x00\x00" "Hello", -- 11, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_TEXT_FRAME != ret) || -- (5 != payload_len) || -- (NULL == payload) || -- (0 != memcmp ("Hello", payload, 5 + 1))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- payload = NULL; -- } -- -- /* Regular test: text frame fragment */ -- ret = MHD_websocket_decode (ws, -- "\x01\x83\x00\x00\x00\x00" -- "Hel\x80\x82\x00\x00\x00\x00" "lo", -- 17, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_TEXT_FRAME != ret) || -- (5 != payload_len) || -- (NULL == payload) || -- (0 != memcmp ("Hello", payload, 5 + 1))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- payload = NULL; -- } -- -- /* Regular test: binary frame */ -- ret = MHD_websocket_decode (ws, -- "\x82\x85\x00\x00\x00\x00" "Hello", -- 11, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_BINARY_FRAME != ret) || -- (5 != payload_len) || -- (NULL == payload) || -- (0 != memcmp ("Hello", payload, 5 + 1))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- payload = NULL; -- } -- -- /* Regular test: binary frame fragment */ -- ret = MHD_websocket_decode (ws, -- "\x02\x83\x00\x00\x00\x00" -- "Hel\x80\x82\x00\x00\x00\x00" "lo", -- 17, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_BINARY_FRAME != ret) || -- (5 != payload_len) || -- (NULL == payload) || -- (0 != memcmp ("Hello", payload, 5 + 1))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- payload = NULL; -- } -- -- MHD_websocket_stream_free (ws); -- } -- else -- { -- fprintf (stderr, -- "Individual decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- { -- struct MHD_WebSocketStream *ws; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_WANT_FRAGMENTS, -- 0)) -- { -- size_t streambuf_read_len = 0; -- char *payload = NULL; -- size_t payload_len = 0; -- int ret = 0; -- -- /* Regular test: text frame fragment (caller wants fragment, 1st call) */ -- ret = MHD_websocket_decode (ws, -- "\x01\x83\x00\x00\x00\x00" -- "Hel\x80\x82\x00\x00\x00\x00" "lo", -- 17, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_TEXT_FIRST_FRAGMENT != ret) || -- (3 != payload_len) || -- (NULL == payload) || -- (0 != memcmp ("Hel", payload, 3 + 1))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- payload = NULL; -- } -- -- /* Regular test: text frame fragment (caller wants fragment, 2nd call) */ -- ret = MHD_websocket_decode (ws, -- "\x01\x83\x00\x00\x00\x00" -- "Hel\x80\x82\x00\x00\x00\x00" "lo" -- + streambuf_read_len, -- 17 - streambuf_read_len, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_TEXT_LAST_FRAGMENT != ret) || -- (2 != payload_len) || -- (NULL == payload) || -- (0 != memcmp ("lo", payload, 2 + 1))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- payload = NULL; -- } -- -- /* Regular test: text frame fragment with broken UTF-8 sequence (caller wants fragment, 1st call) */ -- ret = MHD_websocket_decode (ws, -- "\x01\x83\x00\x00\x00\x00" -- "He\xC3\x80\x82\x00\x00\x00\x00" "\xB6o", -- 17, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_TEXT_FIRST_FRAGMENT != ret) || -- (2 != payload_len) || -- (NULL == payload) || -- (0 != memcmp ("He", payload, 2 + 1))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- payload = NULL; -- } -- -- /* Regular test: text frame fragment with broken UTF-8 sequence (caller wants fragment, 2nd call) */ -- ret = MHD_websocket_decode (ws, -- "\x01\x83\x00\x00\x00\x00" -- "He\xC3\x80\x82\x00\x00\x00\x00" "\xB6o" -- + streambuf_read_len, -- 17 - streambuf_read_len, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_TEXT_LAST_FRAGMENT != ret) || -- (3 != payload_len) || -- (NULL == payload) || -- (0 != memcmp ("\xC3\xB6o", payload, 3 + 1))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- payload = NULL; -- } -- -- MHD_websocket_stream_free (ws); -- } -- else -- { -- fprintf (stderr, -- "Individual decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- -- -- /* -- ------------------------------------------------------------------------------ -- invalid parameters -- ------------------------------------------------------------------------------ -- */ -- { -- struct MHD_WebSocketStream *ws; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0)) -- { -- size_t streambuf_read_len = 0; -- char *payload = NULL; -- size_t payload_len = 0; -- int ret = 0; -- -- /* Failure test: `ws` is NULL */ -- payload = (char *) (uintptr_t) 0xBAADF00D; -- payload_len = 0x87654321; -- streambuf_read_len = 1000; -- ret = MHD_websocket_decode (NULL, -- "\x81\x85\x00\x00\x00\x00Hello", -- 11, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != payload) || -- (0 != payload_len) || -- (0 != streambuf_read_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid (ws))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == payload) -- { -- payload = NULL; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- } -- /* Failure test: `buf` is NULL, while `buf_len` != 0 */ -- payload = (char *) (uintptr_t) 0xBAADF00D; -- payload_len = 0x87654321; -- streambuf_read_len = 1000; -- ret = MHD_websocket_decode (ws, -- NULL, -- 11, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != payload) || -- (0 != payload_len) || -- (0 != streambuf_read_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid (ws))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == payload) -- { -- payload = NULL; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- } -- /* Failure test: `streambuf_read_len` is NULL */ -- payload = (char *) (uintptr_t) 0xBAADF00D; -- payload_len = 0x87654321; -- ret = MHD_websocket_decode (ws, -- "\x81\x85\x00\x00\x00\x00Hello", -- 11, -- NULL, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != payload) || -- (0 != payload_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid (ws))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == payload) -- { -- payload = NULL; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- } -- /* Failure test: `payload` is NULL */ -- payload_len = 0x87654321; -- streambuf_read_len = 1000; -- ret = MHD_websocket_decode (ws, -- "\x81\x85\x00\x00\x00\x00Hello", -- 11, -- &streambuf_read_len, -- NULL, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != payload_len) || -- (0 != streambuf_read_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid (ws))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Failure test: `payload_len` is NULL */ -- payload = (char *) (uintptr_t) 0xBAADF00D; -- streambuf_read_len = 1000; -- ret = MHD_websocket_decode (ws, -- "\x81\x85\x00\x00\x00\x00Hello", -- 11, -- &streambuf_read_len, -- &payload, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != payload) || -- (0 != streambuf_read_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid (ws))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == payload) -- { -- payload = NULL; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- } -- /* Regular test: `buf` is NULL and `buf_len` is 0 */ -- payload = (char *) (uintptr_t) 0xBAADF00D; -- payload_len = 0x87654321; -- streambuf_read_len = 1000; -- ret = MHD_websocket_decode (ws, -- NULL, -- 0, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL != payload) || -- (0 != payload_len) || -- (0 != streambuf_read_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid (ws))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == payload) -- { -- payload = NULL; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- } -- /* Regular test: `buf` is not NULL and `buf_len` is 0 */ -- payload = (char *) (uintptr_t) 0xBAADF00D; -- payload_len = 0x87654321; -- streambuf_read_len = 1000; -- ret = MHD_websocket_decode (ws, -- "\x81\x85\x00\x00\x00\x00Hello", -- 0, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL != payload) || -- (0 != payload_len) || -- (0 != streambuf_read_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid (ws))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == payload) -- { -- payload = NULL; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- } -- -- MHD_websocket_stream_free (ws); -- } -- else -- { -- fprintf (stderr, -- "Parameter decode tests failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- -- /* -- ------------------------------------------------------------------------------ -- validity after temporary out-of-memory -- ------------------------------------------------------------------------------ -- */ -- { -- struct MHD_WebSocketStream *ws; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- size_t streambuf_read_len = 0; -- char *payload = NULL; -- size_t payload_len = 0; -- int ret = 0; -- -- /* Failure test: No memory allocation at the start */ -- disable_alloc = 1; -- payload = (char *) (uintptr_t) 0xBAADF00D; -- payload_len = 0x87654321; -- streambuf_read_len = 1000; -- ret = MHD_websocket_decode (ws, -- "\x81\x85\x00\x00\x00\x00Hello", -- 11, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_MEMORY_ERROR != ret) || -- (NULL != payload) || -- (0 != payload_len) || -- (1000 == streambuf_read_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid (ws))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == payload) -- { -- payload = NULL; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- } -- MHD_websocket_stream_free (ws); -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- /* Failure test: No memory allocation after fragmented frame */ -- disable_alloc = 0; -- payload = (char *) (uintptr_t) 0xBAADF00D; -- payload_len = 0x87654321; -- streambuf_read_len = 1000; -- ret = MHD_websocket_decode (ws, -- "\x01\x83\x00\x00\x00\x00" "Hel", -- 9, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (NULL != payload) || -- (0 != payload_len) || -- (9 != streambuf_read_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid ( -- ws))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == payload) -- { -- payload = NULL; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- } -- disable_alloc = 1; -- payload = (char *) (uintptr_t) 0xBAADF00D; -- payload_len = 0x87654321; -- streambuf_read_len = 1000; -- ret = MHD_websocket_decode (ws, -- "\x80\x82\x00\x00\x00\x00" "lo", -- 8, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_MEMORY_ERROR != ret) || -- (NULL != payload) || -- (0 != payload_len) || -- (1000 == streambuf_read_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid ( -- ws))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == payload) -- { -- payload = NULL; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- } -- /* Regular test: Success after memory allocation ok again */ -- /* (streambuf_read_len may not be overwritten for this test) */ -- disable_alloc = 0; -- payload = (char *) (uintptr_t) 0xBAADF00D; -- payload_len = 0x87654321; -- size_t old_streambuf_read_len = streambuf_read_len; -- ret = MHD_websocket_decode (ws, -- "\x80\x82\x00\x00\x00\x00lo" -- + old_streambuf_read_len, -- 8 - old_streambuf_read_len, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_TEXT_FRAME != ret) || -- (NULL == payload) || -- (5 != payload_len) || -- (8 != streambuf_read_len + old_streambuf_read_len) || -- (MHD_WEBSOCKET_VALIDITY_VALID != MHD_websocket_stream_is_valid ( -- ws)) || -- (0 != memcmp ("Hello", payload, 5))) -- { -- fprintf (stderr, -- "Decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == payload) -- { -- payload = NULL; -- } -- if (NULL != payload) -- { -- MHD_websocket_free (ws, payload); -- } -- -- MHD_websocket_stream_free (ws); -- } -- else -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- else -- { -- fprintf (stderr, -- "Memory decode tests failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- -- /* -- ------------------------------------------------------------------------------ -- memory leak test, when freeing while decoding -- ------------------------------------------------------------------------------ -- */ -- { -- disable_alloc = 0; -- struct MHD_WebSocketStream *ws; -- size_t streambuf_read_len = 0; -- char *payload = NULL; -- size_t payload_len = 0; -- int ret = 0; -- -- /* Regular test: Free while decoding of data frame */ -- open_allocs = 0; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- ret = MHD_websocket_decode (ws, -- "\x81\x85\x00\x00\x00\x00Hel", -- 9, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (0 != payload_len) || -- (NULL != payload) || -- (9 != streambuf_read_len) ) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- ret = MHD_websocket_stream_free (ws); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (0 != open_allocs) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u (memory leak detected)\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- else -- { -- fprintf (stderr, -- "Memory test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* Regular test: Free while decoding of control frame */ -- open_allocs = 0; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- ret = MHD_websocket_decode (ws, -- "\x88\x85\x00\x00\x00\x00Hel", -- 9, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (0 != payload_len) || -- (NULL != payload) || -- (9 != streambuf_read_len) ) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- ret = MHD_websocket_stream_free (ws); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (0 != open_allocs) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u (memory leak detected)\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- else -- { -- fprintf (stderr, -- "Memory test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* Regular test: Free while decoding of fragmented data frame */ -- open_allocs = 0; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- ret = MHD_websocket_decode (ws, -- "\x01\x85\x00\x00\x00\x00Hello", -- 11, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (0 != payload_len) || -- (NULL != payload) || -- (11 != streambuf_read_len) ) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- ret = MHD_websocket_stream_free (ws); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (0 != open_allocs) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u (memory leak detected)\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- else -- { -- fprintf (stderr, -- "Memory test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: Free while decoding of continued fragmented data frame */ -- open_allocs = 0; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- ret = MHD_websocket_decode (ws, -- "\x01\x85\x00\x00\x00\x00Hello", -- 11, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (0 != payload_len) || -- (NULL != payload) || -- (11 != streambuf_read_len) ) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- ret = MHD_websocket_decode (ws, -- "\x80\x85\x00\x00\x00\x00Hel", -- 9, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (0 != payload_len) || -- (NULL != payload) || -- (9 != streambuf_read_len) ) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- ret = MHD_websocket_stream_free (ws); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (0 != open_allocs) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u (memory leak detected)\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- else -- { -- fprintf (stderr, -- "Memory test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: Free while decoding of control frame during fragmented data frame */ -- open_allocs = 0; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&ws, -- MHD_WEBSOCKET_FLAG_SERVER -- | -- MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- ret = MHD_websocket_decode (ws, -- "\x01\x85\x00\x00\x00\x00Hello", -- 11, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (0 != payload_len) || -- (NULL != payload) || -- (11 != streambuf_read_len) ) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- ret = MHD_websocket_decode (ws, -- "\x88\x85\x00\x00\x00\x00Hel", -- 9, -- &streambuf_read_len, -- &payload, -- &payload_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (0 != payload_len) || -- (NULL != payload) || -- (9 != streambuf_read_len) ) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- ret = MHD_websocket_stream_free (ws); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (0 != open_allocs) -- { -- fprintf (stderr, -- "Memory decode test failed in line %u (memory leak detected)\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- else -- { -- fprintf (stderr, -- "Memory test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- -- if (NULL != buf1) -- { -- free (buf1); -- buf1 = NULL; -- } -- if (NULL != buf2) -- { -- free (buf2); -- buf2 = NULL; -- } -- return failed != 0 ? 0x04 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_encode_text()` -- */ --int --test_encodes_text () --{ -- int failed = 0; -- struct MHD_WebSocketStream *wss; -- struct MHD_WebSocketStream *wsc; -- int ret; -- char *buf1 = NULL, *buf2 = NULL; -- char *frame = NULL; -- size_t frame_len = 0; -- int utf8_step = 0; -- -- if (MHD_WEBSOCKET_STATUS_OK != MHD_websocket_stream_init2 (&wsc, -- MHD_WEBSOCKET_FLAG_CLIENT, -- 0, -- malloc, -- realloc, -- free, -- NULL, -- test_rng)) -- { -- fprintf (stderr, -- "No encode text tests possible due to failed stream init in line %u\n", -- (unsigned int) __LINE__); -- return 0x08; -- } -- if (MHD_WEBSOCKET_STATUS_OK != MHD_websocket_stream_init (&wss, -- MHD_WEBSOCKET_FLAG_SERVER, -- 0)) -- { -- fprintf (stderr, -- "No encode text tests possible due to failed stream init in line %u\n", -- (unsigned int) __LINE__); -- if (NULL != wsc) -- MHD_websocket_stream_free (wsc); -- return 0x08; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Encoding -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Some data without UTF-8, we are server */ -- ret = MHD_websocket_encode_text (wss, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x81\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Some data without UTF-8, we are client */ -- ret = MHD_websocket_encode_text (wsc, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (15 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- "blablabla", -- 9, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Regular test: Some data with UTF-8, we are server */ -- ret = MHD_websocket_encode_text (wss, -- "bla" "\xC3\xA4" "blabla", -- 11, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (13 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x81\x0B" "bla" "\xC3\xA4" "blabla", 13))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Some data with UTF-8, we are client */ -- ret = MHD_websocket_encode_text (wsc, -- "bla" "\xC3\xA4" "blabla", -- 11, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (17 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- "bla" "\xC3\xA4" "blabla", -- 11, -- MHD_WEBSOCKET_STATUS_TEXT_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Edge test (success): Some data with NUL characters, we are server */ -- ret = MHD_websocket_encode_text (wss, -- "bla" "\0\0\0" "bla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x81\x09" "bla" "\0\0\0" "bla", 11))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: Some data with broken UTF-8, we are server */ -- ret = MHD_websocket_encode_text (wss, -- "bla" "\xC3" "blabla", -- 10, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Fragmentation -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Some data without UTF-8 */ -- ret = MHD_websocket_encode_text (wss, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x81\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: First fragment without UTF-8 */ -- ret = MHD_websocket_encode_text (wss, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_FIRST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x01\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Middle fragment without UTF-8 */ -- ret = MHD_websocket_encode_text (wss, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_FOLLOWING, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x00\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment without UTF-8 */ -- ret = MHD_websocket_encode_text (wss, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): First fragment with UTF-8 on the edge */ -- ret = MHD_websocket_encode_text (wss, -- "blablabl\xC3", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_FIRST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_UTF2TAIL_1OF1 != utf8_step) || -- (0 != memcmp (frame, "\x01\x09" "blablabl\xC3", 11))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Last fragment with UTF-8 on the edge */ -- ret = MHD_websocket_encode_text (wss, -- "\xA4" "blablabla", -- 10, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (12 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0A" "\xA4" "blablabla", 12))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: Last fragment with UTF-8 on the edge (here with wrong old utf8_step) */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_NORMAL; -- ret = MHD_websocket_encode_text (wss, -- "\xA4" "blablabla", -- 10, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment with UTF-8 on the edge for UTF2TAIL_1OF1 */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_UTF2TAIL_1OF1; -- ret = MHD_websocket_encode_text (wss, -- "\xA4" "blablabla", -- 10, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (12 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0A" "\xA4" "blablabla", 12))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment with UTF-8 on the edge for UTF3TAIL1_1OF2 */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_UTF3TAIL1_1OF2; -- ret = MHD_websocket_encode_text (wss, -- "\xA0\x80" "blablabla", -- 11, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (13 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0B" "\xA0\x80" "blablabla", 13))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment with UTF-8 on the edge for UTF3TAIL2_1OF2 */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_UTF3TAIL2_1OF2; -- ret = MHD_websocket_encode_text (wss, -- "\x80\x80" "blablabla", -- 11, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (13 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0B" "\x80\x80" "blablabla", 13))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment with UTF-8 on the edge for UTF3TAIL_1OF2 */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_UTF3TAIL_1OF2; -- ret = MHD_websocket_encode_text (wss, -- "\x80\x80" "blablabla", -- 11, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (13 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0B" "\x80\x80" "blablabla", 13))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment with UTF-8 on the edge for UTF3TAIL_2OF2 */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_UTF3TAIL_2OF2; -- ret = MHD_websocket_encode_text (wss, -- "\x80" " blablabla", -- 11, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (13 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0B" "\x80" " blablabla", 13))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment with UTF-8 on the edge for UTF4TAIL1_1OF3 */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL1_1OF3; -- ret = MHD_websocket_encode_text (wss, -- "\x90\x80\x80" "blablabla", -- 12, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (14 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0C" "\x90\x80\x80" "blablabla", 14))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment with UTF-8 on the edge for UTF4TAIL2_1OF3 */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL2_1OF3; -- ret = MHD_websocket_encode_text (wss, -- "\x80\x80\x80" "blablabla", -- 12, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (14 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0C" "\x80\x80\x80" "blablabla", 14))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment with UTF-8 on the edge for UTF4TAIL_1OF3 */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_1OF3; -- ret = MHD_websocket_encode_text (wss, -- "\x80\x80\x80" "blablabla", -- 12, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (14 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0C" "\x80\x80\x80" "blablabla", 14))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment with UTF-8 on the edge for UTF4TAIL_2OF3 */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_2OF3; -- ret = MHD_websocket_encode_text (wss, -- "\x80\x80" " blablabla", -- 12, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (14 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0C" "\x80\x80" " blablabla", 14))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment with UTF-8 on the edge for UTF4TAIL_3OF3 */ -- utf8_step = MHD_WEBSOCKET_UTF8STEP_UTF4TAIL_3OF3; -- ret = MHD_websocket_encode_text (wss, -- "\x80" " blablabla", -- 12, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (14 != frame_len) || -- (NULL == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x0C" "\x80" " blablabla", 14))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Length checks -- ------------------------------------------------------------------------------ -- */ -- /* Edge test (success): Text frame without data */ -- ret = MHD_websocket_encode_text (wss, -- NULL, -- 0, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x81\x00", 2))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Text frame with 1 byte of data */ -- ret = MHD_websocket_encode_text (wss, -- "a", -- 1, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (3 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x81\x01" "a", 3))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Text frame with 125 bytes of data */ -- ret = MHD_websocket_encode_text (wss, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 125, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (127 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x81\x7D" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 127))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Text frame with 126 bytes of data */ -- ret = MHD_websocket_encode_text (wss, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", -- 126, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (130 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x81\x7E\x00\x7E" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", -- 130))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Text frame with 65535 bytes of data */ -- allocate_length_test_data (&buf1, -- &buf2, -- 65535, -- "\x81\x7E\xFF\xFF", -- 4); -- ret = MHD_websocket_encode_text (wss, -- buf2, -- 65535, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (65535 + 4 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, buf1, 65535 + 4))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Text frame with 65536 bytes of data */ -- allocate_length_test_data (&buf1, -- &buf2, -- 65536, -- "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", -- 10); -- ret = MHD_websocket_encode_text (wss, -- buf2, -- 65536, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (65536 + 10 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, buf1, 65536 + 10))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Text frame with 100 MB of data */ -- allocate_length_test_data (&buf1, -- &buf2, -- 104857600, -- "\x81\x7F\x00\x00\x00\x00\x06\x40\x00\x00", -- 10); -- ret = MHD_websocket_encode_text (wss, -- buf2, -- 104857600, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (104857600 + 10 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, buf1, 104857600 + 10))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- if (NULL != buf1) -- { -- free (buf1); -- buf1 = NULL; -- } -- if (NULL != buf2) -- { -- free (buf2); -- buf2 = NULL; -- } --#ifdef ENABLE_64BIT_TESTS -- /* Fail test: frame_len is greater than 0x7FFFFFFFFFFFFFFF -- (this is the maximum allowed payload size) */ -- frame_len = 0; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- (uint64_t) 0x8000000000000000, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } --#endif -- -- /* -- ------------------------------------------------------------------------------ -- Wrong parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: `ws` not passed */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_text (NULL, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `payload_utf8` not passed, but `payload_utf8_len` != 0 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_text (wss, -- NULL, -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: `payload_utf8` passed, but `payload_utf8_len` == 0 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 0, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (((char *) (uintptr_t) 0xBAADF00D) == frame) || -- (0 != memcmp (frame, "\x81\x00", 2))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `frame` not passed */ -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- NULL, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: `frame_len` not passed */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- NULL, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: `utf8_step` passed for non-fragmentation -- (is allowed and `utf8_step` will be filled then) */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- utf8_step = -99; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (5 != frame_len) || -- (NULL == frame) || -- (((char *) (uintptr_t) 0xBAADF00D) == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x81\x03" "abc", 5))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `utf8_step` passed for non-fragmentation with invalid UTF-8 -- (is allowed and `utf8_step` will be filled then) */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- utf8_step = -99; -- ret = MHD_websocket_encode_text (wss, -- "ab\xC3", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) || -- (MHD_WEBSOCKET_UTF8STEP_UTF2TAIL_1OF1 != utf8_step) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `utf8_step` not passed for fragmentation #1 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_FIRST, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `utf8_step` not passed for fragmentation #2 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_FOLLOWING, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `utf8_step` not passed for fragmentation #3 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: `utf8_step` passed for fragmentation #1 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- utf8_step = -99; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_FIRST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (5 != frame_len) || -- (NULL == frame) || -- (((char *) (uintptr_t) 0xBAADF00D) == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x01\x03" "abc", 5))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: `utf8_step` passed for fragmentation #2 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- utf8_step = MHD_WEBSOCKET_UTF8STEP_NORMAL; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_FOLLOWING, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (5 != frame_len) || -- (NULL == frame) || -- (((char *) (uintptr_t) 0xBAADF00D) == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x00\x03" "abc", 5))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: `utf8_step` passed for fragmentation #3 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- utf8_step = MHD_WEBSOCKET_UTF8STEP_NORMAL; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (5 != frame_len) || -- (NULL == frame) || -- (((char *) (uintptr_t) 0xBAADF00D) == frame) || -- (MHD_WEBSOCKET_UTF8STEP_NORMAL != utf8_step) || -- (0 != memcmp (frame, "\x80\x03" "abc", 5))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `fragmentation` has an invalid value */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- utf8_step = -99; -- ret = MHD_websocket_encode_text (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_LAST + 1, -- &frame, -- &frame_len, -- &utf8_step); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) || -- (-99 != utf8_step) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- validity after temporary out-of-memory -- ------------------------------------------------------------------------------ -- */ -- { -- struct MHD_WebSocketStream *wsx; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&wsx, -- MHD_WEBSOCKET_FLAG_SERVER, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- /* Fail test: allocation while no memory available */ -- disable_alloc = 1; -- ret = MHD_websocket_encode_text (wsx, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_MEMORY_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsx, frame); -- frame = NULL; -- } -- /* Regular test: allocation while memory is available again */ -- disable_alloc = 0; -- ret = MHD_websocket_encode_text (wsx, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (5 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x81\x03" "abc", 5))) -- { -- fprintf (stderr, -- "Encode text test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsx, frame); -- frame = NULL; -- } -- -- MHD_websocket_stream_free (wsx); -- } -- else -- { -- fprintf (stderr, -- "Couldn't perform memory test for text encoding in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- -- if (NULL != buf1) -- free (buf1); -- if (NULL != buf2) -- free (buf2); -- if (NULL != wsc) -- MHD_websocket_stream_free (wsc); -- if (NULL != wss) -- MHD_websocket_stream_free (wss); -- -- return failed != 0 ? 0x08 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_encode_binary()` -- */ --int --test_encodes_binary () --{ -- int failed = 0; -- struct MHD_WebSocketStream *wss; -- struct MHD_WebSocketStream *wsc; -- int ret; -- char *buf1 = NULL, *buf2 = NULL; -- char *frame = NULL; -- size_t frame_len = 0; -- -- if (MHD_WEBSOCKET_STATUS_OK != MHD_websocket_stream_init2 (&wsc, -- MHD_WEBSOCKET_FLAG_CLIENT, -- 0, -- malloc, -- realloc, -- free, -- NULL, -- test_rng)) -- { -- fprintf (stderr, -- "No encode binary tests possible due to failed stream init in line %u\n", -- (unsigned int) __LINE__); -- return 0x10; -- } -- if (MHD_WEBSOCKET_STATUS_OK != MHD_websocket_stream_init (&wss, -- MHD_WEBSOCKET_FLAG_SERVER, -- 0)) -- { -- fprintf (stderr, -- "No encode binary tests possible due to failed stream init in line %u\n", -- (unsigned int) __LINE__); -- if (NULL != wsc) -- MHD_websocket_stream_free (wsc); -- return 0x10; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Encoding -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Some data, we are server */ -- ret = MHD_websocket_encode_binary (wss, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x82\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Some data, we are client */ -- ret = MHD_websocket_encode_binary (wsc, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (15 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- "blablabla", -- 9, -- MHD_WEBSOCKET_STATUS_BINARY_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Edge test (success): Some data with NUL characters, we are server */ -- ret = MHD_websocket_encode_binary (wss, -- "bla" "\0\0\0" "bla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x82\x09" "bla" "\0\0\0" "bla", 11))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Some data which looks like broken UTF-8, we are server */ -- ret = MHD_websocket_encode_binary (wss, -- "bla" "\xC3" "blabla", -- 10, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (12 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x82\x0A" "bla" "\xC3" "blabla", 12))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Fragmentation -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Some data */ -- ret = MHD_websocket_encode_binary (wss, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x82\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: First fragment */ -- ret = MHD_websocket_encode_binary (wss, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_FIRST, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x02\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Middle fragment */ -- ret = MHD_websocket_encode_binary (wss, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_FOLLOWING, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x00\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Last fragment */ -- ret = MHD_websocket_encode_binary (wss, -- "blablabla", -- 9, -- MHD_WEBSOCKET_FRAGMENTATION_LAST, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x80\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Length checks -- ------------------------------------------------------------------------------ -- */ -- /* Edge test (success): Binary frame without data */ -- ret = MHD_websocket_encode_binary (wss, -- NULL, -- 0, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x82\x00", 2))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Binary frame with 1 byte of data */ -- ret = MHD_websocket_encode_binary (wss, -- "a", -- 1, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (3 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x82\x01" "a", 3))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Binary frame with 125 bytes of data */ -- ret = MHD_websocket_encode_binary (wss, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 125, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (127 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x82\x7D" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 127))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Binary frame with 126 bytes of data */ -- ret = MHD_websocket_encode_binary (wss, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", -- 126, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (130 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x82\x7E\x00\x7E" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", -- 130))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Binary frame with 65535 bytes of data */ -- allocate_length_test_data (&buf1, -- &buf2, -- 65535, -- "\x82\x7E\xFF\xFF", -- 4); -- ret = MHD_websocket_encode_binary (wss, -- buf2, -- 65535, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (65535 + 4 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, buf1, 65535 + 4))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Binary frame with 65536 bytes of data */ -- allocate_length_test_data (&buf1, -- &buf2, -- 65536, -- "\x82\x7F\x00\x00\x00\x00\x00\x01\x00\x00", -- 10); -- ret = MHD_websocket_encode_binary (wss, -- buf2, -- 65536, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (65536 + 10 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, buf1, 65536 + 10))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Binary frame with 100 MB of data */ -- allocate_length_test_data (&buf1, -- &buf2, -- 104857600, -- "\x82\x7F\x00\x00\x00\x00\x06\x40\x00\x00", -- 10); -- ret = MHD_websocket_encode_binary (wss, -- buf2, -- 104857600, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (104857600 + 10 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, buf1, 104857600 + 10))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- if (NULL != buf1) -- { -- free (buf1); -- buf1 = NULL; -- } -- if (NULL != buf2) -- { -- free (buf2); -- buf2 = NULL; -- } --#ifdef ENABLE_64BIT_TESTS -- /* Fail test: `frame_len` is greater than 0x7FFFFFFFFFFFFFFF -- (this is the maximum allowed payload size) */ -- frame_len = 0; -- ret = MHD_websocket_encode_binary (wss, -- "abc", -- (uint64_t) 0x8000000000000000, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } --#endif -- -- /* -- ------------------------------------------------------------------------------ -- Wrong parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: `ws` not passed */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_binary (NULL, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `payload` not passed, but `payload_len` != 0 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_binary (wss, -- NULL, -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: `payload` passed, but `payload_len` == 0 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_binary (wss, -- "abc", -- 0, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (((char *) (uintptr_t) 0xBAADF00D) == frame) || -- (0 != memcmp (frame, "\x82\x00", 2))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `frame` not passed */ -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_binary (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- NULL, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: `frame_len` not passed */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- ret = MHD_websocket_encode_binary (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `fragmentation` has an invalid value */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_binary (wss, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_LAST + 1, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- validity after temporary out-of-memory -- ------------------------------------------------------------------------------ -- */ -- { -- struct MHD_WebSocketStream *wsx; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&wsx, -- MHD_WEBSOCKET_FLAG_SERVER, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- /* Fail test: allocation while no memory available */ -- disable_alloc = 1; -- ret = MHD_websocket_encode_binary (wsx, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_MEMORY_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsx, frame); -- frame = NULL; -- } -- /* Regular test: allocation while memory is available again */ -- disable_alloc = 0; -- ret = MHD_websocket_encode_binary (wsx, -- "abc", -- 3, -- MHD_WEBSOCKET_FRAGMENTATION_NONE, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (5 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x82\x03" "abc", 5))) -- { -- fprintf (stderr, -- "Encode binary test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsx, frame); -- frame = NULL; -- } -- -- MHD_websocket_stream_free (wsx); -- } -- else -- { -- fprintf (stderr, -- "Couldn't perform memory test for binary encoding in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- -- if (NULL != buf1) -- free (buf1); -- if (NULL != buf2) -- free (buf2); -- if (NULL != wsc) -- MHD_websocket_stream_free (wsc); -- if (NULL != wss) -- MHD_websocket_stream_free (wss); -- -- return failed != 0 ? 0x10 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_encode_close()` -- */ --int --test_encodes_close () --{ -- int failed = 0; -- struct MHD_WebSocketStream *wss; -- struct MHD_WebSocketStream *wsc; -- int ret; -- char *buf1 = NULL, *buf2 = NULL; -- char *frame = NULL; -- size_t frame_len = 0; -- -- if (MHD_WEBSOCKET_STATUS_OK != MHD_websocket_stream_init2 (&wsc, -- MHD_WEBSOCKET_FLAG_CLIENT, -- 0, -- malloc, -- realloc, -- free, -- NULL, -- test_rng)) -- { -- fprintf (stderr, -- "No encode close tests possible due to failed stream init in line %u\n", -- (unsigned int) __LINE__); -- return 0x10; -- } -- if (MHD_WEBSOCKET_STATUS_OK != MHD_websocket_stream_init2 (&wss, -- MHD_WEBSOCKET_FLAG_SERVER, -- 0, -- malloc, -- realloc, -- free, -- NULL, -- test_rng)) -- { -- fprintf (stderr, -- "No encode close tests possible due to failed stream init in line %u\n", -- (unsigned int) __LINE__); -- if (NULL != wsc) -- MHD_websocket_stream_free (wsc); -- return 0x10; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Encoding -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Some data, we are server */ -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "blablabla", -- 9, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (13 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x88\x0B\x03\xE8" "blablabla", 13))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Some data, we are client */ -- ret = MHD_websocket_encode_close (wsc, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "blablabla", -- 9, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (17 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- "\x03\xE8" "blablabla", -- 11, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Regular test: Close reason without text, we are server */ -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (4 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x88\x02\x03\xE8", 4))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Close reason without text, we are client */ -- ret = MHD_websocket_encode_close (wsc, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (8 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- "\x03\xE8", -- 2, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Regular test: Close without reason, we are server */ -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_NO_REASON, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x88\x00", 2))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Close without reason, we are client */ -- ret = MHD_websocket_encode_close (wsc, -- MHD_WEBSOCKET_CLOSEREASON_NO_REASON, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (6 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Regular test: Close with UTF-8 sequence in reason, we are client */ -- ret = MHD_websocket_encode_close (wsc, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "bla" "\xC3\xA4" "blabla", -- 11, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (19 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- "\x03\xE8" "bla" "\xC3\xA4" "blabla", -- 13, -- MHD_WEBSOCKET_STATUS_CLOSE_FRAME, -- MHD_WEBSOCKET_VALIDITY_ONLY_VALID_FOR_CONTROL_FRAMES, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Edge test (success): Close reason with NUL characters, we are server */ -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_GOING_AWAY, -- "bla" "\0\0\0" "bla", -- 9, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (13 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x88\x0B\x03\xE9" "bla" "\0\0\0" "bla", 13))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: Some data with broken UTF-8, we are server */ -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "bla" "\xC3" "blabla", -- 10, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_UTF8_ENCODING_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Length checks -- ------------------------------------------------------------------------------ -- */ -- /* Edge test (success): Close frame without payload */ -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_NO_REASON, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x88\x00", 2))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Close frame only reason code */ -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (4 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x88\x02\x03\xE8", 4))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Close frame with 1 bytes of reason text */ -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "a", -- 1, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (5 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x88\x03\x03\xE8" "a", 5))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Close frame with 123 bytes of reason text */ -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456", -- 123, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (127 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x88\x7D\x03\xE8" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456", -- 127))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (fail): Close frame with 124 bytes of reason text*/ -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567", -- 124, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Wrong parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: `ws` not passed */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_close (NULL, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `payload` not passed, but `payload_len` != 0 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- NULL, -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: `payload` passed, but `payload_len` == 0 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "abc", -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (4 != frame_len) || -- (NULL == frame) || -- (((char *) (uintptr_t) 0xBAADF00D) == frame) || -- (0 != memcmp (frame, "\x88\x02\x03\xE8", 4))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `frame` not passed */ -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "abc", -- 3, -- NULL, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: `frame_len` not passed */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "abc", -- 3, -- &frame, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: no reason code passed, but reason text */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_close (wss, -- MHD_WEBSOCKET_CLOSEREASON_NO_REASON, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (fail): Invalid reason code */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_close (wss, -- 1, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (fail): Invalid reason code */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_close (wss, -- 999, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Custom reason code */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_close (wss, -- 2000, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (7 != frame_len) || -- (NULL == frame) || -- (((char *) (uintptr_t) 0xBAADF00D) == frame) || -- (0 != memcmp (frame, "\x88\x05\x07\xD0" "abc", 7))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- validity after temporary out-of-memory -- ------------------------------------------------------------------------------ -- */ -- { -- struct MHD_WebSocketStream *wsx; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&wsx, -- MHD_WEBSOCKET_FLAG_SERVER, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- /* Fail test: allocation while no memory available */ -- disable_alloc = 1; -- ret = MHD_websocket_encode_close (wsx, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_MEMORY_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsx, frame); -- frame = NULL; -- } -- /* Regular test: allocation while memory is available again */ -- disable_alloc = 0; -- ret = MHD_websocket_encode_close (wsx, -- MHD_WEBSOCKET_CLOSEREASON_REGULAR, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (7 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x88\x05\x03\xE8" "abc", 7))) -- { -- fprintf (stderr, -- "Encode close test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsx, frame); -- frame = NULL; -- } -- -- MHD_websocket_stream_free (wsx); -- } -- else -- { -- fprintf (stderr, -- "Couldn't perform memory test for close encoding in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- -- if (NULL != buf1) -- free (buf1); -- if (NULL != buf2) -- free (buf2); -- if (NULL != wsc) -- MHD_websocket_stream_free (wsc); -- if (NULL != wss) -- MHD_websocket_stream_free (wss); -- -- return failed != 0 ? 0x20 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_encode_ping()` -- */ --int --test_encodes_ping () --{ -- int failed = 0; -- struct MHD_WebSocketStream *wss; -- struct MHD_WebSocketStream *wsc; -- int ret; -- char *buf1 = NULL, *buf2 = NULL; -- char *frame = NULL; -- size_t frame_len = 0; -- -- if (MHD_WEBSOCKET_STATUS_OK != MHD_websocket_stream_init2 (&wsc, -- MHD_WEBSOCKET_FLAG_CLIENT, -- 0, -- malloc, -- realloc, -- free, -- NULL, -- test_rng)) -- { -- fprintf (stderr, -- "No encode ping tests possible due to failed stream init in line %u\n", -- (unsigned int) __LINE__); -- return 0x10; -- } -- if (MHD_WEBSOCKET_STATUS_OK != MHD_websocket_stream_init (&wss, -- MHD_WEBSOCKET_FLAG_SERVER, -- 0)) -- { -- fprintf (stderr, -- "No encode ping tests possible due to failed stream init in line %u\n", -- (unsigned int) __LINE__); -- if (NULL != wsc) -- MHD_websocket_stream_free (wsc); -- return 0x10; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Encoding -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Some data, we are server */ -- ret = MHD_websocket_encode_ping (wss, -- "blablabla", -- 9, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x89\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Some data, we are client */ -- ret = MHD_websocket_encode_ping (wsc, -- "blablabla", -- 9, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (15 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- "blablabla", -- 9, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Regular test: Ping without payload, we are server */ -- ret = MHD_websocket_encode_ping (wss, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x89\x00", 2))) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Ping without payload, we are client */ -- ret = MHD_websocket_encode_ping (wsc, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (6 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Regular test: Ping with something like UTF-8 sequence in payload, we are client */ -- ret = MHD_websocket_encode_ping (wsc, -- "bla" "\xC3\xA4" "blabla", -- 11, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (17 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- "bla" "\xC3\xA4" "blabla", -- 11, -- MHD_WEBSOCKET_STATUS_PING_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Edge test (success): Ping payload with NUL characters, we are server */ -- ret = MHD_websocket_encode_ping (wss, -- "bla" "\0\0\0" "bla", -- 9, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x89\x09" "bla" "\0\0\0" "bla", 11))) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Ping payload with with something which looks like broken UTF-8, we are server */ -- ret = MHD_websocket_encode_ping (wss, -- "bla" "\xC3" "blabla", -- 10, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (12 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x89\x0A" "bla" "\xC3" "blabla", 12))) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Length checks -- ------------------------------------------------------------------------------ -- */ -- /* Edge test (success): Ping frame without payload */ -- ret = MHD_websocket_encode_ping (wss, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x89\x00", 2))) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Ping frame with one byte of payload */ -- ret = MHD_websocket_encode_ping (wss, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x89\x00", 2))) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Ping frame with 125 bytes of payload */ -- ret = MHD_websocket_encode_ping (wss, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 125, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (127 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x89\x7D" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 127))) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (fail): Ping frame with 126 bytes of payload */ -- ret = MHD_websocket_encode_ping (wss, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", -- 126, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Wrong parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: `ws` not passed */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_ping (NULL, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `payload` not passed, but `payload_len` != 0 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_ping (wss, -- NULL, -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: `payload` passed, but `payload_len` == 0 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_ping (wss, -- "abc", -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (((char *) (uintptr_t) 0xBAADF00D) == frame) || -- (0 != memcmp (frame, "\x89\x00", 2))) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `frame` not passed */ -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_ping (wss, -- "abc", -- 3, -- NULL, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) ) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: `frame_len` not passed */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- ret = MHD_websocket_encode_ping (wss, -- "abc", -- 3, -- &frame, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- validity after temporary out-of-memory -- ------------------------------------------------------------------------------ -- */ -- { -- struct MHD_WebSocketStream *wsx; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&wsx, -- MHD_WEBSOCKET_FLAG_SERVER, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- /* Fail test: allocation while no memory available */ -- disable_alloc = 1; -- ret = MHD_websocket_encode_ping (wsx, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_MEMORY_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsx, frame); -- frame = NULL; -- } -- /* Regular test: allocation while memory is available again */ -- disable_alloc = 0; -- ret = MHD_websocket_encode_ping (wsx, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (5 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x89\x03" "abc", 5))) -- { -- fprintf (stderr, -- "Encode ping test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsx, frame); -- frame = NULL; -- } -- -- MHD_websocket_stream_free (wsx); -- } -- else -- { -- fprintf (stderr, -- "Couldn't perform memory test for ping encoding in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- -- if (NULL != buf1) -- free (buf1); -- if (NULL != buf2) -- free (buf2); -- if (NULL != wsc) -- MHD_websocket_stream_free (wsc); -- if (NULL != wss) -- MHD_websocket_stream_free (wss); -- -- return failed != 0 ? 0x40 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_encode_pong()` -- */ --int --test_encodes_pong () --{ -- int failed = 0; -- struct MHD_WebSocketStream *wss; -- struct MHD_WebSocketStream *wsc; -- int ret; -- char *buf1 = NULL, *buf2 = NULL; -- char *frame = NULL; -- size_t frame_len = 0; -- -- if (MHD_WEBSOCKET_STATUS_OK != MHD_websocket_stream_init2 (&wsc, -- MHD_WEBSOCKET_FLAG_CLIENT, -- 0, -- malloc, -- realloc, -- free, -- NULL, -- test_rng)) -- { -- fprintf (stderr, -- "No encode pong tests possible due to failed stream init in line %u\n", -- (unsigned int) __LINE__); -- return 0x10; -- } -- if (MHD_WEBSOCKET_STATUS_OK != MHD_websocket_stream_init (&wss, -- MHD_WEBSOCKET_FLAG_SERVER, -- 0)) -- { -- fprintf (stderr, -- "No encode pong tests possible due to failed stream init in line %u\n", -- (unsigned int) __LINE__); -- if (NULL != wsc) -- MHD_websocket_stream_free (wsc); -- return 0x10; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Encoding -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Some data, we are server */ -- ret = MHD_websocket_encode_pong (wss, -- "blablabla", -- 9, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x8A\x09" "blablabla", 11))) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Some data, we are client */ -- ret = MHD_websocket_encode_pong (wsc, -- "blablabla", -- 9, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (15 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- "blablabla", -- 9, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Regular test: Pong without payload, we are server */ -- ret = MHD_websocket_encode_pong (wss, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x8A\x00", 2))) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Pong without payload, we are client */ -- ret = MHD_websocket_encode_pong (wsc, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (6 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- NULL, -- 0, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Regular test: Pong with something like UTF-8 sequence in payload, we are client */ -- ret = MHD_websocket_encode_pong (wsc, -- "bla" "\xC3\xA4" "blabla", -- 11, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (17 != frame_len) || -- (NULL == frame) ) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- else -- { -- failed += test_decode_single (__LINE__, -- MHD_WEBSOCKET_FLAG_SERVER -- | MHD_WEBSOCKET_FLAG_NO_FRAGMENTS, -- 0, -- 1, -- 0, -- frame, -- frame_len, -- "bla" "\xC3\xA4" "blabla", -- 11, -- MHD_WEBSOCKET_STATUS_PONG_FRAME, -- MHD_WEBSOCKET_VALIDITY_VALID, -- frame_len); -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsc, frame); -- frame = NULL; -- } -- /* Edge test (success): Pong payload with NUL characters, we are server */ -- ret = MHD_websocket_encode_pong (wss, -- "bla" "\0\0\0" "bla", -- 9, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (11 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x8A\x09" "bla" "\0\0\0" "bla", 11))) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: Pong payload with with something which looks like broken UTF-8, we are server */ -- ret = MHD_websocket_encode_pong (wss, -- "bla" "\xC3" "blabla", -- 10, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (12 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x8A\x0A" "bla" "\xC3" "blabla", 12))) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Length checks -- ------------------------------------------------------------------------------ -- */ -- /* Edge test (success): Pong frame without payload */ -- ret = MHD_websocket_encode_pong (wss, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x8A\x00", 2))) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Pong frame with one byte of payload */ -- ret = MHD_websocket_encode_pong (wss, -- NULL, -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x8A\x00", 2))) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (success): Pong frame with 125 bytes of payload */ -- ret = MHD_websocket_encode_pong (wss, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 125, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (127 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x8A\x7D" -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678", -- 127))) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Edge test (fail): Pong frame with 126 bytes of payload */ -- ret = MHD_websocket_encode_pong (wss, -- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", -- 126, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_MAXIMUM_SIZE_EXCEEDED != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Wrong parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: `ws` not passed */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_pong (NULL, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `payload` not passed, but `payload_len` != 0 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_pong (wss, -- NULL, -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Regular test: `payload` passed, but `payload_len` == 0 */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_pong (wss, -- "abc", -- 0, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (2 != frame_len) || -- (NULL == frame) || -- (((char *) (uintptr_t) 0xBAADF00D) == frame) || -- (0 != memcmp (frame, "\x8A\x00", 2))) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- /* Fail test: `frame` not passed */ -- frame_len = 0x87654321; -- ret = MHD_websocket_encode_pong (wss, -- "abc", -- 3, -- NULL, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (0 != frame_len) ) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: `frame_len` not passed */ -- frame = (char *) (uintptr_t) 0xBAADF00D; -- ret = MHD_websocket_encode_pong (wss, -- "abc", -- 3, -- &frame, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (((char *) (uintptr_t) 0xBAADF00D) == frame) -- { -- frame = NULL; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wss, frame); -- frame = NULL; -- } -- -- /* -- ------------------------------------------------------------------------------ -- validity after temporary out-of-memory -- ------------------------------------------------------------------------------ -- */ -- { -- struct MHD_WebSocketStream *wsx; -- if (MHD_WEBSOCKET_STATUS_OK == MHD_websocket_stream_init2 (&wsx, -- MHD_WEBSOCKET_FLAG_SERVER, -- 0, -- test_malloc, -- test_realloc, -- test_free, -- NULL, -- NULL)) -- { -- /* Fail test: allocation while no memory available */ -- disable_alloc = 1; -- ret = MHD_websocket_encode_pong (wsx, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_MEMORY_ERROR != ret) || -- (0 != frame_len) || -- (NULL != frame) ) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsx, frame); -- frame = NULL; -- } -- /* Regular test: allocation while memory is available again */ -- disable_alloc = 0; -- ret = MHD_websocket_encode_pong (wsx, -- "abc", -- 3, -- &frame, -- &frame_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (5 != frame_len) || -- (NULL == frame) || -- (0 != memcmp (frame, "\x8A\x03" "abc", 5))) -- { -- fprintf (stderr, -- "Encode pong test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- if (NULL != frame) -- { -- MHD_websocket_free (wsx, frame); -- frame = NULL; -- } -- -- MHD_websocket_stream_free (wsx); -- } -- else -- { -- fprintf (stderr, -- "Couldn't perform memory test for pong encoding in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- } -- -- if (NULL != buf1) -- free (buf1); -- if (NULL != buf2) -- free (buf2); -- if (NULL != wsc) -- MHD_websocket_stream_free (wsc); -- if (NULL != wss) -- MHD_websocket_stream_free (wss); -- -- return failed != 0 ? 0x80 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_split_close_reason()` -- */ --int --test_split_close_reason () --{ -- int failed = 0; -- const char *payload; -- unsigned short reason_code; -- const char *reason_utf8; -- size_t reason_utf8_len; -- int ret; -- -- /* -- ------------------------------------------------------------------------------ -- Normal splits -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Reason code + Reason text */ -- reason_code = 9999; -- reason_utf8 = (const char *) (intptr_t) 0xBAADF00D; -- reason_utf8_len = 12345; -- payload = "\x03\xE8" "abc"; -- ret = MHD_websocket_split_close_reason (payload, -- 5, -- &reason_code, -- &reason_utf8, -- &reason_utf8_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (MHD_WEBSOCKET_CLOSEREASON_REGULAR != reason_code) || -- (3 != reason_utf8_len) || -- (payload + 2 != reason_utf8) ) -- { -- fprintf (stderr, -- "split close reason test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: Reason code */ -- reason_code = 9999; -- reason_utf8 = (const char *) (intptr_t) 0xBAADF00D; -- reason_utf8_len = 12345; -- payload = "\x03\xE8"; -- ret = MHD_websocket_split_close_reason (payload, -- 2, -- &reason_code, -- &reason_utf8, -- &reason_utf8_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (MHD_WEBSOCKET_CLOSEREASON_REGULAR != reason_code) || -- (0 != reason_utf8_len) || -- (NULL != reason_utf8) ) -- { -- fprintf (stderr, -- "split close reason test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: No payload */ -- reason_code = 9999; -- reason_utf8 = (const char *) (intptr_t) 0xBAADF00D; -- reason_utf8_len = 12345; -- payload = NULL; -- ret = MHD_websocket_split_close_reason (payload, -- 0, -- &reason_code, -- &reason_utf8, -- &reason_utf8_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (MHD_WEBSOCKET_CLOSEREASON_NO_REASON != reason_code) || -- (0 != reason_utf8_len) || -- (NULL != reason_utf8) ) -- { -- fprintf (stderr, -- "split close reason test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: `payload` is not NULL given, but `payload_len` == 0 */ -- reason_code = 9999; -- reason_utf8 = (const char *) (intptr_t) 0xBAADF00D; -- reason_utf8_len = 12345; -- payload = "abc"; -- ret = MHD_websocket_split_close_reason (payload, -- 0, -- &reason_code, -- &reason_utf8, -- &reason_utf8_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (MHD_WEBSOCKET_CLOSEREASON_NO_REASON != reason_code) || -- (0 != reason_utf8_len) || -- (NULL != reason_utf8) ) -- { -- fprintf (stderr, -- "split close reason test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Wrong parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: `payload` not passed, but `payload_len` != 0 */ -- reason_code = 9999; -- reason_utf8 = (const char *) (intptr_t) 0xBAADF00D; -- reason_utf8_len = 12345; -- payload = NULL; -- ret = MHD_websocket_split_close_reason (payload, -- 3, -- &reason_code, -- &reason_utf8, -- &reason_utf8_len); -- if ((MHD_WEBSOCKET_STATUS_PARAMETER_ERROR != ret) || -- (MHD_WEBSOCKET_CLOSEREASON_NO_REASON != reason_code) || -- (0 != reason_utf8_len) || -- (NULL != reason_utf8) ) -- { -- fprintf (stderr, -- "split close reason test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: `reason_code` not passed */ -- reason_utf8 = (const char *) (intptr_t) 0xBAADF00D; -- reason_utf8_len = 12345; -- payload = "\x03\xE8" "abc"; -- ret = MHD_websocket_split_close_reason (payload, -- 5, -- NULL, -- &reason_utf8, -- &reason_utf8_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (3 != reason_utf8_len) || -- (payload + 2 != reason_utf8) ) -- { -- fprintf (stderr, -- "split close reason test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: `reason_utf8` not passed */ -- reason_code = 9999; -- reason_utf8_len = 12345; -- payload = "\x03\xE8" "abc"; -- ret = MHD_websocket_split_close_reason (payload, -- 5, -- &reason_code, -- NULL, -- &reason_utf8_len); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (MHD_WEBSOCKET_CLOSEREASON_REGULAR != reason_code) || -- (3 != reason_utf8_len) ) -- { -- fprintf (stderr, -- "split close reason test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: `reason_utf8_len` not passed */ -- reason_code = 9999; -- reason_utf8 = (const char *) (intptr_t) 0xBAADF00D; -- payload = "\x03\xE8" "abc"; -- ret = MHD_websocket_split_close_reason (payload, -- 5, -- &reason_code, -- &reason_utf8, -- NULL); -- if ((MHD_WEBSOCKET_STATUS_OK != ret) || -- (MHD_WEBSOCKET_CLOSEREASON_REGULAR != reason_code) || -- (payload + 2 != reason_utf8) ) -- { -- fprintf (stderr, -- "split close reason test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: `reason_code`, `reason_utf8` and `reason_utf8_len` not passed */ -- /* (this is not prohibited, although it doesn't really make sense) */ -- payload = "\x03\xE8" "abc"; -- ret = MHD_websocket_split_close_reason (payload, -- 5, -- NULL, -- NULL, -- NULL); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "split close reason test failed in line %u\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- return failed != 0 ? 0x100 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_check_http_version()` -- */ --int --test_check_http_version () --{ -- int failed = 0; -- int ret; -- -- /* -- ------------------------------------------------------------------------------ -- Version check with valid HTTP version syntax -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: HTTP/1.1 */ -- ret = MHD_websocket_check_http_version ("HTTP/1.1"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: HTTP/1.2 */ -- ret = MHD_websocket_check_http_version ("HTTP/1.2"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: HTTP/1.10 */ -- ret = MHD_websocket_check_http_version ("HTTP/1.10"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: HTTP/2.0 */ -- ret = MHD_websocket_check_http_version ("HTTP/2.0"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: HTTP/3.0 */ -- ret = MHD_websocket_check_http_version ("HTTP/3.0"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: HTTP/1.0 */ -- ret = MHD_websocket_check_http_version ("HTTP/1.0"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: HTTP/0.9 */ -- ret = MHD_websocket_check_http_version ("HTTP/0.9"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Version check edge cases -- ------------------------------------------------------------------------------ -- */ -- /* Edge test (success): HTTP/123.45 */ -- ret = MHD_websocket_check_http_version ("HTTP/123.45"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): HTTP/1.45 */ -- ret = MHD_websocket_check_http_version ("HTTP/1.45"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): HTTP/01.1 */ -- ret = MHD_websocket_check_http_version ("HTTP/01.1"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): HTTP/0001.1 */ -- ret = MHD_websocket_check_http_version ("HTTP/0001.1"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): HTTP/1.01 */ -- ret = MHD_websocket_check_http_version ("HTTP/1.01"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): HTTP/1.0001 */ -- ret = MHD_websocket_check_http_version ("HTTP/1.0001"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): HTTP/0001.0001 */ -- ret = MHD_websocket_check_http_version ("HTTP/0001.0001"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): HTTP/2.000 */ -- ret = MHD_websocket_check_http_version ("HTTP/2.000"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): HTTP/0.0 */ -- ret = MHD_websocket_check_http_version ("HTTP/0.0"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): HTTP/00.0 */ -- ret = MHD_websocket_check_http_version ("HTTP/00.0"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): HTTP/00.0 */ -- ret = MHD_websocket_check_http_version ("HTTP/0.00"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Invalid version syntax -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: (empty string) */ -- ret = MHD_websocket_check_http_version (""); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: http/1.1 */ -- ret = MHD_websocket_check_http_version ("http/1.1"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: "HTTP / 1.1" */ -- ret = MHD_websocket_check_http_version ("HTTP / 1.1"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Missing parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: NULL as version */ -- ret = MHD_websocket_check_http_version (NULL); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_http_version test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- return failed != 0 ? 0x200 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_check_connection_header()` -- */ --int --test_check_connection_header () --{ -- int failed = 0; -- int ret; -- -- /* -- ------------------------------------------------------------------------------ -- Check with valid Connection header syntax -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: Upgrade */ -- ret = MHD_websocket_check_connection_header ("Upgrade"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Regular test: keep-alive, Upgrade */ -- ret = MHD_websocket_check_connection_header ("keep-alive, Upgrade"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: keep-alive */ -- ret = MHD_websocket_check_connection_header ("keep-alive"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: close */ -- ret = MHD_websocket_check_connection_header ("close"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Connection check edge cases -- ------------------------------------------------------------------------------ -- */ -- /* Edge test (success): keep-alive,Upgrade */ -- ret = MHD_websocket_check_connection_header ("keep-alive,Upgrade"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): Upgrade, keep-alive */ -- ret = MHD_websocket_check_connection_header ("Upgrade, keep-alive"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): Upgrade,keep-alive */ -- ret = MHD_websocket_check_connection_header ("Upgrade,keep-alive"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): Transfer-Encoding,Upgrade,keep-alive */ -- ret = MHD_websocket_check_connection_header ( -- "Transfer-Encoding,Upgrade,keep-alive"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): Transfer-Encoding , Upgrade , keep-alive */ -- ret = MHD_websocket_check_connection_header ( -- "Transfer-Encoding , Upgrade , keep-alive"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): upgrade */ -- ret = MHD_websocket_check_connection_header ("upgrade"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): UPGRADE */ -- ret = MHD_websocket_check_connection_header ("UPGRADE"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): All allowed token characters, then upgrade token */ -- ret = MHD_websocket_check_connection_header ( -- "!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,Upgrade"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): Different, allowed whitespaces */ -- ret = MHD_websocket_check_connection_header (" \tUpgrade \t"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): Different, disallowed whitespaces */ -- ret = MHD_websocket_check_connection_header ("\rUpgrade"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): Different, disallowed whitespaces */ -- ret = MHD_websocket_check_connection_header ("\nUpgrade"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): Different, disallowed whitespaces */ -- ret = MHD_websocket_check_connection_header ("\vUpgrade"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): Different, disallowed whitespaces */ -- ret = MHD_websocket_check_connection_header ("\fUpgrade"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Invalid header syntax -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: (empty string) */ -- ret = MHD_websocket_check_connection_header (""); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: (Disallowed) multiple word token with the term "Upgrade" in it */ -- ret = MHD_websocket_check_connection_header ("Upgrade or Downgrade"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: Invalid characters */ -- ret = MHD_websocket_check_connection_header ("\"Upgrade\""); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Missing parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: NULL as connection */ -- ret = MHD_websocket_check_connection_header (NULL); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_connection_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- return failed != 0 ? 0x400 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_check_upgrade_header()` -- */ --int --test_check_upgrade_header () --{ -- int failed = 0; -- int ret; -- -- /* -- ------------------------------------------------------------------------------ -- Check with valid Upgrade header syntax -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: websocket */ -- ret = MHD_websocket_check_upgrade_header ("websocket"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: HTTP/2.0 */ -- ret = MHD_websocket_check_upgrade_header ("HTTP/2.0"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Upgrade check edge cases -- ------------------------------------------------------------------------------ -- */ -- /* Edge test (success): websocket,HTTP/2.0 */ -- ret = MHD_websocket_check_upgrade_header ("websocket,HTTP/2.0"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): websocket ,HTTP/2.0 */ -- ret = MHD_websocket_check_upgrade_header (" websocket ,HTTP/2.0"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): HTTP/2.0, websocket */ -- ret = MHD_websocket_check_upgrade_header ("HTTP/2.0, websocket "); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): websocket/13 */ -- ret = MHD_websocket_check_upgrade_header ("websocket/13"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): WeBsOcKeT */ -- ret = MHD_websocket_check_upgrade_header ("WeBsOcKeT"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): WEBSOCKET */ -- ret = MHD_websocket_check_upgrade_header ("WEBSOCKET"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): All allowed token characters plus /, then websocket keyword */ -- ret = MHD_websocket_check_upgrade_header ( -- "!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/,websocket"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (success): Different, allowed whitespaces */ -- ret = MHD_websocket_check_upgrade_header (" \twebsocket \t"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): Different, disallowed whitespaces */ -- ret = MHD_websocket_check_upgrade_header ("\rwebsocket"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): Different, disallowed whitespaces */ -- ret = MHD_websocket_check_upgrade_header ("\nwebsocket"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): Different, disallowed whitespaces */ -- ret = MHD_websocket_check_upgrade_header ("\vwebsocket"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): Different, disallowed whitespaces */ -- ret = MHD_websocket_check_upgrade_header ("\fwebsocket"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Invalid header syntax -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: (empty string) */ -- ret = MHD_websocket_check_upgrade_header (""); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: (Disallowed) multiple word token with the term "websocket" in it */ -- ret = MHD_websocket_check_upgrade_header ("websocket or something"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: Invalid characters */ -- ret = MHD_websocket_check_upgrade_header ("\"websocket\""); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Missing parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: NULL as upgrade */ -- ret = MHD_websocket_check_upgrade_header (NULL); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_upgrade_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- return failed != 0 ? 0x800 : 0x00; --} -- -- --/** -- * Test procedure for `MHD_websocket_check_version_header()` -- */ --int --test_check_version_header () --{ -- int failed = 0; -- int ret; -- -- /* -- ------------------------------------------------------------------------------ -- Check with valid Upgrade header syntax -- ------------------------------------------------------------------------------ -- */ -- /* Regular test: 13 */ -- ret = MHD_websocket_check_version_header ("13"); -- if (MHD_WEBSOCKET_STATUS_OK != ret) -- { -- fprintf (stderr, -- "check_version_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Version check edge cases -- ------------------------------------------------------------------------------ -- */ -- /* Edge test (fail): 14 */ -- ret = MHD_websocket_check_version_header ("14"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_version_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): 12 */ -- ret = MHD_websocket_check_version_header ("12"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_version_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): 0 */ -- ret = MHD_websocket_check_version_header ("1"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_version_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): 1 */ -- ret = MHD_websocket_check_version_header ("1"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_version_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): 130 */ -- ret = MHD_websocket_check_version_header ("130"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_version_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Edge test (fail): " 13" */ -- ret = MHD_websocket_check_version_header (" 13"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_version_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Invalid header syntax -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: (empty string) */ -- ret = MHD_websocket_check_version_header (""); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_version_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- /* Fail test: Invalid characters */ -- ret = MHD_websocket_check_version_header ("abc"); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_version_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- /* -- ------------------------------------------------------------------------------ -- Missing parameters -- ------------------------------------------------------------------------------ -- */ -- /* Fail test: NULL as version */ -- ret = MHD_websocket_check_version_header (NULL); -- if (MHD_WEBSOCKET_STATUS_NO_WEBSOCKET_HANDSHAKE_HEADER != ret) -- { -- fprintf (stderr, -- "check_version_header test failed in line %u.\n", -- (unsigned int) __LINE__); -- ++failed; -- } -- -- return failed != 0 ? 0x1000 : 0x00; --} -- -- --int --main (int argc, char *const *argv) --{ -- unsigned int errorCount = 0; -- (void) argc; (void) argv; /* Unused. Silent compiler warning. */ -- -- /* seed random number generator */ -- srand ((unsigned long) time (NULL)); -- -- /* perform tests */ -- errorCount += test_inits (); -- errorCount += test_accept (); -- errorCount += test_decodes (); -- errorCount += test_encodes_text (); -- errorCount += test_encodes_binary (); -- errorCount += test_encodes_close (); -- errorCount += test_encodes_ping (); -- errorCount += test_encodes_pong (); -- errorCount += test_split_close_reason (); -- errorCount += test_check_http_version (); -- errorCount += test_check_connection_header (); -- errorCount += test_check_upgrade_header (); -- errorCount += test_check_version_header (); -- -- /* output result */ -- if (errorCount != 0) -- fprintf (stderr, "Error (code: %u)\n", errorCount); -- -- return errorCount != 0; /* 0 == pass */ --} --- -2.34.1 - diff --git a/meta/recipes-support/libmicrohttpd/libmicrohttpd_1.0.2.bb b/meta/recipes-support/libmicrohttpd/libmicrohttpd_1.0.5.bb similarity index 78% rename from meta/recipes-support/libmicrohttpd/libmicrohttpd_1.0.2.bb rename to meta/recipes-support/libmicrohttpd/libmicrohttpd_1.0.5.bb index fdca510d0b..cca3496a19 100644 --- a/meta/recipes-support/libmicrohttpd/libmicrohttpd_1.0.2.bb +++ b/meta/recipes-support/libmicrohttpd/libmicrohttpd_1.0.5.bb @@ -6,9 +6,8 @@ SECTION = "net" DEPENDS = "file" -SRC_URI = "${GNU_MIRROR}/libmicrohttpd/${BPN}-${PV}.tar.gz \ - file://0001-Remove-broken-experimental-code.patch" -SRC_URI[sha256sum] = "df324fcd0834175dab07483133902d9774a605bfa298025f69883288fd20a8c7" +SRC_URI = "${GNU_MIRROR}/libmicrohttpd/${BPN}-${PV}.tar.gz" +SRC_URI[sha256sum] = "b46d00f58efa6f497b97d2e782c4ee66301d412ddd855dd3068518b3a2cd3ea2" inherit autotools lib_package pkgconfig gettext