7.0 refactor

This commit is contained in:
cpq
2020-12-05 11:26:32 +00:00
parent 34d4fb8cf0
commit f2fba1d200
838 changed files with 14236 additions and 255316 deletions
-118
View File
@@ -1,118 +0,0 @@
# vim: ts=8 noet sw=8 ai cin smarttab
PROG = unit_test
MONGOOSE_DIR = ..
TEST_SOURCES = unit_test.c test_util.c test_main.c fuzz.c
AMALGAMATED_SOURCES = ../mongoose.c
KRYPTON_PATH = $(REPO_ROOT)/krypton
VPATH = $(MONGOOSE_DIR)
# or Krypton, or mbedTLS
SSL ?= OpenSSL
COMMON_FEATURE_FLAGS = \
-DKR_MODULE_LINES \
-DMG_ENABLE_COAP \
-DMG_ENABLE_DNS_SERVER \
-DMG_ENABLE_HTTP_SSI_EXEC \
-DMG_ENABLE_HTTP_WEBDAV \
-DMG_ENABLE_MQTT_BROKER \
-DMG_ENABLE_SOCKS \
-DMG_ENABLE_SYNC_RESOLVER \
-DMG_ENABLE_THREADS \
-DMG_DISABLE_DAV_AUTH \
-DMG_INTERNAL="" \
-DMG_MODULE_LINES \
-DMG_CALLOC=test_calloc \
-DMG_MALLOC=test_malloc \
-DMG_ENABLE_POLL_UNTIL \
-DMG_ENABLE_SNTP -DMG_SNTP_NO_DELAY_CORRECTION \
-DMG_ENABLE_HTTP_STREAMING_MULTIPART
UNIX_FEATURE_FLAGS=-DMG_ENABLE_IPV6 -DMG_ENABLE_SSL
# TODO: remove -Wno-deprecated-declarations once deprecated
# `mg_http_parse_header()` is removed from mongoose.
CFLAGS = -W -Wall -Wundef -Werror -Wno-deprecated-declarations -g -O0 -Wno-multichar -D__USE_MISC \
$(COMMON_FEATURE_FLAGS) $(UNIX_FEATURE_FLAGS) \
-I$(MONGOOSE_DIR) -I../src \
-include unit_test.h -pthread $(CFLAGS_EXTRA)
LDFLAGS = -lm
ifeq "$(SSL)" "OpenSSL"
# OpenSSL is the default
LDFLAGS += -lcrypto -lssl
endif
ifeq "$(SSL)" "Krypton"
CFLAGS += $(KRYPTON_PATH)/krypton.c -I$(KRYPTON_PATH)
endif
ifeq "$(SSL)" "mbedTLS"
CFLAGS += -DMG_SSL_IF=MG_SSL_IF_MBEDTLS -DMG_SSL_MBED_DUMMY_RANDOM
LDFLAGS += -lmbedcrypto -lmbedtls -lmbedx509
endif
include test.mk
# http://crossgcc.rts-software.org/doku.php?id=compiling_for_win32
MINGW_GCC=/usr/local/gcc-4.8.0-qt-4.8.4-for-mingw32/win32-gcc/bin/i586-mingw32-gcc
.PHONY: $(PROG).exe $(PROG)_mingw.exe
$(PROG)_mingw.exe: Makefile
$(MINGW_GCC) $(AMALGAMATED_SOURCES) -o $(PROG)_mingw.exe -W -Wall -Werror
$(PROG).exe: $(AMALGAMATED_SOURCES) data/cgi/index.cgi.exe test_sources_resolved
ifndef VC6_DIR
$(error Please set VC6_DIR)
endif
Include=$(VC6_DIR)/include Lib=$(VC6_DIR)/lib \
wine $(VC6_DIR)/bin/cl \
$(TEST_SOURCES_RESOLVED) $(AMALGAMATED_SOURCES) \
/MD /I. /I.. /Zi \
/FIunit_test.h \
/I$(REPO_ROOT) \
$(COMMON_FEATURE_FLAGS) $(CFLAGS_EXTRA) \
-DMG_ENABLE_SSL $(KRYPTON_PATH)/krypton.c -I$(KRYPTON_PATH) \
kernel32.lib advapi32.lib \
/Fe$@
cp data/cgi/index.cgi.exe data/cgi/index.cgi
win: $(PROG).exe
wine $(PROG).exe $(TEST_FILTER)
# CGI test program.
$(PROG)-%: data/cgi/index.cgi
data/cgi/index.cgi: index_cgi.c ccgi-1.2/ccgi.c
@echo -e "CC\tindex.cgi"
@mkdir -p data/cgi
@$(CC) -Wall -Werror -o $@ $^ -Iccgi-1.2
data/cgi/index.cgi.exe: index_cgi.c ccgi-1.2/ccgi.c
@echo -e "CC\tindex.cgi.exe"
@mkdir -p data/cgi
Include=$(VC6_DIR)/include Lib=$(VC6_DIR)/lib \
wine $(VC6_DIR)/bin/cl \
/MD /Iccgi-1.2 /Zi index_cgi.c ccgi-1.2/ccgi.c /Fe$@
clean: clean_index_cgi
clean_index_cgi:
@echo -e "CLEAN\tindex.cgi"
@rm -f data/cgi/index.cgi*
fuzz:
$(CC) fuzz.c ../mongoose.c -o /tmp/$@ -fsanitize=fuzzer,address -g -I..
/tmp/$@
# Interactive:
# docker run -v $(CURDIR)/../..:/cesanta -t -i --entrypoint=/bin/bash cesanta/mongoose_test
docker:
docker run --rm -v $(CURDIR)/../..:/cesanta cesanta/mongoose_test
amalgam:
cd .. && tools/amalgam.py --prefix=MG --public-header=mongoose.h --license=LICENSE `cat src/mongoose.c.manifest` > mongoose.c
cd .. && tools/amalgam.py --prefix=MG --license=LICENSE `cat src/mongoose.h.manifest` > mongoose.h
-1
View File
@@ -1 +0,0 @@
DisableFormat: true
-28
View File
@@ -1,28 +0,0 @@
Changes for C CGI Library
1.0
Initial Release
1.1
Added hexadecimal encoding: CGI_encode_hex() CGI_decode_hex()
Added simple cryptography: CGI_encrypt() CGI_decrypt()
Added SCGI server: CGI_prefork_server()
Modified CGI_decode_query() to parse query strings less
strictly.
1.2
Switched to the GNU Lesser General Public License
Fixed a bug when testing CONTENT_TYPE for
application/x-www-form-urlencoded. Changed strcasecmp()
to strncasecmp().
Changed t/test.c to terminate variable length argument
list passed to CGI_encode_query() with (char *)0. Type
cast needed for 64 bit platforms.
Changed doc.html to document that CGI_encode_query()
argument list must end with (char *)0.
-502
View File
@@ -1,502 +0,0 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
-27
View File
@@ -1,27 +0,0 @@
# Set OPENSSL_INCLUDE to the directory that contains the
# "openssl" include directory.
OPENSSL_INCLUDE = /usr/include
# To build without openssl comment out the "CRYPT =" line
CRYPT = crypt.o
CFLAGS = -I . -I $(OPENSSL_INCLUDE)
libccgi.a: ccgi.o prefork.o $(CRYPT)
ar r libccgi.a ccgi.o prefork.o $(CRYPT)
ranlib libccgi.a
ccgi.o: ccgi.c ccgi.h
prefork.o: prefork.c
crypt.o: crypt.c ccgi.h
test: libccgi.a
cd t; make
clean:
rm -f *.o *.a */*.o
rm -f t/test examples/dump.cgi
-11
View File
@@ -1,11 +0,0 @@
You may need to edit Makefile and t/Makefile to specify where
your openssl include files and libraries are located. To build
without openssl see the comments in Makefile.
To build: make
To test: make test (requires openssl)
To install:
copy libccgi.a to a lib directory such as /usr/local/lib
copy ccgi.h to an include directory such as /usr/local/include
-1329
View File
File diff suppressed because it is too large Load Diff
-64
View File
@@ -1,64 +0,0 @@
/*
* C CGI Library version 1.2
*
* Copyright 2015 Stephen C. Losen. Distributed under the terms
* of the GNU Lesser General Public License (LGPL 2.1)
*/
#ifndef _CCGI_H
#define _CCGI_H
typedef struct CGI_varlist CGI_varlist;
typedef const char * const CGI_value;
char *CGI_decode_url(const char *p);
char *CGI_encode_url(const char *p, const char *keep);
char *CGI_encode_entity(const char *p);
char *CGI_encode_base64(const void *p, int len);
void *CGI_decode_base64(const char *p, int *len);
char *CGI_encode_hex(const void *p, int len);
void *CGI_decode_hex(const char *p, int *len);
char *CGI_encrypt(const void *p, int len, const char *password);
void *CGI_decrypt(const char *p, int *len, const char *password);
char *CGI_encode_query(const char *keep, ...);
char *CGI_encode_varlist(CGI_varlist *v, const char *keep);
CGI_varlist *CGI_decode_query(CGI_varlist *v, const char *query);
CGI_varlist *CGI_get_cookie(CGI_varlist *v);
CGI_varlist *CGI_get_query(CGI_varlist *v);
CGI_varlist *CGI_get_post(CGI_varlist *v, const char *template);
CGI_varlist *CGI_get_all(const char *template);
CGI_varlist *CGI_add_var(CGI_varlist *v, const char *varname,
const char *value);
void CGI_free_varlist(CGI_varlist *v);
CGI_value *CGI_lookup_all(CGI_varlist *v, const char *varname);
const char *CGI_lookup(CGI_varlist *v, const char *varname);
const char *CGI_first_name(CGI_varlist *v);
const char *CGI_next_name(CGI_varlist *v);
void CGI_prefork_server(const char *host, int port, const char *pidfile,
int maxproc, int minidle, int maxidle, int maxreq,
void (*callback)(void));
#endif
-170
View File
@@ -1,170 +0,0 @@
/*
* C CGI Library version 1.2
*
* Author: Stephen C. Losen, University of Virginia
*
* Copyright 2015 Stephen C. Losen. Distributed under the terms
* of the GNU Lesser General Public License (LGPL 2.1)
*
* CGI_encrypt() converts arbitrary input data to a secure,
* encrypted string, using a password provided by the user.
* CGI_decrypt() reverses the process and returns the original
* data. The secure string includes a message digest for
* verifying the data.
*/
#include <sys/time.h>
#include <unistd.h>
#include <string.h>
#include <openssl/rand.h>
#include <openssl/evp.h>
#include <ccgi.h>
#define SALT_SIZE 8
#define DIGEST_SIZE 20
/*
* init_salt() places 8 random bytes into salt with RAND_bytes()
* or else uses SHA1 digest of current time and process ID
*/
static void
init_salt(unsigned char *salt) {
EVP_MD_CTX ctx;
unsigned char md[DIGEST_SIZE];
struct timeval tv;
pid_t pid;
unsigned int rlen;
if (RAND_bytes(salt, SALT_SIZE) == 1) {
return;
}
gettimeofday(&tv, 0);
pid = getpid();
EVP_DigestInit(&ctx, EVP_sha1());
EVP_DigestUpdate(&ctx, &tv, sizeof(tv));
EVP_DigestUpdate(&ctx, &pid, sizeof(pid));
EVP_DigestFinal(&ctx, md, &rlen);
memcpy(salt, md, SALT_SIZE);
}
/*
* digest() feeds input p of length len, the password and
* the salt to SHA1 and returns the digest in md.
*/
static void
digest(const void *p, int len, const char *password,
const unsigned char *salt, unsigned char *md)
{
EVP_MD_CTX ctx;
unsigned int rlen;
EVP_DigestInit(&ctx, EVP_sha1());
EVP_DigestUpdate(&ctx, salt, SALT_SIZE);
EVP_DigestUpdate(&ctx, password, strlen(password));
EVP_DigestUpdate(&ctx, p, len);
EVP_DigestFinal(&ctx, md, &rlen);
}
/*
* CGI_encrypt() returns an encrypted base64 string using input p
* of length len and the password. We generate a random 8 byte
* salt. We compute a SHA1 message digest using p, the password,
* and the salt. We generate a cipher key using the password and
* salt. We encrypt the digest and input with the AES-256-CBC cipher
* and key. We base64 encode the return string, which consists of
* the unencrypted salt, encrypted digest and encrypted input.
*/
char *
CGI_encrypt(const void *p, int len, const char *password) {
EVP_CIPHER_CTX ctx;
unsigned char md[DIGEST_SIZE];
unsigned char iv[EVP_MAX_IV_LENGTH];
unsigned char key[EVP_MAX_KEY_LENGTH];
unsigned char *out;
char *b64;
int offset, rlen;
if (p == 0 || len <= 0 || password == 0 || *password == 0) {
return 0;
}
out = malloc(SALT_SIZE + DIGEST_SIZE + len + EVP_MAX_BLOCK_LENGTH);
init_salt(out);
digest(p, len, password, out, md);
EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), out,
(unsigned char *) password, strlen(password), 1, key, iv);
EVP_EncryptInit(&ctx, EVP_aes_256_cbc(), key, iv);
offset = SALT_SIZE;
EVP_EncryptUpdate(&ctx, out + offset, &rlen, md, DIGEST_SIZE);
offset += rlen;
EVP_EncryptUpdate(&ctx, out + offset, &rlen, p, len);
offset += rlen;
EVP_EncryptFinal(&ctx, out + offset, &rlen);
b64 = CGI_encode_base64(out, offset + rlen);
free(out);
return b64;
}
/*
* CGI_decrypt() returns a pointer to data decrypted from
* base64 string p and the password. p was previously encrypted
* with CGI_encrypt(). We base64 decode p and the first 8 bytes
* is the salt followed by the encrypted message digest and
* encrypted data. We generate the cipher key using the salt
* and the password. We decrypt the message digest and data
* using the AES-256-CBC cipher and key. We re-compute the
* message digest using the decrypted data, password, and salt.
* If the two digests match then we return a pointer to the data
* and place its length in *len. Otherwise we return null.
*/
void *
CGI_decrypt(const char *p, int *len, const char *password) {
EVP_CIPHER_CTX ctx;
unsigned char md[DIGEST_SIZE];
unsigned char iv[EVP_MAX_IV_LENGTH];
unsigned char key[EVP_MAX_KEY_LENGTH];
unsigned char *ret, *out;
int offset, rlen = 0;
if (p == 0 || *p == 0 || password == 0 || *password == 0) {
return 0;
}
ret = CGI_decode_base64(p, &rlen);
if (rlen <= DIGEST_SIZE + SALT_SIZE) {
free(ret);
return 0;
}
out = malloc(rlen + EVP_MAX_BLOCK_LENGTH);
EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), ret,
(unsigned char *) password, strlen(password), 1, key, iv);
EVP_DecryptInit(&ctx, EVP_aes_256_cbc(), key, iv);
EVP_DecryptUpdate(&ctx, out, &offset, ret + SALT_SIZE,
rlen - SALT_SIZE);
EVP_DecryptFinal(&ctx, out + offset, &rlen);
rlen += offset - DIGEST_SIZE;
/*
* The salt is in ret, the decrypted digest and decrypted
* data are in out, and the data length is rlen.
*/
if (rlen > 0) {
digest(out + DIGEST_SIZE, rlen, password, ret, md);
}
if (rlen > 0 && memcmp(out, md, DIGEST_SIZE) == 0) {
memcpy(ret, out + DIGEST_SIZE, rlen);
ret[rlen] = 0;
if (len != 0) {
*len = rlen;
}
}
else {
free(ret);
ret = 0;
}
free(out);
return ret;
}
-921
View File
@@ -1,921 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Linux/x86 (vers 14 June 2007), see www.w3.org" />
<title>C CGI Library 1.2</title>
<style type="text/css">
/*<![CDATA[*/
pre {
font-family:courier;
background-color:#FFFFCC;
}
dd, li {
margin-top: 0.5em;
}
dt {
margin-top: 1em;
}
/*]]>*/
</style>
</head>
<body style="width:100ex;margin-left:3em">
<h1 style="text-align:center">C CGI Library 1.2</h1>
<h2>Contents</h2>
<ul>
<li><a href="#intro">Introduction</a></li>
<li><a href="#types">C CGI Library Data Types</a></li>
<li><a href="#func">C CGI Library Functions</a></li>
<li><a href="#using">Using the C CGI Library</a></li>
<li><a href="#upload">Uploading Files</a></li>
<li><a href="#crypto">Simple Cryptography Support</a></li>
<li><a href="#prefork">Pre Forking SCGI Server</a></li>
</ul>
<h2><a name="intro" id="intro"></a>Introduction</h2>
<p><i>C CGI</i> is a C language library for decoding, storing,
and retrieving CGI data passed by the web server via the CGI
interface. The library also has several handy data conversion
functions.</p>
<p>Author: Stephen C. Losen, University of Virginia</p>
<h3>C CGI Library Features</h3>
<ul>
<li>Decodes and stores CGI variables in <a href=
"#query">application/x-www-form-urlencoded</a> format, which
may come from the <i>QUERY_STRING</i> environment variable or
from standard input.</li>
<li>Decodes and stores CGI variables in
<i>multipart/form-data</i> format from standard input.</li>
<li>Handles <a href="#upload">file uploads</a>.</li>
<li>Parses and stores HTTP <i>cookies</i> from the
<i>HTTP_COOKIE</i> environment variable.</li>
<li>Stores CGI data in lookup tables, which can be accessed
directly by variable name, or accessed iteratively.</li>
<li>Allows strings to be stored in lookup tables.</li>
<li>Encodes/decodes strings in <a href=
"#query">application/x-www-form-urlencoded</a> format.</li>
<li>Encodes/decodes data in base64 format.</li>
<li>Encodes/decodes data in hexadecimal format.</li>
<li>Encodes text strings using HTML entity encodings such as
<b>&amp;lt;</b> and <b>&amp;amp;</b>.</li>
<li>Provides <i>openssl</i> <a href="#crypto">cryptography</a>
to encrypt/decrypt and verify data.</li>
<li>Provides a <a href="#prefork">pre forking SCGI
server</a>.</li>
</ul>
<h3><a name="query" id="query"></a>Query Strings and URL
Encoding</h3>
<p>A <i>query string</i> is a list of CGI variable names and
values in <i>application/x-www-form-urlencoded</i> format, which
looks like this:
<b>name1=value1&amp;name2=value2&amp;name3=value3</b>&nbsp;...
Each name and value is <i>URL encoded</i> as follows. Letters and
digits are not changed. Each <i>space</i> is converted to
<b>+</b>. Most other characters become <b>%xx</b> (percent
followed by two hexadecimal digits) where <i>xx</i> is the
numeric code of the character. For example, <b>Help&nbsp;Me!</b>
is URL encoded as <b>Help+Me%21</b>. Note that in a query string
the <b>=</b> and <b>&amp;</b> characters <b>between</b> names and
values are <b>not</b> URL encoded. However, if a name or value
itself contains a <b>=</b> or <b>&amp;</b>, then it is URL
encoded using <b>%xx</b>.</p>
<p>When decoding query strings, the C CGI Library is tolerant of
lax <b>%xx</b> encoding. It accepts most literal punctuation
characters except for <b>+</b> and <b>&amp;</b>, which must be
encoded. It accepts literal <b>=</b> in variable values and it
accepts literal <b>%</b> when not followed by two hexadecimal
digits. For example, <b>var=20%=1/5</b> is treated like
<b>var=20%25%3D1%2F5</b> and sets the value of <i>var</i> to
<b>20%=1/5</b>. A string that is not followed by <b>=</b> is a
variable name whose value is <b>""</b>, a zero length string. For
example, <b>str1&amp;str2&amp;</b>&nbsp;... is the same as
<b>str1=&amp;str2=&amp;</b>&nbsp;..., where <i>str1</i> and
<i>str2</i> are variable names whose value is <b>""</b>.</p>
<h3>CGI Data Representation and Conversion</h3>
<p>For simplicity and ease of use, most C CGI Library functions
accept and/or return null terminated strings. You can easily
convert a string to a numeric data type with the standard C
library functions <i>atoi()</i>, <i>atof()</i>, <i>strtol()</i>,
<i>strtod()</i>, etc. And you can convert a numeric data type to
a string with <i>sprintf()</i>.</p>
<p>Unfortunately, null terminated strings are not suitable for
storing raw binary data, because a null byte in the data is
mistaken for the string terminator. URL encoded strings
containing <b>%00</b> do not decode correctly because <b>%00</b>
results in a null byte. You can still manipulate binary data if
you encode it beforehand, and the C CGI library has functions for
encoding/decoding <a href="#CGI_encode_base64">base64</a> and
<a href="#CGI_encode_hex">hexadecimal</a>.</p>
<h2><a name="types" id="types"></a>C CGI Library Data Types</h2>
<p>In your C source you include the <i>ccgi.h</i> header file,
which declares these data types.</p>
<dl>
<dt>CGI_varlist</dt>
<dd>is a list (lookup table) of CGI variables and/or cookies.
Each list entry is a name and one or more values, where names
and values are all null terminated strings. A name may have
multiple values because 1) some HTML form elements, such as
<i>checkboxes</i> and <i>selections</i> allow the user to
choose multiple values and 2) the same name can be given to
multiple form input elements. A CGI_varlist lists variable
names and values in the same order that they are stored. In
practice this ends up being the order of the input tags in the
HTML form, but there is no requirement that browsers must
preserve this ordering.</dd>
<dt>CGI_value</dt>
<dd>is a read only pointer to a read only null terminated
string (<i>const char * const</i>). The <a href=
"#CGI_lookup_all">CGI_lookup_all()</a> function returns a null
terminated array of these pointers.</dd>
</dl>
<h2><a name="func" id="func"></a>C CGI Library Functions</h2>
<p>The C CGI library provides these functions.</p>
<ul>
<li><a href="#CGI_get_query">CGI_get_query()</a> decodes CGI
variables from the <i>QUERY_STRING</i> environment variable and
adds them to a CGI_varlist.</li>
<li><a href="#CGI_get_post">CGI_get_post()</a> decodes CGI
variables from standard input and adds them to a
CGI_varlist.</li>
<li><a href="#CGI_get_cookie">CGI_get_cookie()</a> parses
cookies from the <i>HTTP_COOKIE</i> environment variable and
adds them to a CGI_varlist.</li>
<li><a href="#CGI_get_all">CGI_get_all()</a> decodes all CGI
variables and cookies and returns them in a CGI_varlist.</li>
<li><a href="#CGI_decode_query">CGI_decode_query()</a> decodes
CGI variables in a null terminated <a href="#query">query
string</a> and adds them to a CGI_varlist.</li>
<li><a href="#CGI_add_var">CGI_add_var()</a> adds a variable
name and value to a CGI_varlist.</li>
<li><a href="#CGI_lookup_all">CGI_lookup_all()</a> looks up a
name in a CGI_varlist and returns all of its values in an
array.</li>
<li><a href="#CGI_lookup">CGI_lookup()</a> looks up a name in a
CGI_varlist and returns its first (or only) value.</li>
<li><a href="#CGI_first_name">CGI_first_name()</a> returns the
first name in a CGI_varlist.</li>
<li><a href="#CGI_next_name">CGI_next_name()</a> returns the
next name in a CGI_varlist.</li>
<li><a href="#CGI_free_varlist">CGI_free_varlist()</a> frees
memory used by a CGI_varlist.</li>
<li><a href="#CGI_encode_query">CGI_encode_query()</a> URL
encodes a list of strings into a <a href="#query">query
string</a>.</li>
<li><a href="#CGI_encode_varlist">CGI_encode_varlist()</a> URL
encodes a CGI_varlist into a <a href="#query">query
string</a>.</li>
<li><a href="#CGI_encrypt">CGI_encrypt()</a> encrypts data
bytes into a secure string.</li>
<li><a href="#CGI_decrypt">CGI_decrypt()</a> decrypts a secure
string and verifies the contents.</li>
<li><a href="#CGI_decode_url">CGI_decode_url()</a> decodes a
URL encoded string.</li>
<li><a href="#CGI_encode_url">CGI_encode_url()</a> URL encodes
a string.</li>
<li><a href="#CGI_encode_entity">CGI_encode_entity()</a> HTML
entity encodes a string.</li>
<li><a href="#CGI_encode_base64">CGI_encode_base64()</a> base64
encodes data bytes.</li>
<li><a href="#CGI_decode_base64">CGI_decode_base64()</a>
decodes a base64 encoded string.</li>
<li><a href="#CGI_encode_hex">CGI_encode_hex()</a> hexadecimal
encodes data bytes.</li>
<li><a href="#CGI_decode_hex">CGI_decode_hex()</a> decodes a
hexadecimal encoded string.</li>
<li><a href="#CGI_prefork_server">CGI_prefork_server()</a>
implements a pre forking SCGI server.</li>
</ul>
<p>Except for <i>CGI_prefork_server()</i>, the C CGI library
functions are reentrant because they do not modify any global
variables or use any static local variables, so you can use these
functions with threads.</p>
<p>Some functions accept null terminated string parameters of
type <i>const&nbsp;char&nbsp;*</i>. These functions make copies
of strings as necessary so that after the function returns you
can safely do anything you want with any string that you have
passed as a parameter. Some functions return null terminated
strings of type <i>const&nbsp;char&nbsp;*</i> and you should not
modify these strings.</p>
<dl>
<dt><a name="CGI_get_query" id="CGI_get_query"></a> CGI_varlist
*CGI_get_query (CGI_varlist *varlist);</dt>
<dd><i>CGI_get_query()</i> decodes CGI variables in the
<i>QUERY_STRING</i> environment variable and adds them to
variable list <i>varlist</i>. <i>QUERY_STRING</i> is presumed
to be in <a href="#query">application/x-www-form-urlencoded</a>
format. If <i>varlist</i> is null then a new variable list is
created and returned, otherwise <i>varlist</i> is returned.
Null is returned if <i>varlist</i> is null and
<i>QUERY_STRING</i> does not exist or contains no CGI
variables.</dd>
<dt><a name="CGI_get_post" id="CGI_get_post"></a> CGI_varlist
*CGI_get_post(CGI_varlist *varlist, const char *template);</dt>
<dd><i>CGI_get_post()</i> reads and decodes CGI variables from
standard input and adds them to variable list <i>varlist</i>.
If <i>varlist</i> is null then a new variable list is created
and returned, otherwise <i>varlist</i> is returned. Null is
returned if <i>varlist</i> is null and standard input is empty
or contains no CGI variables. The <i>template</i> parameter
(which may be null) is a file name template string that is
passed to the standard C library function <i>mkstemp()</i> when
uploading a file. (See the <a href="#upload">file upload</a>
section for more information.) <i>CGI_get_post()</i> checks the
<i>CONTENT_TYPE</i> environment variable to get the data
encoding, which is either <a href=
"#query">application/x-www-form-urlencoded</a> or
<i>multipart/form-data</i>.</dd>
<dt><a name="CGI_get_cookie" id="CGI_get_cookie"></a>
CGI_varlist *CGI_get_cookie(CGI_varlist *varlist);</dt>
<dd><i>CGI_get_cookie()</i> parses HTTP cookies from the
<i>HTTP_COOKIE</i> environment variable and adds them to
variable list <i>varlist</i>. If <i>varlist</i> is null then a
new variable list is created and returned, otherwise
<i>varlist</i> is returned. Returns null if <i>varlist</i> is
null and <i>HTTP_COOKIE</i> does not exist or contains no
cookies.</dd>
<dt><a name="CGI_get_all" id="CGI_get_all"></a> CGI_varlist
*CGI_get_all(const char *template);</dt>
<dd><i>CGI_get_all()</i> calls <a href=
"#CGI_get_cookie">CGI_get_cookie()</a>, <a href=
"#CGI_get_query">CGI_get_query()</a> and <a href=
"#CGI_get_post">CGI_get_post()</a>, returning all of the CGI
variables and cookies in one variable list. The <i>template</i>
parameter (which may be null) is passed on to
<i>CGI_get_post()</i>.</dd>
<dt><a name="CGI_decode_query" id="CGI_decode_query"></a>
CGI_varlist *CGI_decode_query(CGI_varlist *varlist, const char
*query);</dt>
<dd><i>CGI_decode_query()</i> decodes CGI variables in null
terminated <a href="#query">query string</a> <i>query</i>
(which is in <i>application/x-www-urlencoded</i> format) and
adds the CGI variables to <i>varlist</i>. If <i>varlist</i> is
null then a new variable list is created and returned,
otherwise <i>varlist</i> is returned. Returns null if
<i>varlist</i> is null and <i>query</i> is null or has no CGI
variables.</dd>
<dt><a name="CGI_add_var" id="CGI_add_var"></a> CGI_varlist
*CGI_add_var(CGI_varlist *varlist, const char *name, const char
*value);</dt>
<dd><i>CGI_add_var()</i> adds an entry named <i>name</i> with
value <i>value</i> to variable list <i>varlist</i>. If
<i>varlist</i> is null, then a new variable list is created and
returned, otherwise <i>varlist</i> is returned. If the variable
list already has an entry named <i>name</i>, then the value is
added to that entry. This function is provided so that you can
add data to a variable list by hand, or create a variable list
for other purposes.</dd>
<dt><a name="CGI_lookup_all" id="CGI_lookup_all"></a> CGI_value
*CGI_lookup_all(CGI_varlist *varlist, const char *name);</dt>
<dd><i>CGI_lookup_all()</i> searches <i>varlist</i> for an
entry whose name matches <i>name</i> case sensitively and
returns all the values of the entry, or returns null if no
entry is found. If <i>name</i> is null, then the values of the
entry most recently visited by <a href=
"#CGI_first_name">CGI_first_name()</a> or <a href=
"#CGI_next_name">CGI_next_name()</a> are returned. The return
value is a null terminated array of pointers to null terminated
strings. The array and strings are stored in memory allocated
to <i>varlist</i>, which you should not modify. The return type
<i>CGI_value&nbsp;*</i>
(<i>const&nbsp;char&nbsp;*&nbsp;const&nbsp;*</i>) declares the
array and strings to be read only to discourage
modification.</dd>
<dt><a name="CGI_lookup" id="CGI_lookup"></a> const char
*CGI_lookup(CGI_varlist *varlist, const char *name);</dt>
<dd><i>CGI_lookup()</i> searches <i>varlist</i> for an entry
whose name matches <i>name</i> case sensitively and returns the
first (or only) value of the entry, or returns null if no entry
is found. If <i>name</i> is null, then the first value of the
entry most recently visited by <a href=
"#CGI_first_name">CGI_first_name()</a> or <a href=
"#CGI_next_name">CGI_next_name()</a> is returned. If you expect
an entry to have a single value, then this function is easier
to use than <i>CGI_lookup_all()</i> and it is more efficient
because it doesn't construct an array to return multiple
values. You should not modify the string returned by this
function.</dd>
<dt><a name="CGI_first_name" id="CGI_first_name"></a> const
char *CGI_first_name(CGI_varlist *varlist);</dt>
<dd><i>CGI_first_name()</i> begins an iteration of
<i>varlist</i> and returns the name of the first entry, or
returns null if <i>varlist</i> is null. You can get all the
values of this entry with
<i>CGI_lookup_all(varlist,&nbsp;0);</i> You should not modify
the string returned by this function.</dd>
<dt><a name="CGI_next_name" id="CGI_next_name"></a> const char
*CGI_next_name(CGI_varlist *varlist);</dt>
<dd><i>CGI_next_name()</i> continues an iteration of
<i>varlist</i> and returns the name of the next entry. You can
get all the values of this entry with
<i>CGI_lookup_all(varlist,&nbsp;0);</i> Returns null if 1)
there are no more entries, or 2) <i>varlist</i> is null, or 3)
no iteration was started with <i>CGI_first_name()</i>, or 4)
new data was added to <i>varlist</i> during the iteration. You
should not modify the string returned by this function.</dd>
<dt><a name="CGI_free_varlist" id="CGI_free_varlist"></a> void
CGI_free_varlist(CGI_varlist *varlist);</dt>
<dd><i>CGI_free_varlist()</i> frees all memory used by variable
list <i>varlist</i>.</dd>
<dt><a name="CGI_encode_query" id="CGI_encode_query"></a> char
*CGI_encode_query(const char *keep, const char *name1, const
char *value1, ..., (char *)0);</dt>
<dd><i>CGI_encode_query()</i> returns a query string in
<a href="#query">application/x-www-form-urlencoded</a> format
that is built from a null terminated list of null terminated
string arguments. The first argument <i>keep</i> (which may be
null) is a null terminated string that specifies characters
that you do not want to <a href="#query">URL encode</a> with
<b>%xx</b>. You do not need to specify letters or digits
because they are never encoded. The first two arguments after
<i>keep</i> are a name and value pair, the next two are a
second name and value pair, etc. <b>Be sure to terminate the
argument list with (char *)0</b>. (When passing a variable
length argument list, the C compiler does not automatically
cast <b>0</b> to <b>(char *)0</b>, which is necessary
on 64 bit platforms.) In the result the names
and values are URL encoded and separated with literal
<b>&amp;</b> and <b>=</b> characters like this:
<b>name1=value1&amp;name2=value2</b>&nbsp;... Memory is
allocated with <i>malloc()</i> to hold the result, which you
should free with <i>free()</i>.</dd>
<dt><a name="CGI_encode_varlist" id="CGI_encode_varlist"></a>
char *CGI_encode_varlist(CGI_varlist *varlist, const char
*keep);</dt>
<dd><i>CGI_encode_varlist()</i> returns a query string in
<a href="#query">application/x-www-form-urlencoded</a> format
that is built from CGI_varlist <i>varlist</i>. The argument
<i>keep</i> (which may be null) is a null terminated string
that specifies characters that you do not want to <a href=
"#query">URL encode</a> with <b>%xx</b>. You do not need to
specify letters or digits because they are never encoded. The
names and values in <i>varlist</i> are URL encoded and
separated with literal <b>&amp;</b> and <b>=</b> characters
like this: <b>name1=value1&amp;name2=value2</b>&nbsp;... Memory
is allocated with <i>malloc()</i> to hold the result, which you
should free with <i>free()</i>. You can use <a href=
"#CGI_add_var">CGI_add_var()</a> to build <i>varlist</i>.</dd>
<dt><a name="CGI_encrypt" id="CGI_encrypt"></a> char
*CGI_encrypt(const void *p, int len, const char
*password);</dt>
<dd><i>CGI_encrypt()</i> encrypts input <i>p</i> of length
<i>len</i> bytes using <i>password</i> to generate the cipher
key. Also computes a <i>message digest</i> using the input
data. Returns the encrypted digest and encrypted data in a
base64 encoded string, which must be decrypted with <a href=
"#CGI_decrypt">CGI_decrypt()</a> and the same password. Returns
null if <i>p</i> is null or if <i>len</i> is less than one or
if <i>password</i> is null or zero length. Memory is allocated
with <i>malloc()</i> to hold the result, which you should free
with <i>free()</i>. (See the <a href="#crypto">cryptography</a>
section for more information.)</dd>
<dt><a name="CGI_decrypt" id="CGI_decrypt"></a> void
*CGI_decrypt(const char *p, int *len, const char
*password);</dt>
<dd><i>CGI_decrypt()</i> decrypts input <i>p</i>, which was
encrypted with <a href="#CGI_encrypt">CGI_encrypt()</a>, using
<i>password</i> to generate the cipher key. The output is a
<i>message digest</i> and decrypted data bytes. Verifies the
data using the message digest and returns the data. Returns the
length of the data in <i>*len</i>. Returns null if <i>p</i>
cannot be decrypted and verified. Also returns null if <i>p</i>
or <i>password</i> is null or zero length. Memory is allocated
with <i>malloc()</i> to hold the result, which you should free
with <i>free()</i>. (See the <a href="#crypto">cryptography</a>
section for more information.)</dd>
<dt><a name="CGI_decode_url" id="CGI_decode_url"></a> char
*CGI_decode_url(const char *p);</dt>
<dd><i>CGI_decode_url()</i> returns a <a href="#query">URL
decoded</a> copy of input string <i>p</i>. Memory is allocated
with <i>malloc()</i> to hold the result, which you should free
with <i>free()</i>.</dd>
<dt><a name="CGI_encode_url" id="CGI_encode_url"></a> char
*CGI_encode_url(const char *p, const char *keep);</dt>
<dd><i>CGI_encode_url()</i> returns a <a href="#query">URL
encoded</a> copy of input string <i>p</i>. Memory is allocated
with <i>malloc()</i> to hold the result, which you should free
with <i>free()</i>. The <i>keep</i> argument (which may be
null) is a null terminated string that specifies characters
that you do not want to URL encode with <b>%xx</b>. You do not
need to specify letters or digits because they are never
encoded.</dd>
<dt><a name="CGI_encode_entity" id="CGI_encode_entity"></a>
char *CGI_encode_entity(const char *p);</dt>
<dd><i>CGI_encode_entity()</i> returns a HTTP entity encoded
copy of input string <i>p</i>. Memory is allocated with
<i>malloc()</i> to hold the result, which you should free with
<i>free()</i>. <i>CGI_encode_entity()</i> makes the following
conversions: <b>&lt;</b> becomes <b>&amp;lt;</b>, <b>&gt;</b>
becomes <b>&amp;gt;</b>, <b>&amp;</b> becomes <b>&amp;amp;</b>,
<b>"</b> becomes <b>&amp;quot;</b>, <b>'</b> becomes
<b>&amp;#39;</b>, <i>newline</i> becomes <b>&amp;#10;</b>, and
<i>return</i> becomes <b>&amp;#13;</b>.</dd>
<dt><a name="CGI_encode_base64" id="CGI_encode_base64"></a>
char *CGI_encode_base64(const void *p, int len);</dt>
<dd><i>CGI_encode_base64()</i> encodes input <i>p</i> of length
<i>len</i> bytes, and returns the result, which is a null
terminated base64 encoded string. Memory is allocated for the
result with <i>malloc()</i>, which you should free with
<i>free()</i>. Base64 is a commonly used encoding that
represents arbitrary bytes of data using the following
printable characters: upper case, lower case, digits, <b>+</b>,
<b>/</b>, and <b>=</b>.</dd>
<dt><a name="CGI_decode_base64" id="CGI_decode_base64"></a>
void *CGI_decode_base64(const char *p, int *len);</dt>
<dd><i>CGI_decode_base64()</i> decodes <i>p</i>, which is a
null terminated base64 encoded string, and returns the result.
The length of the result is stored in <i>*len</i> and a null
byte is written just after the last byte of the result. Memory
is allocated with <i>malloc()</i> to hold the result, which you
should free with <i>free()</i>.</dd>
<dt><a name="CGI_encode_hex" id="CGI_encode_hex"></a> char
*CGI_encode_hex(const void *p, int len);</dt>
<dd><i>CGI_encode_hex()</i> encodes input <i>p</i>, of length
<i>len</i> bytes, and returns the result, which is a null
terminated hexadecimal encoded string. Memory is allocated for
the result with <i>malloc()</i>, which you should free with
<i>free()</i>. Hexadecimal is a commonly used encoding that
represents arbitrary bytes of data using two hexadecimal digits
for each byte.</dd>
<dt><a name="CGI_decode_hex" id="CGI_decode_hex"></a> void
*CGI_decode_hex(const char *p, int *len);</dt>
<dd><i>CGI_decode_hex()</i> decodes <i>p</i>, which is a null
terminated hexadecimal encoded string, and returns the result.
The length of the result is stored in <i>*len</i> and a null
byte is written just after the last byte of the result. Memory
is allocated with <i>malloc()</i> to hold the result, which you
should free with <i>free()</i>. Returns null if <i>p</i> is
null, or if the length of <i>p</i> is odd, or if <i>p</i>
contains characters other than hexadecimal digits.</dd>
<dt><a name="CGI_prefork_server" id="CGI_prefork_server"></a>
void CGI_prefork_server(const char *host, int port, const char
*pidfile, int maxproc, int minidle, int maxidle, int maxreq,
void (*callback)(void));</dt>
<dd><i>CGI_prefork_server()</i> implements a <a href=
"http://www.mems-exchange.org/software/scgi/">SCGI</a> (Simple
CGI) pre forking server. The <i>host</i> specifies a local
network address, either by hostname or dotted decimal IP
address, and <i>port</i> specifies a TCP port number. The SCGI
server listens for requests on the specified address and port.
If <i>host</i> is null, then the server listens on all local
addresses. The <i>pidfile</i> (which may be null) is an
optional file name where the server writes its process ID. The
SCGI server forks up to <i>maxproc</i> child processes to
handle requests. It forks and destroys processes to maintain
between <i>minidle</i> and <i>maxidle</i> idle processes. Each
process exits after handling <i>maxreq</i> requests. If
<i>maxreq</i> is less than one, then it is unlimited. You
provide the <i>callback</i> function, which the SCGI server
calls to process each web request. <i>CGI_prefork_server()</i>
does not return unless it fails. (See the <a href=
"#prefork">SCGI server</a> section for more information.)</dd>
</dl>
<h2><a name="using" id="using"></a>Using the C CGI Library</h2>
<p>Here is an example program that outputs all of its CGI data.
In your C source, include <i>ccgi.h</i> and link your program
with <i>libccgi.a</i>. (If you use <i>CGI_encrypt()</i> or
<i>CGI_decrypt()</i> then you must also link with the
<i>openssl</i> library <i>libcrypto</i>.) The simplest way to
obtain your CGI data is with <i>CGI_get_all()</i>. If you are not
uploading any files, then just pass it a null argument.</p>
<pre>
#include &lt;stdio.h&gt;
#include &lt;ccgi.h&gt;
int main(int argc, char **argv) {
CGI_varlist *varlist;
const char *name;
CGI_value *value;
int i;
fputs("Content-type: text/plain\r\n\r\n", stdout);
if ((varlist = CGI_get_all(0)) == 0) {
printf("No CGI data received\r\n");
return 0;
}
/* output all values of all variables and cookies */
for (name = CGI_first_name(varlist); name != 0;
name = CGI_next_name(varlist))
{
value = CGI_lookup_all(varlist, 0);
/* CGI_lookup_all(varlist, name) could also be used */
for (i = 0; value[i] != 0; i++) {
printf("%s [%d] = %s\r\n", name, i, value[i]);
}
}
CGI_free_varlist(varlist); /* free variable list */
return 0;
}
</pre>
<h2><a name="upload" id="upload"></a>File Uploads</h2>
<p>To upload files to your CGI program, your HTML form must use
the <i>post</i> method and must specify
<i>multipart/form-data</i> encoding, so the form tag looks like
this:</p>
<pre>
&lt;form method="POST" enctype="multipart/form-data"
action="url-for-your-CGI"&gt;
</pre>
<p>Within the HTML form a file upload tag looks like this:</p>
<pre>
&lt;input type="file" name="uploadfield" /&gt;
</pre>
<p>Most browsers render this tag with a file browse button and a
text field to enter and/or display the name of the file being
uploaded.</p>
<p>When the user submits the form, the browser sends the file
data together with any CGI form variables using
<i>multipart/form-data</i> encoding. To receive uploaded file
data you must call <a href="#CGI_get_post">CGI_get_post()</a> or
<a href="#CGI_get_all">CGI_get_all()</a>, and pass a file name
template string, a copy of which is passed on to standard C
function <i>mkstemp()</i>. The final six characters of the
template string must be <b>XXXXXX</b> and <i>mkstemp()</i>
replaces these with random characters to create a new file with a
unique name. If you pass a null or invalid template string, then
uploaded file data is silently discarded.</p>
<p><i>CGI_get_post()</i> or <i>CGI_get_all()</i> stores two names
for the uploaded file in the variable list, which you can
retrieve with</p>
<pre>
value = CGI_lookup_all(varlist, "uploadfield");
</pre>
<p>This returns an array of two strings (provided no other form
input tags are named <i>uploadfield</i>). In <i>value[0]</i> is
the name of the uploaded file on the web server, which is derived
from the template string. In <i>value[1]</i> is the name of the
file specified by the user in the browser. If the user has not
uploaded a file, then <i>varlist</i> has no entry named
<i>uploadfield</i> and <i>CGI_lookup_all()</i> returns null.</p>
<p>We use <i>mkstemp()</i> to guarantee unique file names because
a form may have multiple file upload fields, resulting in
multiple files. Furthermore, multiple users can upload files to
multiple instances of the CGI at the same time. Here is an
example CGI program that uploads a file.</p>
<pre>
#include &lt;ccgi.h&gt;
#include &lt;stdio.h&gt;
int main(int argc, char **argv) {
CGI_varlist *varlist;
CGI_value *value;
fputs("Content-type: text/plain\r\n\r\n", stdout);
varlist = CGI_get_all("/tmp/cgi-upload-XXXXXX");
value = CGI_lookup_all(varlist, "uploadfield");
if (value == 0 || value[1] == 0) {
fputs("No file was uploaded\r\n", stdout);
}
else {
printf("Your file \"%s\" was uploaded to my file \"%s\"\r\n",
value[1], value[0]);
/* Do something with the file here */
unlink(value[0]);
}
CGI_free_varlist(varlist);
return 0;
}
</pre>
<h2><a name="crypto" id="crypto"></a>Simple Cryptography
Support</h2>
<p>HTML and HTTP provide no native support for protecting and
verifying CGI data. Many web applications pass state data to the
browser in cookies or form variables. When the browser passes
this data back, the web application cannot tell if it has been
tampered with. An attacker can easily handcraft a web request
that includes forged cookies or forged form data.</p>
<p>The C CGI Library addresses this problem with <a href=
"#CGI_encrypt">CGI_encrypt()</a> and <a href=
"#CGI_decrypt">CGI_decrypt()</a>. <i>CGI_encrypt()</i> computes a
<i>SHA1 message digest</i> from the input data, encrypts the
digest and the input data, and returns the result in a base64
encoded string. (Raw encrypted output is binary.)
<i>CGI_decrypt()</i> reverses the process. It decrypts the digest
and the data, and recomputes the digest. If the two digests
match, then it returns the data. Otherwise it returns null to
indicate failure. <i>CGI_encrypt()</i> and <i>CGI_decrypt()</i>
use a password that you provide, which is a null terminated
string of arbitrary length (the longer the better). It is
essentially impossible to tamper with the data without knowing
the password. If the output of <i>CGI_encrypt()</i> is modified
in any way, then <i>CGI_decrypt()</i> computes a message digest
that does not match and returns null.</p>
<p>To protect state data, simply encrypt it with
<i>CGI_encrypt()</i> and a password before passing it to the
browser. When the browser passes the encrypted data back, decrypt
with <i>CGI_decrypt()</i> and the same password. If
<i>CGI_decrypt()</i> succeeds, then you know that the data has
not changed. Of course the security of the data depends on the
security of the password, which should be very difficult to guess
and very difficult to steal.</p>
<p><i>CGI_encrypt()</i> uses the <i>openssl</i> library
<i>libcrypto</i> and has these features:</p>
<ul>
<li>Uses the <i>AES-256-CBC</i> cipher.</li>
<li>Generates the cipher key by feeding the password and a
random <i>salt</i> to a hash function. One password results in
a huge number of different cipher keys.</li>
<li>Uses the <i>SHA1</i> message digest algorithm to verify the
input data. Feeds the salt, the password, and the input data to
<i>SHA1</i> to generate the message digest.</li>
<li>Encrypts the message digest and the input data. (Does not
encrypt the salt because decryption needs it.)</li>
<li>Returns a base64 encoded string consisting of the salt,
encrypted digest and encrypted input data.</li>
</ul>
<h2><a name="prefork" id="prefork"></a>Pre Forking SCGI
Server</h2>
<p>Usually when a web server receives a request for a CGI
resource, the web server executes a CGI program, which handles
the request and exits. This does not perform well under high
load. <a href=
"http://www.mems-exchange.org/software/scgi/">SCGI</a> (Simple
CGI) is a protocol for running a persistent CGI server. When a
web server receives a request for a SCGI resource, the web server
connects to a <i>SCGI Server</i> and forwards the request using
the SCGI protocol. The SCGI server responds to the web server,
which forwards the response back to the user's browser. This is
much more efficient than executing a CGI program for each
request. To configure the Apache httpd web server to use SCGI,
see the <a href=
"http://www.mems-exchange.org/software/scgi/">mod_scgi</a>
module.</p>
<p>Under high load a SCGI server must be able to handle multiple
requests concurrently. The SCGI server provided here <i>pre
forks</i> a specified number of child processes that all wait for
requests. The parent process monitors how many child processes
are busy and creates more if necessary. If too many processes are
idle, then the parent terminates some of them.</p>
<p>You provide the code that handles web requests in a
<i>callback</i> function, which is called once for each request.
The environment, standard input, and standard output are set up
so that your <i>callback</i> can be written very much like a
traditional CGI program. All the functions in the C CGI library
work as specified when using the SCGI server.</p>
<p>To start the SCGI server, call <a href=
"#CGI_prefork_server">CGI_prefork_server()</a> and pass it a
pointer to your <i>callback</i> function. The SCGI server puts
itself into the background, and forks child processes to handle
web requests. If <i>CGI_prefork_server()</i> returns, then it has
failed. The web server does not automatically start the SCGI
server program, so you must start it. You control which user
account runs the SCGI server and what privileges it has.</p>
<p>To terminate the SCGI server, send the <i>SIGTERM</i> signal
to the parent process and it sends the signal on to its child
processes and exits. The parent process writes its process ID in
a file if you pass the file name to <a href=
"#CGI_prefork_server">CGI_prefork_server()</a> in
<i>pidfile</i>.</p>
<p>The <i>callback</i> function operates very much like a
traditional CGI program, except that it gets called multiple
times. When writing your <i>callback</i> consider the
following.</p>
<ul>
<li>The <i>callback</i> function should not call <i>exit()</i>
(unless it encounters a serious error). You defeat the purpose
of a persistent process if you exit. The parent process
replaces exited children, so calling <i>exit()</i> does not
cause the SCGI server to fail.</li>
<li>Be careful to free memory that you have allocated and close
files that you have opened inside the <i>callback</i> function.
Otherwise the process will consume memory and/or file
descriptors with each call to <i>callback</i>, and eventually
fail. It may be too difficult to track down all memory leaks.
You can call <a href=
"#CGI_prefork_server">CGI_prefork_server()</a> with
<i>maxreq</i> greater than zero, which causes the child process
to exit after handling <i>maxreq</i> requests, which releases
all its resources.</li>
<li>You may need to handle initialization code differently.
Initializations made before you call
<i>CGI_prefork_server()</i> are inherited by all child
processes. If you open any files or sockets, then the
corresponding file descriptors are inherited and shared. You
may not get the behavior you want when multiple processes share
a file descriptor.</li>
<li>To initialize each child process individually, place
initialization code in <i>callback</i> inside an <i>if</i>
statement that executes the first time <i>callback</i> is
called. The <i>if</i> statement can test a <i>static</i>
variable and reset it to prevent executing the body of the
<i>if</i> statement again.</li>
<li>Each SCGI request includes a full set of environment
variables. The SCGI server replaces the entire environment with
these variables before each call to <i>callback</i>. If you
need anything from the original environment, then you should
save it before calling <i>CGI_prefork_server()</i>. If you need
to manipulate the environment, then the standard C function
<i>putenv()</i> allows you to add or modify environment
variables, and the global C variable
<i>extern&nbsp;char&nbsp;**environ;</i> is a pointer to the
current environment.</li>
<li>If you read standard input directly (rather than using
<i>CGI_get_all()</i> or <i>CGI_get_post()</i>) then use
<i>stdio</i> library functions. In particular you should not
use the <i>read()</i> system call because the SCGI server reads
environment data from standard input using <i>stdio</i> before
calling <i>callback</i>. Use <i>fread()</i> instead.</li>
<li>The SCGI server uses <i>syslog()</i> to log error messages.
If you do not want the default syslog parameters, then
initialize the logging system with <i>openlog()</i> before
calling <i>CGI_prefork_server()</i>. Use <i>syslog()</i> inside
<i>callback</i> to log any errors.</li>
</ul>
<p>Here is an example SCGI server.</p>
<pre>
#include &lt;ccgi.h&gt;
#include &lt;stdio.h&gt;
#include &lt;syslog.h&gt;
static void
cgi_callback() {
static int first_call = 1;
CGI_varlist *varlist;
if (first_call) {
first_call = 0;
/* initializations for each child process go here */
}
varlist = CGI_get_all(0);
fputs("Content-type: text/html\r\n\r\n", stdout);
/* write the rest of the web response to stdout */
/* free memory and close open files */
CGI_free_varlist(varlist);
}
int
main(int argc, char **argv) {
/* initializations before forking child processes go here */
openlog("my-scgi-server", 0, LOG_DAEMON);
CGI_prefork_server("localhost", 4000, "/var/run/my-scgi-server.pid",
/* maxproc */ 100, /* minidle */ 8, /* maxidle */ 16,
/* maxreq */ 1000, cgi_callback);
/* if CGI_prefork_server() returns, then it failed */
return 0;
}
</pre>
</body>
</html>
-6
View File
@@ -1,6 +0,0 @@
CFLAGS = -I ..
dump.cgi: dump.cgi.o
$(CC) -o dump.cgi dump.cgi.o -L .. -lccgi
dump.cgi.o: dump.cgi.c
-9
View File
@@ -1,9 +0,0 @@
dump.html is a sample web form that POSTs to dump.cgi.
dump.cgi displays all the form data and uploads
files to /tmp/cgi-upload-*
To build dump.cgi: make
Install dump.cgi and dump.html on a web server and
browse dump.html.
-34
View File
@@ -1,34 +0,0 @@
#include <stdio.h>
#include <ccgi.h>
int
main(int argc, char **argv, char **env) {
CGI_varlist *vl;
const char *name;
CGI_value *value;
int i;
fputs("Content-type: text/plain\r\n\r\n", stdout);
fputs("Environment:\r\n", stdout);
for (i = 0; env[i] != 0; i++) {
fputs(env[i], stdout);
fputs("\r\n", stdout);
}
if ((vl = CGI_get_all("/tmp/cgi-upload-XXXXXX")) == 0) {
fputs("CGI_get_all() failed\r\n", stdout);
return 0;
}
fputs("\r\nCGI Variables:\r\n", stdout);
for (name = CGI_first_name(vl); name != 0;
name = CGI_next_name(vl))
{
value = CGI_lookup_all(vl, 0);
for (i = 0; value[i] != 0; i++) {
printf("%s [%d] >>%s<<\r\n", name, i, value[i]);
}
}
CGI_free_varlist(vl);
return 0;
}
-73
View File
@@ -1,73 +0,0 @@
<html>
<head>
<title>C CGI Test Form</title>
<style>
.middle {
vertical-align: middle;
}
</style>
</head>
<body>
<h2>C CGI Library Test Form</h2>
<form method="POST"
action="dump.cgi?qvar1=q+val+1&amp;qvar2=q+val+2&amp;qvar3=q+val+3"
enctype="multipart/form-data">
<p>
Text Input: <input type="text" name="textvar1" />
</p>
<p>
File Uploads:
</p>
<p>
File 1:<input type="file" name="upload1" /><br />
File 2:<input type="file" name="upload2" />
</p>
<p>
Check Boxes:
cb1<input type="checkbox" name="cbvar1" value="cb #1" checked="checked" />
cb2<input type="checkbox" name="cbvar1" value="cb #2" />
cb3<input type="checkbox" name="cbvar1" value="cb #3" checked="checked" />
cb4<input type="checkbox" name="cbvar1" value="cb #4" />
</p>
<p>
Radio Buttons:
rb1<input type="radio" name="rbvar1" value="rb #1" />
rb2<input type="radio" name="rbvar1" value="rb #2" />
rb3<input type="radio" name="rbvar1" value="rb #3" checked="checked" />
rb4<input type="radio" name="rbvar1" value="rb #4" />
NONE: <input type="radio" name="rbvar1" value="none" />
</p>
<p>
Selection:
<select class="middle" multiple name="selvar1">
<option value="sel val #1" selected="selected">Select Value 1</option>
<option value="sel val #2">Select Value 2</option>
<option value="sel val #3" selected="selected">Select Value 3</option>
<option value="sel val #4" selected="selected">Select Value 4</option>
<option value="sel val #5">Select Value 5</option>
<option value="sel val #6">Select Value 6</option>
<option value="sel val #7" selected="selected">Select Value 7</option>
</select>
</p>
<p>
Text Area:
<textarea class="middle" name="textarea1" rows="10" cols="40">Initial Line 1
Initial Line 2</textarea>
</p>
<p>
<input type="submit" name="submitbutton" value="Submit Form" />
<input type="hidden" name="hidden"
value="This is three&#13;&#10;lines of hidden&#13;&#10;form data" />
</p>
</form>
</body>
</html>
-468
View File
@@ -1,468 +0,0 @@
/*
* C CGI Library version 1.2
*
* Author: Stephen C. Losen, University of Virginia
*
* Copyright 2015 Stephen C. Losen. Distributed under the terms
* of the GNU Lesser General Public License (LGPL 2.1)
*
* CGI_prefork_server() is a pre forking SCGI server that handles web
* requests by calling a callback function provided by the user.
* The parent process forks a configurable number of child processes
* to accept web requests.
*/
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <syslog.h>
#include <stdio.h>
#define SCORE_MAX_PROC 10000
#define SCORE_IDLE 1
#define SCORE_BUSY 2
/* scoreboard structs to keep track of child process state */
struct score_state {
pid_t pid;
int state;
};
struct score_board {
int numproc;
int numidle;
int minidle;
int maxidle;
int maxproc;
struct score_state proc[1];
};
/* score_new() creates new scoreboard */
static struct score_board *
score_new(int maxproc, int minidle, int maxidle) {
struct score_board *scb;
int size = sizeof(*scb) + maxproc * sizeof(scb->proc);
scb = (struct score_board *) malloc(size);
memset(scb, 0, size);
scb->maxproc = maxproc;
scb->minidle = minidle;
scb->maxidle = maxidle;
return scb;
}
/* score_find() finds process entry and returns its index */
static int
score_find(struct score_board *scb, pid_t pid) {
int i;
for (i = 0; i < scb->maxproc; i++) {
if (scb->proc[i].pid == pid) {
return i;
}
}
return -1;
}
/* score_add() adds a new pid to the scoreboard */
static void
score_add(struct score_board *scb, pid_t pid) {
int i = score_find(scb, 0);
if (i >= 0) {
scb->proc[i].pid = pid;
scb->proc[i].state = SCORE_IDLE;
scb->numproc++;
scb->numidle++;
}
}
/* score_remove() removes a pid from the scoreboard */
static void
score_remove(struct score_board *scb, pid_t pid) {
int i = score_find(scb, pid);
if (i >= 0) {
scb->proc[i].pid = 0;
scb->numproc--;
if (scb->proc[i].state == SCORE_IDLE) {
scb->numidle--;
}
}
}
/* score_update() changes pid state to busy or idle */
static void
score_update(struct score_board *scb, struct score_state *st) {
int i = score_find(scb, st->pid);
if (i >= 0 && scb->proc[i].state != st->state) {
scb->proc[i].state = st->state;
if (st->state == SCORE_IDLE) {
scb->numidle++;
}
else {
scb->numidle--;
}
}
}
/* score_kill() finds an idle process and kills it */
static void
score_kill(struct score_board *scb) {
int i;
for (i = 0; i < scb->maxproc; i++) {
if (scb->proc[i].pid != 0 && scb->proc[i].state == SCORE_IDLE) {
kill(scb->proc[i].pid, SIGTERM);
return;
}
}
}
/*
* setup_sock() opens a TCP socket, binds it to a local address
* specified by host and port, calls listen(), and returns the
* socket.
*/
static int
setup_sock(const char *host, int port) {
struct sockaddr_in local;
struct hostent *h;
int sock;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(port);
if (host == 0 || *host == 0) {
local.sin_addr.s_addr = INADDR_ANY;
}
else if (!isdigit(host[0]) ||
inet_aton(host, &local.sin_addr) == 0)
{
if ((h = gethostbyname(host)) != 0) {
memcpy(&local.sin_addr, h->h_addr_list[0], h->h_length);
}
else {
local.sin_addr.s_addr = INADDR_ANY;
}
}
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
return sock;
}
if (bind(sock, (struct sockaddr *) &local, sizeof(local)) < 0 ||
listen(sock, 5) < 0)
{
close(sock);
return -1;
}
return sock;
}
/*
* read_env() reads the environment from the SCGI client (httpd).
* We read the length of the environment, which is an ASCII decimal
* string terminated by ':'. We read the environment, which
* is a sequence of null terminated strings where each pair of strings
* is an environment variable name and value. After the environment
* is a comma. (Any remaining input is POST data, which we leave
* unread.) We replace the null between each variable name and value
* with '=' and we return an array of char * pointers to the
* environment variable strings.
*/
static char **
read_env(void) {
char **env;
char *buf, *p;
int i, k, len;
/* read length of environment data, eg, "175:" */
for (len = 0; isdigit(k = getc(stdin)); ) {
len = len * 10 + k - '0';
}
if (k != ':' || len < 4) {
return 0;
}
/* read the environment strings */
buf = (char *) malloc(len);
if (fread(buf, 1, len, stdin) != len || getc(stdin) != ',') {
free(buf);
return 0;
}
/* replace null between each name and value with '=' */
for (i = k = 0; i < len; i++) {
if (buf[i] == 0 && (++k & 1)) {
buf[i] = '=';
}
}
/* build environment array */
k = k / 2 + 1;
env = (char **) malloc(k * sizeof(*env));
p = buf;
for (i = k = 0; i < len; i++) {
if (buf[i] == 0) {
env[k++] = p;
p = buf + i + 1;
}
}
env[k] = 0;
return env;
}
/* terminate() sets a flag when we get SIGTERM */
static int terminate_flag = 0;
static void
terminate(int sig) {
terminate_flag = 1;
}
/* child_handler() sets a flag when a child exits */
static int child_exited = 0;
static void
child_handler(int sig) {
child_exited = 1;
}
/*
* set_handler() sets a signal handler. We use this instead of
* signal() because it is more portable and system calls tend to
* be restarted when signal() is used. In particular we need
* read() to return if we catch a signal.
*/
static int
set_handler(int sig, void (*handler)(int sig)) {
struct sigaction action;
action.sa_handler = handler;
action.sa_flags = 0;
sigemptyset(&action.sa_mask);
return sigaction(sig, &action, 0);
}
/*
* CGI_prefork_server() pre forks child processes to handle SCGI requests.
* The parent process opens a TCP socket that listens on a local
* address specified by "host" and "port". Each child handles "maxreq"
* requests and exits. If maxreq <= 0 then maxreq is unlimited. The
* parent process creates or destroys child processes to maintain between
* "minidle" and "maxidle" idle children, and no more than "maxproc"
* total children. To handle a request, a child 1) accepts a connection
* on the listen socket from the SCGI client, 2) redirects stdin and
* stdout to the socket, 3) reads the environment from the SCGI client,
* 4) calls the "callback" function, 5) closes the socket and restores
* the environment. Child processes notify the parent when they
* become busy or idle by writing messages to a pipe.
*/
void
CGI_prefork_server(const char *host, int port, const char *pidfile,
int maxproc, int minidle, int maxidle, int maxreq,
void (*callback)(void))
{
int i, sock, fd;
struct score_state message;
struct score_board *scb;
pid_t pid;
FILE *fp;
int pfd[2];
char **realenv, **tmpenv;
char *tmpbuf;
extern char **environ;
/* sanity check arguments */
if (callback == 0) {
syslog(LOG_ERR, "CGI_prefork_server(): null callback "
"function pointer");
return;
}
if (minidle <= 0) {
minidle = 2;
}
if (maxidle <= minidle) {
maxidle = minidle + 2;
}
if (maxproc <= 0) {
maxproc = maxidle;
}
if (maxproc > SCORE_MAX_PROC) {
maxproc = SCORE_MAX_PROC;
}
syslog(LOG_INFO, "CGI_prefork_server(): maxproc = %d, minidle = %d, "
"maxidle = %d, maxreq = %d", maxproc, minidle, maxidle, maxreq);
/* parent puts self into the background */
if (fork() != 0) {
_exit(0);
}
setsid();
set_handler(SIGTERM, terminate);
set_handler(SIGCHLD, child_handler);
freopen("/dev/null", "r", stdin);
freopen("/dev/null", "w", stdout);
/* write our pid to pidfile */
if (pidfile != 0 && *pidfile != 0 &&
(fp = fopen(pidfile, "w")) != 0)
{
fprintf(fp, "%d\n", getpid());
fclose(fp);
}
/* create child process scoreboard */
scb = score_new(maxproc, minidle, maxidle);
/* parent opens the listen socket, children accept() connections */
if ((sock = setup_sock(host, port)) < 0) {
syslog(LOG_ERR, "CGI_prefork_server(): setup_sock() failed: %m");
return;
}
/* open pipe to receive messages from child processes */
pipe(pfd);
/* parent manages child processes */
for (;;) {
/* fork child if necessary */
if (scb->numidle < scb->minidle && scb->numproc < scb->maxproc) {
if ((pid = fork()) == 0) {
break;
}
else if (pid > 0) {
score_add(scb, pid);
continue;
}
else {
syslog(LOG_ERR, "CGI_prefork_server(): fork() failed: %m");
if (scb->numproc == 0) {
return;
}
}
}
/*
* read status message from child. The read() call returns with
* an error if we catch SIGCHLD or SIGTERM.
*/
if (child_exited == 0 && terminate_flag == 0 &&
read(pfd[0], &message, sizeof(message)) == sizeof(message))
{
score_update(scb, &message);
}
/* kill everything and exit if we got SIGTERM */
if (terminate_flag != 0) {
set_handler(SIGTERM, SIG_IGN);
kill(0, SIGTERM); /* kill process group */
while(wait(0) >= 0)
;
exit(0);
}
/* kill idle child if necessary */
if (scb->numidle > scb->maxidle) {
score_kill(scb);
}
/* wait for exited children */
child_exited = 0;
while ((pid = waitpid(-1, 0, WNOHANG)) > 0) {
score_remove(scb, pid);
}
}
/* child handles maxreq requests and exits */
set_handler(SIGTERM, SIG_DFL);
set_handler(SIGCHLD, SIG_DFL);
close(pfd[0]);
message.pid = getpid();
realenv = environ;
for (i = 0; i < maxreq || maxreq <= 0; i++) {
/* accept connection from SCGI client (httpd) */
if ((fd = accept(sock, 0, 0)) < 0) {
syslog(LOG_ERR, "CGI_prefork_server(): accept() failed: %m");
break;
}
/* notify parent we are busy */
message.state = SCORE_BUSY;
write(pfd[1], &message, sizeof(message));
/* redirect stdin and stdout to socket */
dup2(fd, 0);
dup2(fd, 1);
close(fd);
/* read environment and call callback */
if ((tmpenv = read_env()) != 0) {
tmpbuf = tmpenv[0];
environ = tmpenv;
callback();
}
else {
fputs("Content-type: text/plain\r\n\r\n"
"CGI_prefork_server() could not read environment.\r\n",
stdout);
syslog(LOG_ERR, "CGI_prefork_server(): could not read "
"environment");
}
/* close socket and restore environment */
freopen("/dev/null", "r", stdin); /* closes socket */
freopen("/dev/null", "w", stdout);
environ = realenv;
if (tmpenv != 0) {
free(tmpbuf);
free(tmpenv);
}
/* notify parent we are idle */
message.state = SCORE_IDLE;
write(pfd[1], &message, sizeof(message));
}
_exit(0);
}
-14
View File
@@ -1,14 +0,0 @@
# set OPENSSL_LIB to the directory containing openssl libcrypto
OPENSSL_LIB = /usr/lib
CFLAGS = -I ..
LDFLAGS = -L .. -L $(OPENSSL_LIB)
all: test.sh test
./test.sh
test: test.o ../libccgi.a
$(CC) -o test $(LDFLAGS) test.o -lccgi -lcrypto
test.o: test.c ../ccgi.h
-141
View File
@@ -1,141 +0,0 @@
#include <string.h>
#include <stdio.h>
#include <ccgi.h>
static void
dumplist(CGI_varlist *vl) {
const char *name;
CGI_value *value;
int i;
for (name = CGI_first_name(vl); name != 0;
name = CGI_next_name(vl))
{
value = CGI_lookup_all(vl, 0);
for (i = 0; value[i] != 0; i++) {
printf("%s [%d] >>%s<<\n", name, i, value[i]);
}
}
}
int
main(int argc, char **argv) {
CGI_varlist *vl;
char *p;
CGI_value *value;
int i;
if (strcmp(argv[1], "CGI_get_cookie") == 0) {
vl = CGI_get_cookie(0);
dumplist(vl);
return 0;
}
if (strcmp(argv[1], "CGI_get_query") == 0) {
vl = CGI_get_query(0);
dumplist(vl);
return 0;
}
if (strcmp(argv[1], "CGI_decode_query") == 0) {
vl = CGI_decode_query(0, argv[2]);
dumplist(vl);
return 0;
}
if (strcmp(argv[1], "CGI_get_post") == 0) {
vl = CGI_get_post(0, 0);
dumplist(vl);
return 0;
}
if (strcmp(argv[1], "upload") == 0) {
vl = CGI_get_post(0, "./cgi-upload-XXXXXX");
value = CGI_lookup_all(vl, "upload");
dumplist(vl);
return 0;
}
if (strcmp(argv[1], "CGI_add_var") == 0) {
vl = 0;
for (i = 2; i + 1 < argc; i += 2) {
vl = CGI_add_var(vl, argv[i], argv[i + 1]);
}
dumplist(vl);
return 0;
}
if (strcmp(argv[1], "CGI_encode_varlist") == 0) {
vl = 0;
for (i = 2; i + 1 < argc; i += 2) {
vl = CGI_add_var(vl, argv[i], argv[i + 1]);
}
dumplist(vl);
p = CGI_encode_varlist(vl, ".-_");
fputs(p, stdout);
fputc('\n', stdout);
return 0;
}
if (strcmp(argv[1], "CGI_encode_url") == 0) {
p = CGI_encode_url(argv[2], ".-_");
fputs(p, stdout);
fputc('\n', stdout);
p = CGI_decode_url(p);
fputs(p, stdout);
fputc('\n', stdout);
return 0;
}
if (strcmp(argv[1], "CGI_encode_query") == 0) {
p = CGI_encode_query(".-_", argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
argv[12], argv[13], argv[14], argv[15], argv[16], argv[17],
argv[18], argv[19], argv[20], argv[21], (char *)0);
fputs(p, stdout);
fputc('\n', stdout);
vl = CGI_decode_query(0, p);
dumplist(vl);
return 0;
}
if (strcmp(argv[1], "CGI_encode_base64") == 0) {
p = argv[2];
p = CGI_encode_base64(p, strlen(p));
fputs(p, stdout);
fputc('\n', stdout);
p = (char *) CGI_decode_base64(p, &i);
fwrite(p, i, 1, stdout);
fputc('\n', stdout);
return 0;
}
if (strcmp(argv[1], "CGI_encode_hex") == 0) {
p = argv[2];
p = CGI_encode_hex(p, strlen(p));
fputs(p, stdout);
fputc('\n', stdout);
p = (char *) CGI_decode_hex(p, &i);
fwrite(p, i, 1, stdout);
fputc('\n', stdout);
return 0;
}
if (strcmp(argv[1], "CGI_encode_entity") == 0) {
p = CGI_encode_entity(argv[2]);
fputs(p, stdout);
fputc('\n', stdout);
return 0;
}
if (strcmp(argv[1], "CGI_encrypt") == 0) {
const char *pw = "This is my C CGI test password";
p = argv[2];
p = CGI_encrypt(p, strlen(p), pw);
printf("enc len = %d\n", strlen(p));
p = CGI_decrypt(p , &i, pw);
printf("dec len = %d %s\n", i, p);
return 0;
}
return 0;
}
-337
View File
@@ -1,337 +0,0 @@
#! /bin/sh
PATH=/bin:/usr/bin
# Regression tests for the CGI library
# Usage: ./test.sh [ -r ]
# The -r option causes the script to edit itself and renumber
# the tests in case any are added or removed.
# renumber the tests in this script
renumber() {
cp $0 $0.old &&
awk '/^TEST=[0-9].* ######/ {
printf("TEST=%d ########################################\n", ++i);
next }
{ print }' $0.old > $0 &&
/bin/rm $0.old
exit
}
check () {
echo
if diff -c expected result; then
echo "Test $TEST success"
else
echo "Test $TEST failure"
fi
}
test "X$1" = X-r && renumber
TEST=1 ########################################
# Testing CGI_get_query
Q='one=This+is+a+test&two=%22Bob+Smith%22+%3Cbob%40gmail.com%3E&'
Q=$Q'varnovalue&eq=un=encoded=eq==&one=second+value&the+end'
QUERY_STRING=$Q ./test CGI_get_query > result 2>&1
cat > expected <<'E-O-F'
one [0] >>This is a test<<
one [1] >>second value<<
two [0] >>"Bob Smith" <bob@gmail.com><<
varnovalue [0] >><<
eq [0] >>un=encoded=eq==<<
the end [0] >><<
E-O-F
check
TEST=2 ########################################
# Testing CGI_get_post
CONTENT_TYPE=application/x-www-form-urlencoded \
CONTENT_LENGTH=60 \
./test CGI_get_post > result 2>&1 <<'E-O-F'
one=This+is+a+test&two=%22Bob+Smith%22+%3Cbob%40gmail.com%3E
E-O-F
cat > expected <<'E-O-F'
one [0] >>This is a test<<
two [0] >>"Bob Smith" <bob@gmail.com><<
E-O-F
check
TEST=3 ########################################
# Testing CGI_get_post multipart/form-data
CONTENT_TYPE='multipart/form-data; boundary=----12345' \
./test CGI_get_post > result 2>&1 <<'E-O-F'
------12345
Content-Disposition: form-data; name="textvar1"
------12345
Content-Disposition: form-data; name="doublevar"
Text data here
------12345
Content-Disposition: form-data; name="cbvar1"
cb #1
------12345
Content-Disposition: form-data; name="cbvar1"
cb #3
------12345
Content-Disposition: form-data; name="rbvar1"
rb #3
------12345
Content-Disposition: form-data; name="selvar1"
selval1
------12345
Content-Disposition: form-data; name="selvar1"
selval3
------12345
Content-Disposition: form-data; name="selvar1"
selval4
------12345
Content-Disposition: form-data; name="selvar1"
selval7
------12345
Content-Disposition: form-data; name="textarea1"
Initial Line 1
Initial Line 2
Added Line
Another Line
------12345
Content-Disposition: form-data; name="doublevar"
OK
------12345
Content-Disposition: form-data; name="hidden"
This is three
lines of hidden
form data
------12345--
E-O-F
cat > expected <<'E-O-F'
textvar1 [0] >><<
doublevar [0] >>Text data here<<
doublevar [1] >>OK<<
cbvar1 [0] >>cb #1<<
cbvar1 [1] >>cb #3<<
rbvar1 [0] >>rb #3<<
selvar1 [0] >>selval1<<
selvar1 [1] >>selval3<<
selvar1 [2] >>selval4<<
selvar1 [3] >>selval7<<
textarea1 [0] >>Initial Line 1
Initial Line 2
Added Line
Another Line<<
hidden [0] >>This is three
lines of hidden
form data<<
E-O-F
check
TEST=4 ########################################
# Testing CGI_get_cookie
HTTP_COOKIE='cookie1=cookie1data; cookie2=cookie2data; cookie3=more-stuff;' \
./test CGI_get_cookie > result 2>&1
cat > expected <<'E-O-F'
cookie1 [0] >>cookie1data<<
cookie2 [0] >>cookie2data<<
cookie3 [0] >>more-stuff<<
E-O-F
check
TEST=5 ########################################
# Testing upload
/bin/rm -f cgi-upload-??????
CONTENT_TYPE='multipart/form-data; boundary=----12345' \
./test upload > result 2> result <<'E-O-F'
------12345
Content-Disposition: form-data; name="var1"
Value # 1
------12345
Content-Disposition: form-data; name="upload"; filename="input"
This is a test uploaded file
Here is the second line.
The quick brown fox jumped over the lazy dog
(or was that a hog?)
Now is the time for
all good men
to come to the aid of
their party!
------12345--
E-O-F
F=` echo ./cgi-upload-?????? `
cat $F >> result
/bin/rm -f $F
cat > expected << E-O-F
var1 [0] >>Value # 1<<
upload [0] >>$F<<
upload [1] >>input<<
This is a test uploaded file
Here is the second line.
The quick brown fox jumped over the lazy dog
(or was that a hog?)
Now is the time for
all good men
to come to the aid of
their party!
E-O-F
check
TEST=6 ########################################
# Testing CGI_add_var
./test CGI_add_var one 'first value' two 'value # 2' \
three '3rd-var' two 200% > result 2>&1
cat > expected <<'E-O-F'
one [0] >>first value<<
two [0] >>value # 2<<
two [1] >>200%<<
three [0] >>3rd-var<<
E-O-F
check
TEST=7 ########################################
# Testing CGI_encode_varlist
./test CGI_encode_varlist one 'first value' two 'value # 2' \
three '3rd-var' two 200% > result 2>&1
cat > expected <<'E-O-F'
one [0] >>first value<<
two [0] >>value # 2<<
two [1] >>200%<<
three [0] >>3rd-var<<
one=first+value&two=value+%23+2&two=200%25&three=3rd-var
E-O-F
check
TEST=8 ########################################
# Testing CGI_encode_query
./test CGI_encode_query one 'first value' two 'value # 2' \
three '3rd-var' two 200% > result 2>&1
cat > expected <<'E-O-F'
one=first+value&two=value+%23+2&three=3rd-var&two=200%25
one [0] >>first value<<
two [0] >>value # 2<<
two [1] >>200%<<
three [0] >>3rd-var<<
E-O-F
check
TEST=9 ########################################
# Testing CGI_encode_url
./test CGI_encode_url '/etc/passwd holds Unix(TM) accounts.' > result 2>&1
cat > expected <<'E-O-F'
%2Fetc%2Fpasswd+holds+Unix%28TM%29+accounts.
/etc/passwd holds Unix(TM) accounts.
E-O-F
check
TEST=10 ########################################
# Testing CGI_encode_entity
./test CGI_encode_entity \
'if (i > 20 && i < 200) {
fputs("OK\n", stdout);
}' > result 2>&1
cat > expected <<'E-O-F'
if (i &gt; 20 &amp;&amp; i &lt; 200) {&#10; fputs(&quot;OK\n&quot;, stdout);&#10;}
E-O-F
check
TEST=11 ########################################
# Testing CGI_encode_base64
./test CGI_encode_base64 'Now is the time for the quick brown fox, ...' \
> result 2>&1
cat > expected <<'E-O-F'
Tm93IGlzIHRoZSB0aW1lIGZvciB0aGUgcXVpY2sgYnJvd24gZm94LCAuLi4=
Now is the time for the quick brown fox, ...
E-O-F
check
TEST=12 ########################################
# Testing CGI_encode_hex
./test CGI_encode_hex 'Now is the time for the quick brown fox, ...' \
> result 2>&1
cat > expected <<'E-O-F'
4E6F77206973207468652074696D6520666F722074686520717569636B2062726F776E20666F782C202E2E2E
Now is the time for the quick brown fox, ...
E-O-F
check
TEST=13 ########################################
# Testing CGI_encrypt
./test CGI_encrypt 'Now is the time for the quick brown fox, ...' \
> result 2>&1
cat > expected <<'E-O-F'
enc len = 120
dec len = 44 Now is the time for the quick brown fox, ...
E-O-F
check
# clean up
/bin/rm -f result expected cgi-upload-??????
+1
View File
@@ -0,0 +1 @@
hello
-1
View File
@@ -1 +0,0 @@
joe:foo.com:77bbd68c7bc5cd7b6bb33a19e2fc7007
+507
View File
@@ -0,0 +1,507 @@
Subject: O=Digital Signature Trust Co., CN=DST Root CA X3
Not Before: Sep 30 21:12:19 2000 GMT
Not After : Sep 30 14:01:15 2021 GMT
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----
Subject: C=IE, O=Baltimore, OU=CyberTrust, CN=Baltimore CyberTrust Root
Not Before: May 12 18:46:00 2000 GMT
Not After : May 12 23:59:00 2025 GMT
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
-----END CERTIFICATE-----
Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
Not Before: May 21 04:00:00 2002 GMT
Not After : May 21 04:00:00 2022 GMT
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----
Subject: C=US, O=Symantec Corporation, OU=Symantec Trust Network, CN=Symantec Class 3 ECC 256 bit SSL CA - G2
Not Before: May 12 00:00:00 2015 GMT
Not After : May 11 23:59:59 2025 GMT
-----BEGIN CERTIFICATE-----
MIIEajCCA1KgAwIBAgIQP5KHvp0dpKN6nfYoLndaxDANBgkqhkiG9w0BAQsFADCB
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5IC0gRzUwHhcNMTUwNTEyMDAwMDAwWhcNMjUwNTExMjM1OTU5WjCBgDEL
MAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYD
VQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMTEwLwYDVQQDEyhTeW1hbnRlYyBD
bGFzcyAzIEVDQyAyNTYgYml0IFNTTCBDQSAtIEcyMFkwEwYHKoZIzj0CAQYIKoZI
zj0DAQcDQgAEDxukkdfnrOfRTk63ZFvhj39uBNOrONtEt0Bcbb2WljffeYmGZ/ex
Hwie/WM7RoyfvVPoFdyXPiuBRq2Gfw4BOaOCAV0wggFZMC4GCCsGAQUFBwEBBCIw
IDAeBggrBgEFBQcwAYYSaHR0cDovL3Muc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYB
Af8CAQAwZQYDVR0gBF4wXDBaBgpghkgBhvhFAQc2MEwwIwYIKwYBBQUHAgEWF2h0
dHBzOi8vZC5zeW1jYi5jb20vY3BzMCUGCCsGAQUFBwICMBkaF2h0dHBzOi8vZC5z
eW1jYi5jb20vcnBhMC8GA1UdHwQoMCYwJKAioCCGHmh0dHA6Ly9zLnN5bWNiLmNv
bS9wY2EzLWc1LmNybDAOBgNVHQ8BAf8EBAMCAQYwKwYDVR0RBCQwIqQgMB4xHDAa
BgNVBAMTE1NZTUMtRUNDLUNBLXAyNTYtMjIwHQYDVR0OBBYEFCXwiuFLetkBlQrt
xlPxjHgf2fP4MB8GA1UdIwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
SIb3DQEBCwUAA4IBAQAMMGUXBaWTdaLxsTGtcB/naqjIQrLvoV9NG+7MoHpGd/69
dZ/h2zOy7sGFUHoG/0HGRA9rxT/5w5GkEVIVkxtWyIWWq6rs4CTZt8Bej/KHYRbo
jtEDUkCTZSTLiCvguPyvinXgxy+LHT+PmdtEfXsvcdbeBSWUYpOsDYvD2hNtz9dw
Od5nBosMApmdxt+z7LQyZu8wMnfI1U6IMO+RWowxZ8uy0oswdFYd32l9xe+aAE/k
y9alLu/M9pvxiUKufqHJRgDBKA6uDjHLMPX+/nxXaNCPX3SI4KVZ1stHQ/U5oNlM
dHN9umAvlU313g0IgJrjsQ2nIdf9dsdP+6lrmP7s
-----END CERTIFICATE-----
Subject: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2006 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 3 Public Primary Certification Authority - G5
Not Before: Nov 8 00:00:00 2006 GMT
Not After : Jul 16 23:59:59 2036 GMT
-----BEGIN CERTIFICATE-----
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
-----END CERTIFICATE-----
Subject: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
Not Before: Jun 29 17:06:20 2004 GMT
Not After : Jun 29 17:06:20 2034 GMT
-----BEGIN CERTIFICATE-----
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
ReYNnyicsbkqWletNw+vHX/bvZ8=
-----END CERTIFICATE-----
# Note: Amazon ATS endpoint uses this (2018/12/18)
Subject: C=US, O=Starfield Technologies, Inc., OU=Starfield Class 2 Certification Authority
Not Before: Jun 29 17:39:16 2004 GMT
Not After : Jun 29 17:39:16 2034 GMT
-----BEGIN CERTIFICATE-----
MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
-----END CERTIFICATE-----
Not Before: Sep 1 00:00:00 2009 GMT
Not After : Dec 31 23:59:59 2037 GMT
Subject: C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Root Certificate Authority - G2
-----BEGIN CERTIFICATE-----
MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
-----END CERTIFICATE-----
Subject: C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Services Root Certificate Authority - G2
Not Before: Sep 1 00:00:00 2009 GMT
Not After : Dec 31 23:59:59 2037 GMT
-----BEGIN CERTIFICATE-----
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
sSi6
-----END CERTIFICATE-----
Subject: OU=GlobalSign Root CA - R2, O=GlobalSign, CN=GlobalSign
Not Before: Dec 15 08:00:00 2006 GMT
Not After : Dec 15 08:00:00 2021 GMT
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
-----END CERTIFICATE-----
Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA
Not Before: Nov 10 00:00:00 2006 GMT
Not After : Nov 10 00:00:00 2031 GMT
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
+OkuE6N36B9K
-----END CERTIFICATE-----
Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA
Not Before: Nov 10 00:00:00 2006 GMT
Not After : Nov 10 00:00:00 2031 GMT
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
# *.azure-devices.de use this root.
Subject: C = DE, O = D-Trust GmbH, CN = D-TRUST Root Class 3 CA 2 2009
Not Before: Nov 5 08:35:58 2009 GMT
Not After : Nov 5 08:35:58 2029 GMT
-----BEGIN CERTIFICATE-----
MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
Johw1+qRzT65ysCQblrGXnRl11z+o+I=
-----END CERTIFICATE-----
# https://www.amazontrust.com/repository/
Subject: C = US, O = Amazon, CN = Amazon Root CA 1
Not Before: May 26 00:00:00 2015 GMT
Not After : Jan 17 00:00:00 2038 GMT
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
rqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----
Subject: C = US, O = Amazon, CN = Amazon Root CA 2
Not Before: May 26 00:00:00 2015 GMT
Not After : May 26 00:00:00 2040 GMT
-----BEGIN CERTIFICATE-----
MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK
gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ
W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg
1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K
8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r
2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me
z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR
8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj
mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz
7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6
+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI
0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB
Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm
UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2
LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS
k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl
7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm
btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl
urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+
fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63
n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE
76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H
9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT
4PsJYGw=
-----END CERTIFICATE-----
Not Before: May 26 00:00:00 2015 GMT
Not After : May 26 00:00:00 2040 GMT
Subject: C = US, O = Amazon, CN = Amazon Root CA 3
-----BEGIN CERTIFICATE-----
MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl
ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j
QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr
ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr
BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM
YyRIHN8wfdVoOw==
-----END CERTIFICATE-----
Not Before: May 26 00:00:00 2015 GMT
Not After : May 26 00:00:00 2040 GMT
Subject: C = US, O = Amazon, CN = Amazon Root CA 4
-----BEGIN CERTIFICATE-----
MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi
9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk
M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB
/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB
MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw
CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW
1KyLa2tJElMzrdfkviT8tQp21KW8EA==
-----END CERTIFICATE-----
Not Before: Nov 10 00:00:00 2006 GMT
Not After : Nov 10 00:00:00 2031 GMT
Subject: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
Not Before: Nov 13 00:00:00 2012 GMT
Not After : Jan 19 03:14:07 2038 GMT
Subject: OU = GlobalSign ECC Root CA - R4, O = GlobalSign, CN = GlobalSign
-----BEGIN CERTIFICATE-----
MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
ewv4n4Q=
-----END CERTIFICATE-----
Not Before: Nov 1 00:00:42 2018 GMT
Not After : Nov 1 00:00:42 2042 GMT
Subject: C = US, O = Google Trust Services LLC, CN = GTS LTSR
-----BEGIN CERTIFICATE-----
MIIBxTCCAWugAwIBAgINAfD3nVndblD3QnNxUDAKBggqhkjOPQQDAjBEMQswCQYD
VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzERMA8G
A1UEAxMIR1RTIExUU1IwHhcNMTgxMTAxMDAwMDQyWhcNNDIxMTAxMDAwMDQyWjBE
MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
QzERMA8GA1UEAxMIR1RTIExUU1IwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATN
8YyO2u+yCQoZdwAkUNv5c3dokfULfrA6QJgFV2XMuENtQZIG5HUOS6jFn8f0ySlV
eORCxqFyjDJyRn86d+Iko0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUPv7/zFLrvzQ+PfNA0OQlsV+4u1IwCgYIKoZIzj0EAwID
SAAwRQIhAPKuf/VtBHqGw3TUwUIq7TfaExp3bH7bjCBmVXJupT9FAiBr0SmCtsuk
miGgpajjf/gFigGM34F9021bCWs1MbL0SA==
-----END CERTIFICATE-----
-1
View File
@@ -1 +0,0 @@
hi
View File
View File
-1
View File
@@ -1 +0,0 @@
foo
-1
View File
@@ -1 +0,0 @@
:-)
-12
View File
@@ -1,12 +0,0 @@
Http = {
onrcv: function(c, req) {
if (req.uri === '/data/js') {
// Send reply. We need to construct everything, headers and body
mg_send(c, 'HTTP/1.0 200 OK\r\n\r\n');
mg_send(c, JSON.stringify(req));
// Let Mongoose know we've handled the connection
return true;
}
}
}
-13
View File
@@ -1,13 +0,0 @@
------WebKitFormBoundaryh3pBS3C5nni6XxR4
Content-Disposition: form-data; name="file1"; filename="keyword.c"
Content-Type: application/octet-stream
file1 data
------WebKitFormBoundaryh3pBS3C5nni6XxR4
Content-Disposition: form-data; name="file2"; filename="stdarg.c"
Content-Type: application/octet-stream
file2 data
------WebKitFormBoundaryh3pBS3C5nni6XxR4--
-1
View File
@@ -1 +0,0 @@
foo_root
-1
View File
@@ -1 +0,0 @@
works
View File
-1
View File
@@ -1 +0,0 @@
a
-1
View File
@@ -1 +0,0 @@
<!--#include file="nested.shtml" -->
-3
View File
@@ -1,3 +0,0 @@
<!--#include file="f1.txt"-->
<b><!--#call foo(bar) --></b>
<!--#exec "echo b"-->
+943
View File
@@ -0,0 +1,943 @@
0000 82 7e 00 b3 7b 22 6d 65 74 68 6f 64 22 3a 22 62 .~..{"method":"b
0010 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 le.adv","params"
0020 3a 7b 22 61 64 64 72 22 3a 22 63 64 35 31 33 38 :{"addr":"cd5138
0030 35 35 35 36 61 36 22 2c 22 72 73 73 69 22 3a 2d 5556a6","rssi":-
0040 35 35 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 55,"adv":"020106
0050 31 62 66 66 34 63 30 30 30 32 31 35 62 37 37 39 1bff4c000215b779
0060 64 33 35 66 30 61 37 65 34 37 61 66 62 64 34 32 d35f0a7e47afbd42
0070 66 62 31 66 39 36 61 62 64 34 32 34 66 66 66 66 fb1f96abd424ffff
0080 66 66 66 66 63 36 36 34 22 2c 22 72 73 70 22 3a ffffc664","rsp":
0090 22 30 39 30 39 36 39 34 32 34 62 35 33 32 30 35 "090969424b53205
00a0 35 35 33 34 32 22 2c 22 74 22 3a 31 35 39 33 30 55342","t":15930
00b0 31 31 32 34 38 7d 7d 82 7e 00 93 7b 22 6d 65 74 11248}}.~..{"met
00c0 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 hod":"ble.adv","
00d0 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a params":{"addr":
00e0 22 66 34 37 63 64 39 62 36 32 63 62 39 22 2c 22 "f47cd9b62cb9","
00f0 72 73 73 69 22 3a 2d 37 39 2c 22 61 64 76 22 3a rssi":-79,"adv":
0100 22 30 32 30 31 30 36 30 64 31 36 36 61 66 65 30 "0201060d166afe0
0110 32 30 38 30 31 31 36 36 34 65 63 33 39 34 64 36 208011664ec394d6
0120 63 37 37 22 2c 22 72 73 70 22 3a 22 30 37 30 39 c77","rsp":"0709
0130 33 33 33 38 32 64 37 31 36 31 33 33 22 2c 22 74 33382d716133","t
0140 22 3a 31 35 39 33 30 31 31 32 34 38 7d 7d 82 7e ":1593011248}}.~
0150 00 99 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 ..{"method":"ble
0160 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b .adv","params":{
0170 22 61 64 64 72 22 3a 22 66 63 66 31 33 36 31 66 "addr":"fcf1361f
0180 62 39 36 65 22 2c 22 72 73 73 69 22 3a 2d 37 30 b96e","rssi":-70
0190 2c 22 61 64 76 22 3a 22 31 62 66 66 37 35 30 30 ,"adv":"1bff7500
01a0 34 32 30 34 30 31 38 30 32 30 66 63 66 31 33 36 4204018020fcf136
01b0 31 66 62 39 36 65 66 65 66 31 33 36 31 66 62 39 1fb96efef1361fb9
01c0 36 64 30 31 30 30 30 30 30 30 30 30 30 30 30 30 6d01000000000000
01d0 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 ","rsp":"","t":1
01e0 35 39 33 30 31 31 32 34 38 7d 7d 82 7d 7b 22 6d 593011248}}.}{"m
01f0 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 ethod":"ble.adv"
0200 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 ,"params":{"addr
0210 22 3a 22 35 63 66 63 34 35 62 33 32 64 61 31 22 ":"5cfc45b32da1"
0220 2c 22 72 73 73 69 22 3a 2d 35 30 2c 22 61 64 76 ,"rssi":-50,"adv
0230 22 3a 22 30 32 30 31 30 36 30 61 66 66 34 63 30 ":"0201060aff4c0
0240 30 31 30 30 35 30 62 31 63 32 30 37 37 65 63 22 010050b1c2077ec"
0250 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 ,"rsp":"","t":15
0260 39 33 30 31 31 32 34 38 7d 7d 82 7e 00 a5 7b 22 93011248}}.~..{"
0270 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 method":"ble.adv
0280 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 ","params":{"add
0290 72 22 3a 22 65 34 32 37 37 61 32 32 61 34 33 32 r":"e4277a22a432
02a0 22 2c 22 72 73 73 69 22 3a 2d 37 31 2c 22 61 64 ","rssi":-71,"ad
02b0 76 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 v":"0201060303aa
02c0 66 65 31 31 31 36 61 61 66 65 32 30 30 30 30 62 fe1116aafe20000b
02d0 38 35 31 36 34 62 30 32 37 34 38 38 62 37 30 36 85164b027488b706
02e0 36 32 31 38 65 30 22 2c 22 72 73 70 22 3a 22 30 6218e0","rsp":"0
02f0 38 30 39 36 39 34 32 34 62 35 33 33 31 33 30 33 80969424b5331303
0300 35 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 34 5","t":159301124
0310 38 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 6f 64 22 8}}.~..{"method"
0320 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 :"ble.adv","para
0330 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 31 31 ms":{"addr":"c11
0340 38 62 31 30 31 63 66 30 39 22 2c 22 72 73 73 69 8b101cf09","rssi
0350 22 3a 2d 37 39 2c 22 61 64 76 22 3a 22 30 32 30 ":-79,"adv":"020
0360 31 30 36 30 33 30 33 61 61 66 65 31 35 31 36 61 1060303aafe1516a
0370 61 66 65 30 30 64 63 31 31 31 31 31 31 31 31 35 afe00dc111111115
0380 35 35 35 35 35 35 35 36 36 36 36 63 35 66 35 30 55555556666c5f50
0390 30 30 30 63 35 66 35 22 2c 22 72 73 70 22 3a 22 000c5f5","rsp":"
03a0 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 34 38 ","t":1593011248
03b0 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a }}.~..{"method":
03c0 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d "ble.adv","param
03d0 73 22 3a 7b 22 61 64 64 72 22 3a 22 66 39 31 35 s":{"addr":"f915
03e0 64 61 39 31 32 39 37 32 22 2c 22 72 73 73 69 22 da912972","rssi"
03f0 3a 2d 37 38 2c 22 61 64 76 22 3a 22 30 32 30 31 :-78,"adv":"0201
0400 30 36 30 33 30 33 61 61 66 65 31 31 31 36 61 61 060303aafe1116aa
0410 66 65 32 30 30 30 30 62 38 34 31 36 34 30 30 39 fe20000b84164009
0420 35 64 39 38 36 64 30 36 38 39 30 62 34 63 22 2c 5d986d06890b4c",
0430 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 "rsp":"","t":159
0440 33 30 31 31 32 34 38 7d 7d 82 7e 00 99 7b 22 6d 3011248}}.~..{"m
0450 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 ethod":"ble.adv"
0460 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 ,"params":{"addr
0470 22 3a 22 66 63 66 31 33 36 31 66 62 39 36 65 22 ":"fcf1361fb96e"
0480 2c 22 72 73 73 69 22 3a 2d 36 36 2c 22 61 64 76 ,"rssi":-66,"adv
0490 22 3a 22 31 62 66 66 37 35 30 30 34 32 30 34 30 ":"1bff750042040
04a0 31 38 30 32 30 66 63 66 31 33 36 31 66 62 39 36 18020fcf1361fb96
04b0 65 66 65 66 31 33 36 31 66 62 39 36 64 30 31 30 efef1361fb96d010
04c0 30 30 30 30 30 30 30 30 30 30 30 22 2c 22 72 73 00000000000","rs
04d0 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 p":"","t":159301
04e0 31 32 34 38 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 1248}}.~..{"meth
04f0 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 od":"ble.adv","p
0500 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 arams":{"addr":"
0510 63 38 66 36 65 34 62 66 36 33 33 34 22 2c 22 72 c8f6e4bf6334","r
0520 73 73 69 22 3a 2d 39 33 2c 22 61 64 76 22 3a 22 ssi":-93,"adv":"
0530 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 31 0201060303aafe11
0540 31 36 61 61 66 65 32 30 30 30 30 62 61 65 31 62 16aafe20000bae1b
0550 34 30 30 39 35 30 65 36 64 34 30 36 37 61 66 36 400950e6d4067af6
0560 37 34 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 74","rsp":"","t"
0570 3a 31 35 39 33 30 31 31 32 34 38 7d 7d 82 7e 00 :1593011248}}.~.
0580 9b 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e .{"method":"ble.
0590 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 adv","params":{"
05a0 61 64 64 72 22 3a 22 63 65 37 33 65 63 66 37 65 addr":"ce73ecf7e
05b0 36 32 61 22 2c 22 72 73 73 69 22 3a 2d 38 34 2c 62a","rssi":-84,
05c0 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 "adv":"020106030
05d0 33 61 61 66 65 31 35 31 36 61 61 66 65 30 30 64 3aafe1516aafe00d
05e0 63 31 31 31 31 31 31 31 31 35 35 35 35 35 35 35 c111111115555555
05f0 35 36 36 36 36 64 35 66 35 30 30 30 30 64 35 66 56666d5f50000d5f
0600 35 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 5","rsp":"","t":
0610 31 35 39 33 30 31 31 32 34 38 7d 7d 82 7e 00 99 1593011248}}.~..
0620 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 {"method":"ble.a
0630 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 dv","params":{"a
0640 64 64 72 22 3a 22 66 63 66 31 33 36 31 66 62 39 ddr":"fcf1361fb9
0650 36 65 22 2c 22 72 73 73 69 22 3a 2d 37 31 2c 22 6e","rssi":-71,"
0660 61 64 76 22 3a 22 31 62 66 66 37 35 30 30 34 32 adv":"1bff750042
0670 30 34 30 31 38 30 32 30 66 63 66 31 33 36 31 66 04018020fcf1361f
0680 62 39 36 65 66 65 66 31 33 36 31 66 62 39 36 64 b96efef1361fb96d
0690 30 31 30 30 30 30 30 30 30 30 30 30 30 30 22 2c 01000000000000",
06a0 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 "rsp":"","t":159
06b0 33 30 31 31 32 34 38 7d 7d 82 7e 00 93 7b 22 6d 3011248}}.~..{"m
06c0 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 ethod":"ble.adv"
06d0 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 ,"params":{"addr
06e0 22 3a 22 64 35 64 62 66 38 61 64 39 32 33 39 22 ":"d5dbf8ad9239"
06f0 2c 22 72 73 73 69 22 3a 2d 38 38 2c 22 61 64 76 ,"rssi":-88,"adv
0700 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 66 ":"0201060303aaf
0710 65 31 31 31 36 61 61 66 65 32 30 30 30 30 62 30 e1116aafe20000b0
0720 61 31 39 63 30 30 39 35 64 64 66 61 31 30 36 38 a19c0095ddfa1068
0730 39 31 38 33 61 22 2c 22 72 73 70 22 3a 22 22 2c 9183a","rsp":"",
0740 22 74 22 3a 31 35 39 33 30 31 31 32 34 38 7d 7d "t":1593011248}}
0750 82 7e 00 b1 7b 22 6d 65 74 68 6f 64 22 3a 22 62 .~..{"method":"b
0760 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 le.adv","params"
0770 3a 7b 22 61 64 64 72 22 3a 22 65 34 32 37 37 61 :{"addr":"e4277a
0780 32 32 61 34 33 32 22 2c 22 72 73 73 69 22 3a 2d 22a432","rssi":-
0790 37 37 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 77,"adv":"020106
07a0 30 33 30 33 61 61 66 65 31 37 31 36 61 61 66 65 0303aafe1716aafe
07b0 30 30 64 35 31 31 31 31 31 32 32 32 32 32 33 33 00d5111112222233
07c0 33 33 33 34 34 34 34 34 61 35 66 35 61 35 66 35 33344444a5f5a5f5
07d0 61 35 66 35 30 30 30 30 22 2c 22 72 73 70 22 3a a5f50000","rsp":
07e0 22 30 38 30 39 36 39 34 32 34 62 35 33 33 31 33 "080969424b53313
07f0 30 33 35 22 2c 22 74 22 3a 31 35 39 33 30 31 31 035","t":1593011
0800 32 34 38 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 248}}.~..{"metho
0810 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 d":"ble.adv","pa
0820 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 rams":{"addr":"c
0830 31 31 38 62 31 30 31 63 66 30 39 22 2c 22 72 73 118b101cf09","rs
0840 73 69 22 3a 2d 38 33 2c 22 61 64 76 22 3a 22 30 si":-83,"adv":"0
0850 32 30 31 30 36 30 33 30 33 61 61 66 65 31 31 31 201060303aafe111
0860 36 61 61 66 65 32 30 30 30 30 62 37 34 31 37 38 6aafe20000b74178
0870 30 31 31 64 33 66 35 33 61 30 66 39 38 38 64 35 011d3f53a0f988d5
0880 32 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 2","rsp":"","t":
0890 31 35 39 33 30 31 31 32 34 38 7d 7d 82 7e 00 97 1593011248}}.~..
08a0 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 {"method":"ble.a
08b0 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 dv","params":{"a
08c0 64 64 72 22 3a 22 63 39 65 63 39 33 64 39 66 35 ddr":"c9ec93d9f5
08d0 38 65 22 2c 22 72 73 73 69 22 3a 2d 38 39 2c 22 8e","rssi":-89,"
08e0 61 64 76 22 3a 22 30 32 30 31 30 36 30 66 31 36 adv":"0201060f16
08f0 36 61 66 65 30 32 30 38 30 31 31 36 36 34 65 63 6afe0208011664ec
0900 36 34 37 34 37 35 34 66 33 38 36 33 22 2c 22 72 6474754f3863","r
0910 73 70 22 3a 22 30 37 30 39 33 33 33 35 32 64 37 sp":"070933352d7
0920 31 36 31 33 33 22 2c 22 74 22 3a 31 35 39 33 30 16133","t":15930
0930 31 31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 74 11249}}.~..{"met
0940 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 hod":"ble.adv","
0950 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a params":{"addr":
0960 22 66 39 31 35 64 61 39 31 32 39 37 32 22 2c 22 "f915da912972","
0970 72 73 73 69 22 3a 2d 38 38 2c 22 61 64 76 22 3a rssi":-88,"adv":
0980 22 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 "0201060303aafe1
0990 35 31 36 61 61 66 65 30 30 64 35 31 31 31 31 31 516aafe00d511111
09a0 31 31 31 35 35 35 35 35 35 35 35 36 36 36 36 30 1115555555566660
09b0 30 31 61 30 30 30 30 30 36 66 61 22 2c 22 72 73 01a000006fa","rs
09c0 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 p":"","t":159301
09d0 31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 1249}}.~..{"meth
09e0 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 od":"ble.adv","p
09f0 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 arams":{"addr":"
0a00 63 38 66 36 65 34 62 66 36 33 33 34 22 2c 22 72 c8f6e4bf6334","r
0a10 73 73 69 22 3a 2d 38 30 2c 22 61 64 76 22 3a 22 ssi":-80,"adv":"
0a20 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 35 0201060303aafe15
0a30 31 36 61 61 66 65 30 30 64 35 31 31 31 31 31 31 16aafe00d5111111
0a40 31 31 35 35 35 35 35 35 35 35 36 36 36 36 30 35 1155555555666605
0a50 31 39 30 30 30 30 30 30 30 37 22 2c 22 72 73 70 1900000007","rsp
0a60 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 ":"","t":1593011
0a70 32 34 39 7d 7d 82 7e 00 99 7b 22 6d 65 74 68 6f 249}}.~..{"metho
0a80 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 d":"ble.adv","pa
0a90 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 66 rams":{"addr":"f
0aa0 63 66 31 33 36 31 66 62 39 36 65 22 2c 22 72 73 cf1361fb96e","rs
0ab0 73 69 22 3a 2d 37 34 2c 22 61 64 76 22 3a 22 31 si":-74,"adv":"1
0ac0 62 66 66 37 35 30 30 34 32 30 34 30 31 38 30 32 bff7500420401802
0ad0 30 66 63 66 31 33 36 31 66 62 39 36 65 66 65 66 0fcf1361fb96efef
0ae0 31 33 36 31 66 62 39 36 64 30 31 30 30 30 30 30 1361fb96d0100000
0af0 30 30 30 30 30 30 30 22 2c 22 72 73 70 22 3a 22 0000000","rsp":"
0b00 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 34 39 ","t":1593011249
0b10 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a }}.~..{"method":
0b20 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d "ble.adv","param
0b30 73 22 3a 7b 22 61 64 64 72 22 3a 22 65 31 63 39 s":{"addr":"e1c9
0b40 32 65 62 62 63 34 66 64 22 2c 22 72 73 73 69 22 2ebbc4fd","rssi"
0b50 3a 2d 38 30 2c 22 61 64 76 22 3a 22 30 32 30 31 :-80,"adv":"0201
0b60 30 36 30 33 30 33 61 61 66 65 31 31 31 36 61 61 060303aafe1116aa
0b70 66 65 32 30 30 30 30 62 38 66 31 36 63 30 30 37 fe20000b8f16c007
0b80 31 66 34 36 62 37 30 36 33 61 35 31 62 65 22 2c 1f46b7063a51be",
0b90 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 "rsp":"","t":159
0ba0 33 30 31 31 32 34 39 7d 7d 82 7e 00 97 7b 22 6d 3011249}}.~..{"m
0bb0 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 ethod":"ble.adv"
0bc0 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 ,"params":{"addr
0bd0 22 3a 22 63 61 38 65 61 35 33 31 66 38 61 38 22 ":"ca8ea531f8a8"
0be0 2c 22 72 73 73 69 22 3a 2d 36 30 2c 22 61 64 76 ,"rssi":-60,"adv
0bf0 22 3a 22 30 32 30 31 30 36 30 66 31 36 36 61 66 ":"0201060f166af
0c00 65 30 32 30 38 30 31 31 36 36 34 65 63 34 61 37 e0208011664ec4a7
0c10 33 33 32 34 39 37 30 33 39 22 2c 22 72 73 70 22 332497039","rsp"
0c20 3a 22 30 37 30 39 33 31 33 38 32 64 37 31 36 31 :"070931382d7161
0c30 33 33 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 33","t":15930112
0c40 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 6f 64 49}}.~..{"method
0c50 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 ":"ble.adv","par
0c60 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 63 ams":{"addr":"cc
0c70 39 66 33 39 34 35 33 61 39 63 22 2c 22 72 73 73 9f39453a9c","rss
0c80 69 22 3a 2d 37 37 2c 22 61 64 76 22 3a 22 30 32 i":-77,"adv":"02
0c90 30 31 30 36 30 33 30 33 61 61 66 65 31 35 31 36 01060303aafe1516
0ca0 61 61 66 65 30 30 64 63 31 31 31 31 31 31 31 31 aafe00dc11111111
0cb0 35 35 35 35 35 35 35 35 36 36 36 36 37 37 37 65 555555556666777e
0cc0 30 30 30 30 30 30 31 65 22 2c 22 72 73 70 22 3a 0000001e","rsp":
0cd0 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 34 "","t":159301124
0ce0 39 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 9}}.~..{"method"
0cf0 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 :"ble.adv","para
0d00 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 65 63 39 ms":{"addr":"ec9
0d10 66 34 66 32 65 35 37 33 34 22 2c 22 72 73 73 69 f4f2e5734","rssi
0d20 22 3a 2d 39 32 2c 22 61 64 76 22 3a 22 30 32 30 ":-92,"adv":"020
0d30 31 30 36 30 33 30 33 61 61 66 65 31 31 31 36 61 1060303aafe1116a
0d40 61 66 65 32 30 30 30 30 62 30 62 31 37 63 30 30 afe20000b0b17c00
0d50 39 35 30 63 66 36 37 30 36 37 61 66 33 30 34 22 950cf67067af304"
0d60 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 ,"rsp":"","t":15
0d70 39 33 30 31 31 32 34 39 7d 7d 82 7e 00 97 7b 22 93011249}}.~..{"
0d80 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 method":"ble.adv
0d90 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 ","params":{"add
0da0 72 22 3a 22 63 65 31 31 34 37 30 66 35 32 32 33 r":"ce11470f5223
0db0 22 2c 22 72 73 73 69 22 3a 2d 38 33 2c 22 61 64 ","rssi":-83,"ad
0dc0 76 22 3a 22 30 32 30 31 30 36 30 66 31 36 36 61 v":"0201060f166a
0dd0 66 65 30 32 30 38 30 31 31 35 36 34 66 34 34 34 fe0208011564f444
0de0 37 34 35 31 35 30 34 34 34 37 22 2c 22 72 73 70 7451504447","rsp
0df0 22 3a 22 30 37 30 39 33 35 33 30 32 64 37 31 36 ":"070935302d716
0e00 31 33 33 22 2c 22 74 22 3a 31 35 39 33 30 31 31 133","t":1593011
0e10 32 34 39 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 249}}.~..{"metho
0e20 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 d":"ble.adv","pa
0e30 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 rams":{"addr":"c
0e40 35 31 36 30 32 64 35 64 35 63 39 22 2c 22 72 73 51602d5d5c9","rs
0e50 73 69 22 3a 2d 39 31 2c 22 61 64 76 22 3a 22 30 si":-91,"adv":"0
0e60 32 30 31 30 36 30 33 30 33 61 61 66 65 31 31 31 201060303aafe111
0e70 36 61 61 66 65 32 30 30 30 30 62 39 31 31 36 30 6aafe20000b91160
0e80 30 30 37 65 39 34 64 66 61 30 36 66 32 63 39 30 007e94dfa06f2c90
0e90 36 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 6","rsp":"","t":
0ea0 31 35 39 33 30 31 31 32 34 39 7d 7d 82 7d 7b 22 1593011249}}.}{"
0eb0 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 method":"ble.adv
0ec0 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 ","params":{"add
0ed0 72 22 3a 22 35 63 66 63 34 35 62 33 32 64 61 31 r":"5cfc45b32da1
0ee0 22 2c 22 72 73 73 69 22 3a 2d 35 30 2c 22 61 64 ","rssi":-50,"ad
0ef0 76 22 3a 22 30 32 30 31 30 36 30 61 66 66 34 63 v":"0201060aff4c
0f00 30 30 31 30 30 35 30 62 31 63 32 30 37 37 65 63 0010050b1c2077ec
0f10 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 ","rsp":"","t":1
0f20 35 39 33 30 31 31 32 34 39 7d 7d 82 7e 00 9b 7b 593011249}}.~..{
0f30 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 "method":"ble.ad
0f40 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 v","params":{"ad
0f50 64 72 22 3a 22 63 31 31 38 62 31 30 31 63 66 30 dr":"c118b101cf0
0f60 39 22 2c 22 72 73 73 69 22 3a 2d 38 32 2c 22 61 9","rssi":-82,"a
0f70 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 dv":"0201060303a
0f80 61 66 65 31 35 31 36 61 61 66 65 30 30 64 63 31 afe1516aafe00dc1
0f90 31 31 31 31 31 31 31 35 35 35 35 35 35 35 35 36 1111111555555556
0fa0 36 36 36 63 35 66 35 30 30 30 30 63 35 66 35 22 666c5f50000c5f5"
0fb0 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 ,"rsp":"","t":15
0fc0 39 33 30 31 31 32 34 39 7d 7d 82 7e 00 9b 7b 22 93011249}}.~..{"
0fd0 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 method":"ble.adv
0fe0 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 ","params":{"add
0ff0 72 22 3a 22 66 61 31 63 31 39 65 62 61 32 66 65 r":"fa1c19eba2fe
1000 22 2c 22 72 73 73 69 22 3a 2d 37 33 2c 22 61 64 ","rssi":-73,"ad
1010 76 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 v":"0201060303aa
1020 66 65 31 35 31 36 61 61 66 65 30 30 64 63 31 31 fe1516aafe00dc11
1030 31 31 31 31 31 31 35 35 35 35 35 35 35 35 36 36 1111115555555566
1040 36 36 34 39 34 39 30 30 30 30 34 39 34 39 22 2c 66494900004949",
1050 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 "rsp":"","t":159
1060 33 30 31 31 32 34 39 7d 7d 82 7e 00 b3 7b 22 6d 3011249}}.~..{"m
1070 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 ethod":"ble.adv"
1080 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 ,"params":{"addr
1090 22 3a 22 63 64 35 31 33 38 35 35 35 36 61 36 22 ":"cd51385556a6"
10a0 2c 22 72 73 73 69 22 3a 2d 35 38 2c 22 61 64 76 ,"rssi":-58,"adv
10b0 22 3a 22 30 32 30 31 30 36 31 62 66 66 34 63 30 ":"0201061bff4c0
10c0 30 30 32 31 35 62 37 37 39 64 33 35 66 30 61 37 00215b779d35f0a7
10d0 65 34 37 61 66 62 64 34 32 66 62 31 66 39 36 61 e47afbd42fb1f96a
10e0 62 64 34 32 34 66 66 66 66 66 66 66 66 63 36 36 bd424ffffffffc66
10f0 34 22 2c 22 72 73 70 22 3a 22 30 39 30 39 36 39 4","rsp":"090969
1100 34 32 34 62 35 33 32 30 35 35 35 33 34 32 22 2c 424b5320555342",
1110 22 74 22 3a 31 35 39 33 30 31 31 32 34 39 7d 7d "t":1593011249}}
1120 82 7e 00 ad 7b 22 6d 65 74 68 6f 64 22 3a 22 62 .~..{"method":"b
1130 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 le.adv","params"
1140 3a 7b 22 61 64 64 72 22 3a 22 65 38 36 66 38 63 :{"addr":"e86f8c
1150 63 63 34 64 36 39 22 2c 22 72 73 73 69 22 3a 2d cc4d69","rssi":-
1160 37 31 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 71,"adv":"020106
1170 30 39 66 66 35 39 30 30 65 38 36 66 38 63 63 63 09ff5900e86f8ccc
1180 34 64 36 39 22 2c 22 72 73 70 22 3a 22 31 31 30 4d69","rsp":"110
1190 37 31 62 63 35 64 35 61 35 30 32 30 30 62 38 39 71bc5d5a50200b89
11a0 66 65 36 31 31 34 64 32 32 30 30 30 64 61 32 63 fe6114d22000da2c
11b0 62 30 36 31 36 30 30 30 64 34 38 30 30 36 33 22 b0616000d480063"
11c0 2c 22 74 22 3a 31 35 39 33 30 31 31 32 34 39 7d ,"t":1593011249}
11d0 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22 }.~..{"method":"
11e0 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 ble.adv","params
11f0 22 3a 7b 22 61 64 64 72 22 3a 22 63 38 66 36 65 ":{"addr":"c8f6e
1200 34 62 66 36 33 33 34 22 2c 22 72 73 73 69 22 3a 4bf6334","rssi":
1210 2d 39 30 2c 22 61 64 76 22 3a 22 30 32 30 31 30 -90,"adv":"02010
1220 36 30 33 30 33 61 61 66 65 31 31 31 36 61 61 66 60303aafe1116aaf
1230 65 32 30 30 30 30 62 61 65 31 62 34 30 30 39 35 e20000bae1b40095
1240 30 65 36 64 64 30 36 37 61 66 36 37 65 22 2c 22 0e6dd067af67e","
1250 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 rsp":"","t":1593
1260 30 31 31 32 34 39 7d 7d 82 7e 00 93 7b 22 6d 65 011249}}.~..{"me
1270 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c thod":"ble.adv",
1280 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 "params":{"addr"
1290 3a 22 66 34 37 63 64 39 62 36 32 63 62 39 22 2c :"f47cd9b62cb9",
12a0 22 72 73 73 69 22 3a 2d 39 32 2c 22 61 64 76 22 "rssi":-92,"adv"
12b0 3a 22 30 32 30 31 30 36 30 64 31 36 36 61 66 65 :"0201060d166afe
12c0 30 32 30 38 30 31 31 36 36 34 65 63 33 39 34 64 0208011664ec394d
12d0 36 63 37 37 22 2c 22 72 73 70 22 3a 22 30 37 30 6c77","rsp":"070
12e0 39 33 33 33 38 32 64 37 31 36 31 33 33 22 2c 22 933382d716133","
12f0 74 22 3a 31 35 39 33 30 31 31 32 34 39 7d 7d 82 t":1593011249}}.
1300 7e 00 b3 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c ~..{"method":"bl
1310 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a e.adv","params":
1320 7b 22 61 64 64 72 22 3a 22 63 64 35 31 33 38 35 {"addr":"cd51385
1330 35 35 36 61 36 22 2c 22 72 73 73 69 22 3a 2d 35 556a6","rssi":-5
1340 35 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 31 5,"adv":"0201061
1350 62 66 66 34 63 30 30 30 32 31 35 62 37 37 39 64 bff4c000215b779d
1360 33 35 66 30 61 37 65 34 37 61 66 62 64 34 32 66 35f0a7e47afbd42f
1370 62 31 66 39 36 61 62 64 34 32 34 66 66 66 66 66 b1f96abd424fffff
1380 66 66 66 63 36 36 34 22 2c 22 72 73 70 22 3a 22 fffc664","rsp":"
1390 30 39 30 39 36 39 34 32 34 62 35 33 32 30 35 35 090969424b532055
13a0 35 33 34 32 22 2c 22 74 22 3a 31 35 39 33 30 31 5342","t":159301
13b0 31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 1249}}.~..{"meth
13c0 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 od":"ble.adv","p
13d0 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 arams":{"addr":"
13e0 63 65 37 33 65 63 66 37 65 36 32 61 22 2c 22 72 ce73ecf7e62a","r
13f0 73 73 69 22 3a 2d 38 32 2c 22 61 64 76 22 3a 22 ssi":-82,"adv":"
1400 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 35 0201060303aafe15
1410 31 36 61 61 66 65 30 30 64 63 31 31 31 31 31 31 16aafe00dc111111
1420 31 31 35 35 35 35 35 35 35 35 36 36 36 36 64 35 11555555556666d5
1430 66 35 30 30 30 30 64 35 66 35 22 2c 22 72 73 70 f50000d5f5","rsp
1440 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 ":"","t":1593011
1450 32 34 39 7d 7d 82 7e 00 ad 7b 22 6d 65 74 68 6f 249}}.~..{"metho
1460 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 d":"ble.adv","pa
1470 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 64 rams":{"addr":"d
1480 66 65 35 61 30 66 39 65 30 65 35 22 2c 22 72 73 fe5a0f9e0e5","rs
1490 73 69 22 3a 2d 37 30 2c 22 61 64 76 22 3a 22 30 si":-70,"adv":"0
14a0 32 30 31 30 36 30 39 66 66 35 39 30 30 64 66 65 2010609ff5900dfe
14b0 35 61 30 66 39 65 30 65 35 22 2c 22 72 73 70 22 5a0f9e0e5","rsp"
14c0 3a 22 31 31 30 37 31 62 63 35 64 35 61 35 30 32 :"11071bc5d5a502
14d0 30 30 62 38 39 66 65 36 31 31 34 64 32 32 30 30 00b89fe6114d2200
14e0 30 64 61 32 63 62 30 36 31 36 30 30 30 64 34 38 0da2cb0616000d48
14f0 30 30 36 33 22 2c 22 74 22 3a 31 35 39 33 30 31 0063","t":159301
1500 31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 1249}}.~..{"meth
1510 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 od":"ble.adv","p
1520 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 arams":{"addr":"
1530 65 31 63 39 32 65 62 62 63 34 66 64 22 2c 22 72 e1c92ebbc4fd","r
1540 73 73 69 22 3a 2d 38 30 2c 22 61 64 76 22 3a 22 ssi":-80,"adv":"
1550 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 35 0201060303aafe15
1560 31 36 61 61 66 65 30 30 64 35 31 31 31 31 31 31 16aafe00d5111111
1570 31 31 35 35 35 35 35 35 35 35 36 36 36 36 35 37 1155555555666657
1580 34 30 30 30 30 30 30 30 32 30 22 2c 22 72 73 70 4000000020","rsp
1590 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 ":"","t":1593011
15a0 32 34 39 7d 7d 82 7e 00 b1 7b 22 6d 65 74 68 6f 249}}.~..{"metho
15b0 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 d":"ble.adv","pa
15c0 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 65 rams":{"addr":"e
15d0 34 32 37 37 61 32 32 61 34 33 32 22 2c 22 72 73 4277a22a432","rs
15e0 73 69 22 3a 2d 37 30 2c 22 61 64 76 22 3a 22 30 si":-70,"adv":"0
15f0 32 30 31 30 36 30 33 30 33 61 61 66 65 31 37 31 201060303aafe171
1600 36 61 61 66 65 30 30 64 35 31 31 31 31 31 32 32 6aafe00d51111122
1610 32 32 32 33 33 33 33 33 34 34 34 34 34 61 35 66 2223333344444a5f
1620 35 61 35 66 35 61 35 66 35 30 30 30 30 22 2c 22 5a5f5a5f50000","
1630 72 73 70 22 3a 22 30 38 30 39 36 39 34 32 34 62 rsp":"080969424b
1640 35 33 33 31 33 30 33 35 22 2c 22 74 22 3a 31 35 53313035","t":15
1650 39 33 30 31 31 32 34 39 7d 7d 82 7e 00 ab 7b 22 93011249}}.~..{"
1660 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 method":"ble.adv
1670 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 ","params":{"add
1680 72 22 3a 22 63 35 31 39 66 61 64 66 31 66 61 30 r":"c519fadf1fa0
1690 22 2c 22 72 73 73 69 22 3a 2d 36 33 2c 22 61 64 ","rssi":-63,"ad
16a0 76 22 3a 22 30 32 30 31 30 36 30 39 66 66 35 39 v":"02010609ff59
16b0 30 30 63 35 31 39 66 61 64 66 31 66 61 30 22 2c 00c519fadf1fa0",
16c0 22 72 73 70 22 3a 22 31 31 30 37 31 62 63 35 64 "rsp":"11071bc5d
16d0 35 61 35 30 32 30 30 62 38 39 66 65 36 31 31 34 5a50200b89fe6114
16e0 64 32 32 30 30 30 64 61 32 63 62 30 35 31 36 30 d22000da2cb05160
16f0 30 30 64 36 64 30 30 22 2c 22 74 22 3a 31 35 39 00d6d00","t":159
1700 33 30 31 31 32 34 39 7d 7d 82 7e 00 93 7b 22 6d 3011249}}.~..{"m
1710 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 ethod":"ble.adv"
1720 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 ,"params":{"addr
1730 22 3a 22 63 31 31 38 62 31 30 31 63 66 30 39 22 ":"c118b101cf09"
1740 2c 22 72 73 73 69 22 3a 2d 37 38 2c 22 61 64 76 ,"rssi":-78,"adv
1750 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 66 ":"0201060303aaf
1760 65 31 31 31 36 61 61 66 65 32 30 30 30 30 62 37 e1116aafe20000b7
1770 34 31 37 38 30 31 31 64 33 66 35 34 33 30 66 39 4178011d3f5430f9
1780 38 38 64 35 63 22 2c 22 72 73 70 22 3a 22 22 2c 88d5c","rsp":"",
1790 22 74 22 3a 31 35 39 33 30 31 31 32 34 39 7d 7d "t":1593011249}}
17a0 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22 62 .~..{"method":"b
17b0 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 le.adv","params"
17c0 3a 7b 22 61 64 64 72 22 3a 22 64 34 65 64 35 65 :{"addr":"d4ed5e
17d0 66 34 33 66 39 63 22 2c 22 72 73 73 69 22 3a 2d f43f9c","rssi":-
17e0 38 35 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 85,"adv":"020106
17f0 30 33 30 33 61 61 66 65 31 31 31 36 61 61 66 65 0303aafe1116aafe
1800 32 30 30 30 30 62 38 37 31 39 38 30 30 32 35 61 20000b871980025a
1810 35 38 62 61 30 32 30 65 61 32 35 63 22 2c 22 72 58ba020ea25c","r
1820 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 sp":"","t":15930
1830 31 31 32 34 39 7d 7d 82 7e 00 93 7b 22 6d 65 74 11249}}.~..{"met
1840 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 hod":"ble.adv","
1850 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a params":{"addr":
1860 22 66 61 31 63 31 39 65 62 61 32 66 65 22 2c 22 "fa1c19eba2fe","
1870 72 73 73 69 22 3a 2d 37 36 2c 22 61 64 76 22 3a rssi":-76,"adv":
1880 22 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 "0201060303aafe1
1890 31 31 36 61 61 66 65 32 30 30 30 30 62 39 35 31 116aafe20000b951
18a0 38 34 30 30 39 32 34 36 30 62 37 30 38 34 37 63 840092460b70847c
18b0 62 62 63 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 bbc","rsp":"","t
18c0 22 3a 31 35 39 33 30 31 31 32 34 39 7d 7d 82 7e ":1593011249}}.~
18d0 00 97 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 ..{"method":"ble
18e0 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b .adv","params":{
18f0 22 61 64 64 72 22 3a 22 65 62 36 38 30 63 63 62 "addr":"eb680ccb
1900 62 33 63 66 22 2c 22 72 73 73 69 22 3a 2d 38 32 b3cf","rssi":-82
1910 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 66 ,"adv":"0201060f
1920 31 36 36 61 66 65 30 32 30 38 30 31 31 36 36 34 166afe0208011664
1930 66 34 35 33 37 34 34 32 36 31 35 37 35 34 22 2c f4537442615754",
1940 22 72 73 70 22 3a 22 30 37 30 39 33 35 33 32 32 "rsp":"070935322
1950 64 37 31 36 31 33 33 22 2c 22 74 22 3a 31 35 39 d716133","t":159
1960 33 30 31 31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 3011249}}.~..{"m
1970 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 ethod":"ble.adv"
1980 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 ,"params":{"addr
1990 22 3a 22 63 63 39 66 33 39 34 35 33 61 39 63 22 ":"cc9f39453a9c"
19a0 2c 22 72 73 73 69 22 3a 2d 38 32 2c 22 61 64 76 ,"rssi":-82,"adv
19b0 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 66 ":"0201060303aaf
19c0 65 31 35 31 36 61 61 66 65 30 30 64 63 31 31 31 e1516aafe00dc111
19d0 31 31 31 31 31 35 35 35 35 35 35 35 35 36 36 36 1111155555555666
19e0 36 37 37 37 65 30 30 30 30 30 30 31 65 22 2c 22 6777e0000001e","
19f0 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 rsp":"","t":1593
1a00 30 31 31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 011249}}.~..{"me
1a10 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c thod":"ble.adv",
1a20 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 "params":{"addr"
1a30 3a 22 66 31 65 31 64 63 65 63 64 36 38 34 22 2c :"f1e1dcecd684",
1a40 22 72 73 73 69 22 3a 2d 36 31 2c 22 61 64 76 22 "rssi":-61,"adv"
1a50 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 66 65 :"0201060303aafe
1a60 31 35 31 36 61 61 66 65 30 30 64 35 31 31 31 31 1516aafe00d51111
1a70 31 31 31 31 35 35 35 35 35 35 35 35 36 36 36 36 1111555555556666
1a80 64 35 34 37 30 30 30 30 30 30 32 63 22 2c 22 72 d5470000002c","r
1a90 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 sp":"","t":15930
1aa0 31 31 32 35 30 7d 7d 82 7e 00 93 7b 22 6d 65 74 11250}}.~..{"met
1ab0 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 hod":"ble.adv","
1ac0 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a params":{"addr":
1ad0 22 63 38 66 36 65 34 62 66 36 33 33 34 22 2c 22 "c8f6e4bf6334","
1ae0 72 73 73 69 22 3a 2d 37 39 2c 22 61 64 76 22 3a rssi":-79,"adv":
1af0 22 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 "0201060303aafe1
1b00 31 31 36 61 61 66 65 32 30 30 30 30 62 61 65 31 116aafe20000bae1
1b10 62 34 30 30 39 35 30 65 36 65 39 30 36 37 61 66 b400950e6e9067af
1b20 36 38 38 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 688","rsp":"","t
1b30 22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e ":1593011250}}.~
1b40 00 b3 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 ..{"method":"ble
1b50 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b .adv","params":{
1b60 22 61 64 64 72 22 3a 22 63 64 35 31 33 38 35 35 "addr":"cd513855
1b70 35 36 61 36 22 2c 22 72 73 73 69 22 3a 2d 35 34 56a6","rssi":-54
1b80 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 31 62 ,"adv":"0201061b
1b90 66 66 34 63 30 30 30 32 31 35 62 37 37 39 64 33 ff4c000215b779d3
1ba0 35 66 30 61 37 65 34 37 61 66 62 64 34 32 66 62 5f0a7e47afbd42fb
1bb0 31 66 39 36 61 62 64 34 32 34 66 66 66 66 66 66 1f96abd424ffffff
1bc0 66 66 63 36 36 34 22 2c 22 72 73 70 22 3a 22 30 ffc664","rsp":"0
1bd0 39 30 39 36 39 34 32 34 62 35 33 32 30 35 35 35 90969424b5320555
1be0 33 34 32 22 2c 22 74 22 3a 31 35 39 33 30 31 31 342","t":1593011
1bf0 32 35 30 7d 7d 82 7e 00 97 7b 22 6d 65 74 68 6f 250}}.~..{"metho
1c00 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 d":"ble.adv","pa
1c10 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 rams":{"addr":"c
1c20 61 38 65 61 35 33 31 66 38 61 38 22 2c 22 72 73 a8ea531f8a8","rs
1c30 73 69 22 3a 2d 36 34 2c 22 61 64 76 22 3a 22 30 si":-64,"adv":"0
1c40 32 30 31 30 36 30 66 31 36 36 61 66 65 30 32 30 201060f166afe020
1c50 38 30 31 31 36 36 34 65 63 34 61 37 33 33 32 34 8011664ec4a73324
1c60 39 37 30 33 39 22 2c 22 72 73 70 22 3a 22 30 37 97039","rsp":"07
1c70 30 39 33 31 33 38 32 64 37 31 36 31 33 33 22 2c 0931382d716133",
1c80 22 74 22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d "t":1593011250}}
1c90 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22 62 .~..{"method":"b
1ca0 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 le.adv","params"
1cb0 3a 7b 22 61 64 64 72 22 3a 22 63 63 39 66 33 39 :{"addr":"cc9f39
1cc0 34 35 33 61 39 63 22 2c 22 72 73 73 69 22 3a 2d 453a9c","rssi":-
1cd0 37 38 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 78,"adv":"020106
1ce0 30 33 30 33 61 61 66 65 31 31 31 36 61 61 66 65 0303aafe1116aafe
1cf0 32 30 30 30 30 62 35 35 31 61 38 30 30 31 66 66 20000b551a8001ff
1d00 30 63 66 38 30 31 62 66 31 32 64 63 22 2c 22 72 0cf801bf12dc","r
1d10 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 sp":"","t":15930
1d20 31 31 32 35 30 7d 7d 82 7e 00 97 7b 22 6d 65 74 11250}}.~..{"met
1d30 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 hod":"ble.adv","
1d40 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a params":{"addr":
1d50 22 63 65 31 31 34 37 30 66 35 32 32 33 22 2c 22 "ce11470f5223","
1d60 72 73 73 69 22 3a 2d 37 38 2c 22 61 64 76 22 3a rssi":-78,"adv":
1d70 22 30 32 30 31 30 36 30 66 31 36 36 61 66 65 30 "0201060f166afe0
1d80 32 30 38 30 31 31 35 36 34 66 34 34 34 37 34 35 208011564f444745
1d90 31 35 30 34 34 34 37 22 2c 22 72 73 70 22 3a 22 1504447","rsp":"
1da0 30 37 30 39 33 35 33 30 32 64 37 31 36 31 33 33 070935302d716133
1db0 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 30 ","t":1593011250
1dc0 7d 7d 82 7e 00 91 7b 22 6d 65 74 68 6f 64 22 3a }}.~..{"method":
1dd0 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d "ble.adv","param
1de0 73 22 3a 7b 22 61 64 64 72 22 3a 22 66 38 37 38 s":{"addr":"f878
1df0 31 66 38 33 31 61 63 33 22 2c 22 72 73 73 69 22 1f831ac3","rssi"
1e00 3a 2d 38 37 2c 22 61 64 76 22 3a 22 30 32 30 31 :-87,"adv":"0201
1e10 30 36 30 64 31 36 36 61 66 65 30 32 30 38 30 31 060d166afe020801
1e20 31 36 35 62 65 63 35 36 35 34 36 34 33 33 22 2c 165bec56546433",
1e30 22 72 73 70 22 3a 22 30 36 30 39 33 35 32 64 37 "rsp":"0609352d7
1e40 31 36 31 33 33 22 2c 22 74 22 3a 31 35 39 33 30 16133","t":15930
1e50 31 31 32 35 30 7d 7d 82 7e 00 ab 7b 22 6d 65 74 11250}}.~..{"met
1e60 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 hod":"ble.adv","
1e70 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a params":{"addr":
1e80 22 63 35 31 39 66 61 64 66 31 66 61 30 22 2c 22 "c519fadf1fa0","
1e90 72 73 73 69 22 3a 2d 37 32 2c 22 61 64 76 22 3a rssi":-72,"adv":
1ea0 22 30 32 30 31 30 36 30 39 66 66 35 39 30 30 63 "02010609ff5900c
1eb0 35 31 39 66 61 64 66 31 66 61 30 22 2c 22 72 73 519fadf1fa0","rs
1ec0 70 22 3a 22 31 31 30 37 31 62 63 35 64 35 61 35 p":"11071bc5d5a5
1ed0 30 32 30 30 62 38 39 66 65 36 31 31 34 64 32 32 0200b89fe6114d22
1ee0 30 30 30 64 61 32 63 62 30 35 31 36 30 30 30 64 000da2cb0516000d
1ef0 36 64 30 30 22 2c 22 74 22 3a 31 35 39 33 30 31 6d00","t":159301
1f00 31 32 35 30 7d 7d 82 7e 00 b1 7b 22 6d 65 74 68 1250}}.~..{"meth
1f10 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 od":"ble.adv","p
1f20 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 arams":{"addr":"
1f30 65 34 32 37 37 61 32 32 61 34 33 32 22 2c 22 72 e4277a22a432","r
1f40 73 73 69 22 3a 2d 37 30 2c 22 61 64 76 22 3a 22 ssi":-70,"adv":"
1f50 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 37 0201060303aafe17
1f60 31 36 61 61 66 65 30 30 64 35 31 31 31 31 31 32 16aafe00d5111112
1f70 32 32 32 32 33 33 33 33 33 34 34 34 34 34 61 35 22223333344444a5
1f80 66 35 61 35 66 35 61 35 66 35 30 30 30 30 22 2c f5a5f5a5f50000",
1f90 22 72 73 70 22 3a 22 30 38 30 39 36 39 34 32 34 "rsp":"080969424
1fa0 62 35 33 33 31 33 30 33 35 22 2c 22 74 22 3a 31 b53313035","t":1
1fb0 35 39 33 30 31 31 32 35 30 7d 7d 82 7d 7b 22 6d 593011250}}.}{"m
1fc0 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 ethod":"ble.adv"
1fd0 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 ,"params":{"addr
1fe0 22 3a 22 35 63 66 63 34 35 62 33 32 64 61 31 22 ":"5cfc45b32da1"
1ff0 2c 22 72 73 73 69 22 3a 2d 35 39 2c 22 61 64 76 ,"rssi":-59,"adv
0000 22 3a 22 30 32 30 31 30 36 30 61 66 66 34 63 30 ":"0201060aff4c0
0010 30 31 30 30 35 30 62 31 63 32 30 37 37 65 63 22 010050b1c2077ec"
0020 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 ,"rsp":"","t":15
0030 39 33 30 31 31 32 35 30 7d 7d 82 7e 00 b3 7b 22 93011250}}.~..{"
0040 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 method":"ble.adv
0050 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 ","params":{"add
0060 72 22 3a 22 63 64 35 31 33 38 35 35 35 36 61 36 r":"cd51385556a6
0070 22 2c 22 72 73 73 69 22 3a 2d 35 37 2c 22 61 64 ","rssi":-57,"ad
0080 76 22 3a 22 30 32 30 31 30 36 31 62 66 66 34 63 v":"0201061bff4c
0090 30 30 30 32 31 35 62 37 37 39 64 33 35 66 30 61 000215b779d35f0a
00a0 37 65 34 37 61 66 62 64 34 32 66 62 31 66 39 36 7e47afbd42fb1f96
00b0 61 62 64 34 32 34 66 66 66 66 66 66 66 66 63 36 abd424ffffffffc6
00c0 36 34 22 2c 22 72 73 70 22 3a 22 30 39 30 39 36 64","rsp":"09096
00d0 39 34 32 34 62 35 33 32 30 35 35 35 33 34 32 22 9424b5320555342"
00e0 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 30 7d ,"t":1593011250}
00f0 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22 }.~..{"method":"
0100 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 ble.adv","params
0110 22 3a 7b 22 61 64 64 72 22 3a 22 66 61 31 63 31 ":{"addr":"fa1c1
0120 39 65 62 61 32 66 65 22 2c 22 72 73 73 69 22 3a 9eba2fe","rssi":
0130 2d 37 33 2c 22 61 64 76 22 3a 22 30 32 30 31 30 -73,"adv":"02010
0140 36 30 33 30 33 61 61 66 65 31 31 31 36 61 61 66 60303aafe1116aaf
0150 65 32 30 30 30 30 62 39 35 31 38 34 30 30 39 32 e20000b951840092
0160 34 36 30 63 30 30 38 34 37 63 62 62 63 22 2c 22 460c00847cbbc","
0170 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 rsp":"","t":1593
0180 30 31 31 32 35 30 7d 7d 82 7e 00 93 7b 22 6d 65 011250}}.~..{"me
0190 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c thod":"ble.adv",
01a0 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 "params":{"addr"
01b0 3a 22 66 31 65 31 64 63 65 63 64 36 38 34 22 2c :"f1e1dcecd684",
01c0 22 72 73 73 69 22 3a 2d 36 36 2c 22 61 64 76 22 "rssi":-66,"adv"
01d0 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 66 65 :"0201060303aafe
01e0 31 31 31 36 61 61 66 65 32 30 30 30 30 62 38 30 1116aafe20000b80
01f0 31 36 63 30 30 37 65 39 35 37 33 66 30 36 66 32 16c007e9573f06f2
0200 63 64 64 65 22 2c 22 72 73 70 22 3a 22 22 2c 22 cdde","rsp":"","
0210 74 22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 t":1593011250}}.
0220 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c ~..{"method":"bl
0230 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a e.adv","params":
0240 7b 22 61 64 64 72 22 3a 22 63 34 63 35 66 65 37 {"addr":"c4c5fe7
0250 37 34 31 66 39 22 2c 22 72 73 73 69 22 3a 2d 39 741f9","rssi":-9
0260 30 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 0,"adv":"0201060
0270 64 31 36 36 61 66 65 30 32 30 38 30 31 31 36 35 d166afe020801165
0280 62 65 63 37 61 36 38 37 32 34 64 22 2c 22 72 73 bec7a68724d","rs
0290 70 22 3a 22 30 37 30 39 33 33 33 39 32 64 37 31 p":"070933392d71
02a0 36 31 33 33 22 2c 22 74 22 3a 31 35 39 33 30 31 6133","t":159301
02b0 31 32 35 30 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 1250}}.~..{"meth
02c0 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 od":"ble.adv","p
02d0 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 arams":{"addr":"
02e0 66 34 37 63 64 39 62 36 32 63 62 39 22 2c 22 72 f47cd9b62cb9","r
02f0 73 73 69 22 3a 2d 39 30 2c 22 61 64 76 22 3a 22 ssi":-90,"adv":"
0300 30 32 30 31 30 36 30 64 31 36 36 61 66 65 30 32 0201060d166afe02
0310 30 38 30 31 31 36 36 34 65 63 33 39 34 64 36 63 08011664ec394d6c
0320 37 37 22 2c 22 72 73 70 22 3a 22 30 37 30 39 33 77","rsp":"07093
0330 33 33 38 32 64 37 31 36 31 33 33 22 2c 22 74 22 3382d716133","t"
0340 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e 00 :1593011250}}.~.
0350 9b 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e .{"method":"ble.
0360 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 adv","params":{"
0370 61 64 64 72 22 3a 22 63 38 66 36 65 34 62 66 36 addr":"c8f6e4bf6
0380 33 33 34 22 2c 22 72 73 73 69 22 3a 2d 38 38 2c 334","rssi":-88,
0390 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 "adv":"020106030
03a0 33 61 61 66 65 31 35 31 36 61 61 66 65 30 30 64 3aafe1516aafe00d
03b0 35 31 31 31 31 31 31 31 31 35 35 35 35 35 35 35 5111111115555555
03c0 35 36 36 36 36 30 35 31 39 30 30 30 30 30 30 30 5666605190000000
03d0 37 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 7","rsp":"","t":
03e0 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e 00 b3 1593011250}}.~..
03f0 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 {"method":"ble.a
0400 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 dv","params":{"a
0410 64 64 72 22 3a 22 63 64 35 31 33 38 35 35 35 36 ddr":"cd51385556
0420 61 36 22 2c 22 72 73 73 69 22 3a 2d 35 35 2c 22 a6","rssi":-55,"
0430 61 64 76 22 3a 22 30 32 30 31 30 36 31 62 66 66 adv":"0201061bff
0440 34 63 30 30 30 32 31 35 62 37 37 39 64 33 35 66 4c000215b779d35f
0450 30 61 37 65 34 37 61 66 62 64 34 32 66 62 31 66 0a7e47afbd42fb1f
0460 39 36 61 62 64 34 32 34 66 66 66 66 66 66 66 66 96abd424ffffffff
0470 63 36 36 34 22 2c 22 72 73 70 22 3a 22 30 39 30 c664","rsp":"090
0480 39 36 39 34 32 34 62 35 33 32 30 35 35 35 33 34 969424b532055534
0490 32 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 2","t":159301125
04a0 30 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 0}}.~..{"method"
04b0 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 :"ble.adv","para
04c0 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 65 37 ms":{"addr":"ce7
04d0 33 65 63 66 37 65 36 32 61 22 2c 22 72 73 73 69 3ecf7e62a","rssi
04e0 22 3a 2d 38 34 2c 22 61 64 76 22 3a 22 30 32 30 ":-84,"adv":"020
04f0 31 30 36 30 33 30 33 61 61 66 65 31 31 31 36 61 1060303aafe1116a
0500 61 66 65 32 30 30 30 30 62 38 64 31 38 34 30 30 afe20000b8d18400
0510 32 35 38 65 31 34 35 30 32 30 64 61 37 64 30 22 258e145020da7d0"
0520 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 ,"rsp":"","t":15
0530 39 33 30 31 31 32 35 30 7d 7d 82 7e 00 99 7b 22 93011250}}.~..{"
0540 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 method":"ble.adv
0550 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 ","params":{"add
0560 72 22 3a 22 66 63 66 31 33 36 31 66 62 39 36 65 r":"fcf1361fb96e
0570 22 2c 22 72 73 73 69 22 3a 2d 36 38 2c 22 61 64 ","rssi":-68,"ad
0580 76 22 3a 22 31 62 66 66 37 35 30 30 34 32 30 34 v":"1bff75004204
0590 30 31 38 30 32 30 66 63 66 31 33 36 31 66 62 39 018020fcf1361fb9
05a0 36 65 66 65 66 31 33 36 31 66 62 39 36 64 30 31 6efef1361fb96d01
05b0 30 30 30 30 30 30 30 30 30 30 30 30 22 2c 22 72 000000000000","r
05c0 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 sp":"","t":15930
05d0 31 31 32 35 30 7d 7d 82 7e 00 93 7b 22 6d 65 74 11250}}.~..{"met
05e0 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 hod":"ble.adv","
05f0 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a params":{"addr":
0600 22 65 31 63 39 32 65 62 62 63 34 66 64 22 2c 22 "e1c92ebbc4fd","
0610 72 73 73 69 22 3a 2d 38 30 2c 22 61 64 76 22 3a rssi":-80,"adv":
0620 22 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 "0201060303aafe1
0630 31 31 36 61 61 66 65 32 30 30 30 30 62 38 66 31 116aafe20000b8f1
0640 36 63 30 30 37 31 66 34 36 63 39 30 36 33 61 35 6c0071f46c9063a5
0650 31 63 38 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 1c8","rsp":"","t
0660 22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e ":1593011250}}.~
0670 00 9b 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 ..{"method":"ble
0680 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b .adv","params":{
0690 22 61 64 64 72 22 3a 22 63 63 39 66 33 39 34 35 "addr":"cc9f3945
06a0 33 61 39 63 22 2c 22 72 73 73 69 22 3a 2d 37 38 3a9c","rssi":-78
06b0 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 ,"adv":"02010603
06c0 30 33 61 61 66 65 31 35 31 36 61 61 66 65 30 30 03aafe1516aafe00
06d0 64 63 31 31 31 31 31 31 31 31 35 35 35 35 35 35 dc11111111555555
06e0 35 35 36 36 36 36 37 37 37 65 30 30 30 30 30 30 556666777e000000
06f0 31 65 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 1e","rsp":"","t"
0700 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e 00 :1593011250}}.~.
0710 b1 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e .{"method":"ble.
0720 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 adv","params":{"
0730 61 64 64 72 22 3a 22 65 34 32 37 37 61 32 32 61 addr":"e4277a22a
0740 34 33 32 22 2c 22 72 73 73 69 22 3a 2d 37 30 2c 432","rssi":-70,
0750 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 "adv":"020106030
0760 33 61 61 66 65 31 37 31 36 61 61 66 65 30 30 64 3aafe1716aafe00d
0770 35 31 31 31 31 31 32 32 32 32 32 33 33 33 33 33 5111112222233333
0780 34 34 34 34 34 61 35 66 35 61 35 66 35 61 35 66 44444a5f5a5f5a5f
0790 35 30 30 30 30 22 2c 22 72 73 70 22 3a 22 30 38 50000","rsp":"08
07a0 30 39 36 39 34 32 34 62 35 33 33 31 33 30 33 35 0969424b53313035
07b0 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 30 ","t":1593011250
07c0 7d 7d 82 7e 00 99 7b 22 6d 65 74 68 6f 64 22 3a }}.~..{"method":
07d0 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d "ble.adv","param
07e0 73 22 3a 7b 22 61 64 64 72 22 3a 22 66 63 66 31 s":{"addr":"fcf1
07f0 33 36 31 66 62 39 36 65 22 2c 22 72 73 73 69 22 361fb96e","rssi"
0800 3a 2d 35 38 2c 22 61 64 76 22 3a 22 31 62 66 66 :-58,"adv":"1bff
0810 37 35 30 30 34 32 30 34 30 31 38 30 32 30 66 63 75004204018020fc
0820 66 31 33 36 31 66 62 39 36 65 66 65 66 31 33 36 f1361fb96efef136
0830 31 66 62 39 36 64 30 31 30 30 30 30 30 30 30 30 1fb96d0100000000
0840 30 30 30 30 22 2c 22 72 73 70 22 3a 22 22 2c 22 0000","rsp":"","
0850 74 22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 t":1593011250}}.
0860 7e 00 97 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c ~..{"method":"bl
0870 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a e.adv","params":
0880 7b 22 61 64 64 72 22 3a 22 65 62 36 38 30 63 63 {"addr":"eb680cc
0890 62 62 33 63 66 22 2c 22 72 73 73 69 22 3a 2d 37 bb3cf","rssi":-7
08a0 39 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 9,"adv":"0201060
08b0 66 31 36 36 61 66 65 30 32 30 38 30 31 31 36 36 f166afe020801166
08c0 34 66 34 35 33 37 34 34 32 36 31 35 37 35 34 22 4f4537442615754"
08d0 2c 22 72 73 70 22 3a 22 30 37 30 39 33 35 33 32 ,"rsp":"07093532
08e0 32 64 37 31 36 31 33 33 22 2c 22 74 22 3a 31 35 2d716133","t":15
08f0 39 33 30 31 31 32 35 30 7d 7d 82 7e 00 93 7b 22 93011250}}.~..{"
0900 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 method":"ble.adv
0910 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 ","params":{"add
0920 72 22 3a 22 63 38 66 36 65 34 62 66 36 33 33 34 r":"c8f6e4bf6334
0930 22 2c 22 72 73 73 69 22 3a 2d 39 30 2c 22 61 64 ","rssi":-90,"ad
0940 76 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 v":"0201060303aa
0950 66 65 31 31 31 36 61 61 66 65 32 30 30 30 30 62 fe1116aafe20000b
0960 61 65 31 62 34 30 30 39 35 30 65 36 66 32 30 36 ae1b400950e6f206
0970 37 61 66 36 38 38 22 2c 22 72 73 70 22 3a 22 22 7af688","rsp":""
0980 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 30 7d ,"t":1593011250}
0990 7d 82 7e 00 99 7b 22 6d 65 74 68 6f 64 22 3a 22 }.~..{"method":"
09a0 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 ble.adv","params
09b0 22 3a 7b 22 61 64 64 72 22 3a 22 66 63 66 31 33 ":{"addr":"fcf13
09c0 36 31 66 62 39 36 65 22 2c 22 72 73 73 69 22 3a 61fb96e","rssi":
09d0 2d 35 37 2c 22 61 64 76 22 3a 22 31 62 66 66 37 -57,"adv":"1bff7
09e0 35 30 30 34 32 30 34 30 31 38 30 32 30 66 63 66 5004204018020fcf
09f0 31 33 36 31 66 62 39 36 65 66 65 66 31 33 36 31 1361fb96efef1361
0a00 66 62 39 36 64 30 31 30 30 30 30 30 30 30 30 30 fb96d01000000000
0a10 30 30 30 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 000","rsp":"","t
0a20 22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e ":1593011250}}.~
0a30 00 9b 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 ..{"method":"ble
0a40 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b .adv","params":{
0a50 22 61 64 64 72 22 3a 22 65 31 63 39 32 65 62 62 "addr":"e1c92ebb
0a60 63 34 66 64 22 2c 22 72 73 73 69 22 3a 2d 37 38 c4fd","rssi":-78
0a70 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 ,"adv":"02010603
0a80 30 33 61 61 66 65 31 35 31 36 61 61 66 65 30 30 03aafe1516aafe00
0a90 64 35 31 31 31 31 31 31 31 31 35 35 35 35 35 35 d511111111555555
0aa0 35 35 36 36 36 36 35 37 34 30 30 30 30 30 30 30 5566665740000000
0ab0 32 30 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 20","rsp":"","t"
0ac0 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7d 7b :1593011250}}.}{
0ad0 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 "method":"ble.ad
0ae0 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 v","params":{"ad
0af0 64 72 22 3a 22 35 63 66 63 34 35 62 33 32 64 61 dr":"5cfc45b32da
0b00 31 22 2c 22 72 73 73 69 22 3a 2d 34 39 2c 22 61 1","rssi":-49,"a
0b10 64 76 22 3a 22 30 32 30 31 30 36 30 61 66 66 34 dv":"0201060aff4
0b20 63 30 30 31 30 30 35 30 62 31 63 32 30 37 37 65 c0010050b1c2077e
0b30 63 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a c","rsp":"","t":
0b40 31 35 39 33 30 31 31 32 35 31 7d 7d 82 7e 00 b1 1593011251}}.~..
0b50 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 {"method":"ble.a
0b60 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 dv","params":{"a
0b70 64 64 72 22 3a 22 65 34 32 37 37 61 32 32 61 34 ddr":"e4277a22a4
0b80 33 32 22 2c 22 72 73 73 69 22 3a 2d 37 36 2c 22 32","rssi":-76,"
0b90 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 33 adv":"0201060303
0ba0 61 61 66 65 31 37 31 36 61 61 66 65 30 30 64 35 aafe1716aafe00d5
0bb0 31 31 31 31 31 32 32 32 32 32 33 33 33 33 33 34 1111122222333334
0bc0 34 34 34 34 61 35 66 35 61 35 66 35 61 35 66 35 4444a5f5a5f5a5f5
0bd0 30 30 30 30 22 2c 22 72 73 70 22 3a 22 30 38 30 0000","rsp":"080
0be0 39 36 39 34 32 34 62 35 33 33 31 33 30 33 35 22 969424b53313035"
0bf0 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 31 7d ,"t":1593011251}
0c00 7d 82 7e 00 99 7b 22 6d 65 74 68 6f 64 22 3a 22 }.~..{"method":"
0c10 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 ble.adv","params
0c20 22 3a 7b 22 61 64 64 72 22 3a 22 66 63 66 31 33 ":{"addr":"fcf13
0c30 36 31 66 62 39 36 65 22 2c 22 72 73 73 69 22 3a 61fb96e","rssi":
0c40 2d 35 37 2c 22 61 64 76 22 3a 22 31 62 66 66 37 -57,"adv":"1bff7
0c50 35 30 30 34 32 30 34 30 31 38 30 32 30 66 63 66 5004204018020fcf
0c60 31 33 36 31 66 62 39 36 65 66 65 66 31 33 36 31 1361fb96efef1361
0c70 66 62 39 36 64 30 31 30 30 30 30 30 30 30 30 30 fb96d01000000000
0c80 30 30 30 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 000","rsp":"","t
0c90 22 3a 31 35 39 33 30 31 31 32 35 31 7d 7d 82 7e ":1593011251}}.~
0ca0 00 9b 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 ..{"method":"ble
0cb0 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b .adv","params":{
0cc0 22 61 64 64 72 22 3a 22 66 39 31 35 64 61 39 31 "addr":"f915da91
0cd0 32 39 37 32 22 2c 22 72 73 73 69 22 3a 2d 38 32 2972","rssi":-82
0ce0 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 ,"adv":"02010603
0cf0 30 33 61 61 66 65 31 35 31 36 61 61 66 65 30 30 03aafe1516aafe00
0d00 64 35 31 31 31 31 31 31 31 31 35 35 35 35 35 35 d511111111555555
0d10 35 35 36 36 36 36 30 30 31 61 30 30 30 30 30 36 556666001a000006
0d20 66 61 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 fa","rsp":"","t"
0d30 3a 31 35 39 33 30 31 31 32 35 31 7d 7d 82 7e 00 :1593011251}}.~.
0d40 93 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e .{"method":"ble.
0d50 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 adv","params":{"
0d60 61 64 64 72 22 3a 22 64 34 65 64 35 65 66 34 33 addr":"d4ed5ef43
0d70 66 39 63 22 2c 22 72 73 73 69 22 3a 2d 39 30 2c f9c","rssi":-90,
0d80 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 "adv":"020106030
0d90 33 61 61 66 65 31 31 31 36 61 61 66 65 32 30 30 3aafe1116aafe200
0da0 30 30 62 38 37 31 39 38 30 30 32 35 61 35 38 63 00b871980025a58c
0db0 63 30 32 30 65 61 32 37 30 22 2c 22 72 73 70 22 c020ea270","rsp"
0dc0 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 :"","t":15930112
0dd0 35 31 7d 7d 82 7e 00 b3 7b 22 6d 65 74 68 6f 64 51}}.~..{"method
0de0 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 ":"ble.adv","par
0df0 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 64 ams":{"addr":"cd
0e00 35 31 33 38 35 35 35 36 61 36 22 2c 22 72 73 73 51385556a6","rss
0e10 69 22 3a 2d 35 38 2c 22 61 64 76 22 3a 22 30 32 i":-58,"adv":"02
0e20 30 31 30 36 31 62 66 66 34 63 30 30 30 32 31 35 01061bff4c000215
0e30 62 37 37 39 64 33 35 66 30 61 37 65 34 37 61 66 b779d35f0a7e47af
0e40 62 64 34 32 66 62 31 66 39 36 61 62 64 34 32 34 bd42fb1f96abd424
0e50 66 66 66 66 66 66 66 66 63 36 36 34 22 2c 22 72 ffffffffc664","r
0e60 73 70 22 3a 22 30 39 30 39 36 39 34 32 34 62 35 sp":"090969424b5
0e70 33 32 30 35 35 35 33 34 32 22 2c 22 74 22 3a 31 320555342","t":1
0e80 35 39 33 30 31 31 32 35 31 7d 7d 82 7e 00 93 7b 593011251}}.~..{
0e90 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 "method":"ble.ad
0ea0 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 v","params":{"ad
0eb0 64 72 22 3a 22 63 65 37 33 65 63 66 37 65 36 32 dr":"ce73ecf7e62
0ec0 61 22 2c 22 72 73 73 69 22 3a 2d 38 31 2c 22 61 a","rssi":-81,"a
0ed0 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 dv":"0201060303a
0ee0 61 66 65 31 31 31 36 61 61 66 65 32 30 30 30 30 afe1116aafe20000
0ef0 62 38 64 31 38 34 30 30 32 35 38 65 31 34 65 30 b8d18400258e14e0
0f00 32 30 64 61 37 64 30 22 2c 22 72 73 70 22 3a 22 20da7d0","rsp":"
0f10 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 31 ","t":1593011251
0f20 7d 7d 82 7e 00 97 7b 22 6d 65 74 68 6f 64 22 3a }}.~..{"method":
0f30 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d "ble.adv","param
0f40 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 65 31 31 s":{"addr":"ce11
0f50 34 37 30 66 35 32 32 33 22 2c 22 72 73 73 69 22 470f5223","rssi"
0f60 3a 2d 38 33 2c 22 61 64 76 22 3a 22 30 32 30 31 :-83,"adv":"0201
0f70 30 36 30 66 31 36 36 61 66 65 30 32 30 38 30 31 060f166afe020801
0f80 31 35 36 34 66 34 34 34 37 34 35 31 35 30 34 34 1564f44474515044
0f90 34 37 22 2c 22 72 73 70 22 3a 22 30 37 30 39 33 47","rsp":"07093
0fa0 35 33 30 32 64 37 31 36 31 33 33 22 2c 22 74 22 5302d716133","t"
0fb0 3a 31 35 39 33 30 31 31 32 35 31 7d 7d 82 7e 00 :1593011251}}.~.
0fc0 93 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e .{"method":"ble.
0fd0 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 adv","params":{"
0fe0 61 64 64 72 22 3a 22 65 31 63 39 32 65 62 62 63 addr":"e1c92ebbc
0ff0 34 66 64 22 2c 22 72 73 73 69 22 3a 2d 38 30 2c 4fd","rssi":-80,
1000 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 "adv":"020106030
1010 33 61 61 66 65 31 31 31 36 61 61 66 65 32 30 30 3aafe1116aafe200
1020 30 30 62 38 66 31 36 63 30 30 37 31 66 34 36 64 00b8f16c0071f46d
1030 32 30 36 33 61 35 31 64 32 22 2c 22 72 73 70 22 2063a51d2","rsp"
1040 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 :"","t":15930112
1050 35 31 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 6f 64 51}}.~..{"method
1060 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 ":"ble.adv","par
1070 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 64 35 ams":{"addr":"d5
1080 64 62 66 38 61 64 39 32 33 39 22 2c 22 72 73 73 dbf8ad9239","rss
1090 69 22 3a 2d 38 35 2c 22 61 64 76 22 3a 22 30 32 i":-85,"adv":"02
10a0 30 31 30 36 30 33 30 33 61 61 66 65 31 35 31 36 01060303aafe1516
10b0 61 61 66 65 30 30 64 35 31 31 31 31 31 31 31 31 aafe00d511111111
10c0 35 35 35 35 35 35 35 35 36 36 36 36 33 33 30 31 5555555566663301
10d0 30 30 30 30 30 30 30 36 22 2c 22 72 73 70 22 3a 00000006","rsp":
10e0 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 "","t":159301125
10f0 31 7d 7d 82 7e 00 99 7b 22 6d 65 74 68 6f 64 22 1}}.~..{"method"
1100 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 :"ble.adv","para
1110 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 66 63 66 ms":{"addr":"fcf
1120 31 33 36 31 66 62 39 36 65 22 2c 22 72 73 73 69 1361fb96e","rssi
1130 22 3a 2d 35 37 2c 22 61 64 76 22 3a 22 31 62 66 ":-57,"adv":"1bf
1140 66 37 35 30 30 34 32 30 34 30 31 38 30 32 30 66 f75004204018020f
1150 63 66 31 33 36 31 66 62 39 36 65 66 65 66 31 33 cf1361fb96efef13
1160 36 31 66 62 39 36 64 30 31 30 30 30 30 30 30 30 61fb96d010000000
1170 30 30 30 30 30 22 2c 22 72 73 70 22 3a 22 22 2c 00000","rsp":"",
1180 22 74 22 3a 31 35 39 33 30 31 31 32 35 31 7d 7d "t":1593011251}}
1190 82 7e 00 b1 7b 22 6d 65 74 68 6f 64 22 3a 22 62 .~..{"method":"b
11a0 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 le.adv","params"
11b0 3a 7b 22 61 64 64 72 22 3a 22 65 34 32 37 37 61 :{"addr":"e4277a
11c0 32 32 61 34 33 32 22 2c 22 72 73 73 69 22 3a 2d 22a432","rssi":-
11d0 37 30 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 70,"adv":"020106
11e0 30 33 30 33 61 61 66 65 31 37 31 36 61 61 66 65 0303aafe1716aafe
11f0 30 30 64 35 31 31 31 31 31 32 32 32 32 32 33 33 00d5111112222233
1200 33 33 33 34 34 34 34 34 61 35 66 35 61 35 66 35 33344444a5f5a5f5
1210 61 35 66 35 30 30 30 30 22 2c 22 72 73 70 22 3a a5f50000","rsp":
1220 22 30 38 30 39 36 39 34 32 34 62 35 33 33 31 33 "080969424b53313
1230 30 33 35 22 2c 22 74 22 3a 31 35 39 33 30 31 31 035","t":1593011
1240 32 35 31 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 6f 251}}.~..{"metho
1250 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 d":"ble.adv","pa
1260 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 rams":{"addr":"c
1270 31 31 38 62 31 30 31 63 66 30 39 22 2c 22 72 73 118b101cf09","rs
1280 73 69 22 3a 2d 37 39 2c 22 61 64 76 22 3a 22 30 si":-79,"adv":"0
1290 32 30 31 30 36 30 33 30 33 61 61 66 65 31 35 31 201060303aafe151
12a0 36 61 61 66 65 30 30 64 63 31 31 31 31 31 31 31 6aafe00dc1111111
12b0 31 35 35 35 35 35 35 35 35 36 36 36 36 63 35 66 1555555556666c5f
12c0 35 30 30 30 30 63 35 66 35 22 2c 22 72 73 70 22 50000c5f5","rsp"
12d0 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 :"","t":15930112
12e0 35 31 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 51}}.~..{"method
12f0 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 ":"ble.adv","par
1300 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 66 39 ams":{"addr":"f9
1310 31 35 64 61 39 31 32 39 37 32 22 2c 22 72 73 73 15da912972","rss
1320 69 22 3a 2d 38 31 2c 22 61 64 76 22 3a 22 30 32 i":-81,"adv":"02
1330 30 31 30 36 30 33 30 33 61 61 66 65 31 31 31 36 01060303aafe1116
1340 61 61 66 65 32 30 30 30 30 62 38 34 31 36 34 30 aafe20000b841640
1350 30 39 35 64 39 38 39 37 30 36 38 39 30 62 36 61 095d989706890b6a
1360 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 ","rsp":"","t":1
1370 35 39 33 30 31 31 32 35 31 7d 7d 82 7e 00 b3 7b 593011251}}.~..{
1380 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 "method":"ble.ad
1390 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 v","params":{"ad
13a0 64 72 22 3a 22 63 64 35 31 33 38 35 35 35 36 61 dr":"cd51385556a
13b0 36 22 2c 22 72 73 73 69 22 3a 2d 35 37 2c 22 61 6","rssi":-57,"a
13c0 64 76 22 3a 22 30 32 30 31 30 36 31 62 66 66 34 dv":"0201061bff4
13d0 63 30 30 30 32 31 35 62 37 37 39 64 33 35 66 30 c000215b779d35f0
13e0 61 37 65 34 37 61 66 62 64 34 32 66 62 31 66 39 a7e47afbd42fb1f9
13f0 36 61 62 64 34 32 34 66 66 66 66 66 66 66 66 63 6abd424ffffffffc
1400 36 36 34 22 2c 22 72 73 70 22 3a 22 30 39 30 39 664","rsp":"0909
1410 36 39 34 32 34 62 35 33 32 30 35 35 35 33 34 32 69424b5320555342
1420 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 31 ","t":1593011251
1430 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a }}.~..{"method":
1440 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d "ble.adv","param
1450 73 22 3a 7b 22 61 64 64 72 22 3a 22 66 34 37 63 s":{"addr":"f47c
1460 64 39 62 36 32 63 62 39 22 2c 22 72 73 73 69 22 d9b62cb9","rssi"
1470 3a 2d 38 30 2c 22 61 64 76 22 3a 22 30 32 30 31 :-80,"adv":"0201
1480 30 36 30 64 31 36 36 61 66 65 30 32 30 38 30 31 060d166afe020801
1490 31 36 36 34 65 63 33 39 34 64 36 63 37 37 22 2c 1664ec394d6c77",
14a0 22 72 73 70 22 3a 22 30 37 30 39 33 33 33 38 32 "rsp":"070933382
14b0 64 37 31 36 31 33 33 22 2c 22 74 22 3a 31 35 39 d716133","t":159
14c0 33 30 31 31 32 35 31 7d 7d 82 7e 00 99 7b 22 6d 3011251}}.~..{"m
14d0 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 ethod":"ble.adv"
14e0 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 ,"params":{"addr
14f0 22 3a 22 66 63 66 31 33 36 31 66 62 39 36 65 22 ":"fcf1361fb96e"
1500 2c 22 72 73 73 69 22 3a 2d 35 36 2c 22 61 64 76 ,"rssi":-56,"adv
1510 22 3a 22 31 62 66 66 37 35 30 30 34 32 30 34 30 ":"1bff750042040
1520 31 38 30 32 30 66 63 66 31 33 36 31 66 62 39 36 18020fcf1361fb96
1530 65 66 65 66 31 33 36 31 66 62 39 36 64 30 31 30 efef1361fb96d010
1540 30 30 30 30 30 30 30 30 30 30 30 22 2c 22 72 73 00000000000","rs
1550 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 p":"","t":159301
1560 31 32 35 31 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 1251}}.~..{"meth
1570 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 od":"ble.adv","p
1580 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 arams":{"addr":"
1590 66 31 65 31 64 63 65 63 64 36 38 34 22 2c 22 72 f1e1dcecd684","r
15a0 73 73 69 22 3a 2d 36 35 2c 22 61 64 76 22 3a 22 ssi":-65,"adv":"
15b0 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 35 0201060303aafe15
15c0 31 36 61 61 66 65 30 30 64 35 31 31 31 31 31 31 16aafe00d5111111
15d0 31 31 35 35 35 35 35 35 35 35 36 36 36 36 64 35 11555555556666d5
15e0 34 37 30 30 30 30 30 30 32 63 22 2c 22 72 73 70 470000002c","rsp
15f0 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 ":"","t":1593011
1600 32 35 31 7d 7d 82 7e 00 bf 7b 22 6d 65 74 68 6f 251}}.~..{"metho
1610 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 d":"ble.adv","pa
1620 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 32 rams":{"addr":"2
1630 63 61 61 38 65 30 30 35 34 65 62 22 2c 22 72 73 caa8e0054eb","rs
1640 73 69 22 3a 2d 35 36 2c 22 61 64 76 22 3a 22 30 si":-56,"adv":"0
1650 32 30 31 30 35 30 37 30 33 39 35 66 65 36 37 62 20105070395fe67b
1660 31 65 37 66 65 30 64 66 66 34 39 30 36 30 32 30 1e7fe0dff4906020
1670 32 30 30 30 30 32 63 61 61 38 65 30 30 35 34 65 200002caa8e0054e
1680 62 22 2c 22 72 73 70 22 3a 22 30 35 30 39 35 37 b","rsp":"050957
1690 35 39 35 61 34 35 30 66 31 36 39 35 66 65 33 31 595a450f1695fe31
16a0 32 30 38 66 30 33 30 30 32 63 61 61 38 65 30 30 208f03002caa8e00
16b0 35 34 65 62 30 39 22 2c 22 74 22 3a 31 35 39 33 54eb09","t":1593
16c0 30 31 31 32 35 31 7d 7d 22 2c 22 72 73 73 69 22 011251}}","rssi"
16d0 3a 2d 38 30 2c 22 61 64 76 22 3a 22 30 32 30 31 :-80,"adv":"0201
16e0 30 36 30 33 30 33 61 61 66 65 31 31 31 36 61 61 060303aafe1116aa
16f0 66 65 32 30 30 30 30 62 38 64 31 38 34 30 30 32 fe20000b8d184002
1700 35 38 65 31 35 37 30 32 30 64 61 37 64 61 22 2c 58e157020da7da",
1710 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 "rsp":"","t":159
1720 33 30 31 31 32 35 32 7d 7d 82 7e 00 99 7b 22 6d 3011252}}.~..{"m
1730 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 ethod":"ble.adv"
1740 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 ,"params":{"addr
1750 22 3a 22 66 63 66 31 33 36 31 66 62 39 36 65 22 ":"fcf1361fb96e"
1760 2c 22 72 73 73 69 22 3a 2d 37 35 2c 22 61 64 76 ,"rssi":-75,"adv
1770 22 3a 22 31 62 66 66 37 35 30 30 34 32 30 34 30 ":"1bff750042040
1780 31 38 30 32 30 66 63 66 31 33 36 31 66 62 39 36 18020fcf1361fb96
1790 65 66 65 66 31 33 36 31 66 62 39 36 64 30 31 30 efef1361fb96d010
17a0 30 30 30 30 30 30 30 30 30 30 30 22 2c 22 72 73 00000000000","rs
17b0 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 p":"","t":159301
17c0 31 32 35 32 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 1252}}.~..{"meth
17d0 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 od":"ble.adv","p
17e0 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 arams":{"addr":"
17f0 63 34 63 35 66 65 37 37 34 31 66 39 22 2c 22 72 c4c5fe7741f9","r
1800 73 73 69 22 3a 2d 39 32 2c 22 61 64 76 22 3a 22 ssi":-92,"adv":"
1810 30 32 30 31 30 36 30 64 31 36 36 61 66 65 30 32 0201060d166afe02
1820 30 38 30 31 31 36 35 62 65 63 37 61 36 38 37 32 0801165bec7a6872
1830 34 64 22 2c 22 72 73 70 22 3a 22 30 37 30 39 33 4d","rsp":"07093
1840 33 33 39 32 64 37 31 36 31 33 33 22 2c 22 74 22 3392d716133","t"
1850 3a 31 35 39 33 30 31 31 32 35 32 7d 7d 82 7d 7b :1593011252}}.}{
1860 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 "method":"ble.ad
1870 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 v","params":{"ad
1880 64 72 22 3a 22 35 63 66 63 34 35 62 33 32 64 61 dr":"5cfc45b32da
1890 31 22 2c 22 72 73 73 69 22 3a 2d 35 37 2c 22 61 1","rssi":-57,"a
18a0 64 76 22 3a 22 30 32 30 31 30 36 30 61 66 66 34 dv":"0201060aff4
18b0 63 30 30 31 30 30 35 30 62 31 63 32 30 37 37 65 c0010050b1c2077e
18c0 63 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a c","rsp":"","t":
18d0 31 35 39 33 30 31 31 32 35 32 7d 7d 82 7e 00 b1 1593011252}}.~..
18e0 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 {"method":"ble.a
18f0 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 dv","params":{"a
1900 64 64 72 22 3a 22 65 34 32 37 37 61 32 32 61 34 ddr":"e4277a22a4
1910 33 32 22 2c 22 72 73 73 69 22 3a 2d 37 37 2c 22 32","rssi":-77,"
1920 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 33 adv":"0201060303
1930 61 61 66 65 31 37 31 36 61 61 66 65 30 30 64 35 aafe1716aafe00d5
1940 31 31 31 31 31 32 32 32 32 32 33 33 33 33 33 34 1111122222333334
1950 34 34 34 34 61 35 66 35 61 35 66 35 61 35 66 35 4444a5f5a5f5a5f5
1960 30 30 30 30 22 2c 22 72 73 70 22 3a 22 30 38 30 0000","rsp":"080
1970 39 36 39 34 32 34 62 35 33 33 31 33 30 33 35 22 969424b53313035"
1980 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 32 7d ,"t":1593011252}
1990 7d 82 7e 00 9b 7b 22 6d 65 74 68 6f 64 22 3a 22 }.~..{"method":"
19a0 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 ble.adv","params
19b0 22 3a 7b 22 61 64 64 72 22 3a 22 63 31 31 38 62 ":{"addr":"c118b
19c0 31 30 31 63 66 30 39 22 2c 22 72 73 73 69 22 3a 101cf09","rssi":
19d0 2d 38 32 2c 22 61 64 76 22 3a 22 30 32 30 31 30 -82,"adv":"02010
19e0 36 30 33 30 33 61 61 66 65 31 35 31 36 61 61 66 60303aafe1516aaf
19f0 65 30 30 64 63 31 31 31 31 31 31 31 31 35 35 35 e00dc11111111555
1a00 35 35 35 35 35 36 36 36 36 63 35 66 35 30 30 30 555556666c5f5000
1a10 30 63 35 66 35 22 2c 22 72 73 70 22 3a 22 22 2c 0c5f5","rsp":"",
1a20 22 74 22 3a 31 35 39 33 30 31 31 32 35 32 7d 7d "t":1593011252}}
1a30 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22 62 .~..{"method":"b
1a40 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 le.adv","params"
1a50 3a 7b 22 61 64 64 72 22 3a 22 66 39 31 35 64 61 :{"addr":"f915da
1a60 39 31 32 39 37 32 22 2c 22 72 73 73 69 22 3a 2d 912972","rssi":-
1a70 38 32 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 82,"adv":"020106
1a80 30 33 30 33 61 61 66 65 31 31 31 36 61 61 66 65 0303aafe1116aafe
1a90 32 30 30 30 30 62 38 34 31 36 34 30 30 39 35 64 20000b841640095d
1aa0 39 38 61 30 30 36 38 39 30 62 36 61 22 2c 22 72 98a006890b6a","r
1ab0 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 sp":"","t":15930
1ac0 31 31 32 35 32 7d 7d 11252}}
+13 -3
View File
@@ -1,8 +1,18 @@
#include "mongoose.h"
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
struct http_message req;
mg_parse_http((const char *) data, size, &req, 0);
mg_parse_http((const char *) data, size, &req, 1);
struct mg_dns_message dm;
mg_dns_parse(data, size, &dm);
struct mg_http_message hm;
mg_http_parse((const char *) data, size, &hm);
struct mg_mqtt_message mm;
mg_mqtt_parse(data, size, &mm);
struct timeval tv;
mg_sntp_parse(data, size, &tv);
return 0;
}
-85
View File
@@ -1,85 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ccgi.h>
extern char **environ;
#ifdef _WIN32
#define EOL "\n"
#else
#define EOL "\r\n"
#endif
int alpha_cmp(const void *a, const void *b) {
return strcmp(*(const char **) a, *(const char **) b);
}
int main(void) {
puts("Content-Type: text/html" EOL "Status: 201 Created" EOL EOL);
puts("<pre>" EOL "<h1>Environment</h1>" EOL);
{
const char *sorted_env[500];
size_t i, num_env;
for (num_env = 0; environ[num_env] != 0; num_env++) {
sorted_env[num_env] = environ[num_env];
}
qsort(sorted_env, num_env, sizeof(const char *), alpha_cmp);
for (i = 0; i < num_env; i++) {
printf("E: %s" EOL, sorted_env[i]);
}
}
puts(EOL "<h1>Query string</h1>" EOL);
{
const char *k;
CGI_varlist *vl = CGI_get_query(NULL);
for (k = CGI_first_name(vl); k != NULL; k = CGI_next_name(vl)) {
printf("Q: %s=%s" EOL, k, CGI_lookup(vl, k));
}
CGI_free_varlist(vl);
}
puts(EOL "<h1>Form variables</h1>" EOL);
{
const char *k;
CGI_varlist *vl = CGI_get_post(NULL, NULL);
for (k = CGI_first_name(vl); k != NULL; k = CGI_next_name(vl)) {
printf("P: %s=%s" EOL, k, CGI_lookup(vl, k));
}
CGI_free_varlist(vl);
}
puts(EOL "</pre>" EOL);
return 0;
}
/* Some functions for libccgi that are missing on Windows (VC6). */
#ifdef _WIN32
static int lowercase(const char *s) {
return tolower(*(const unsigned char *) s);
}
int strncasecmp(const char *s1, const char *s2, size_t len) {
int diff = 0;
if (len > 0) do {
diff = lowercase(s1++) - lowercase(s2++);
} while (diff == 0 && s1[-1] != '\0' && --len > 0);
return diff;
}
int strcasecmp(const char *s1, const char *s2) {
return strncasecmp(s1, s2, (size_t) ~0);
}
int mkstemp(char *template) {
return -1; /* Not used by us. */
}
#endif
-136
View File
@@ -1,136 +0,0 @@
# Copyright (c) 2014 Cesanta Software Limited
# All rights reserved
#
# = Requires:
#
# - SRC_DIR = path to directory with source files
# - AMALGAMATED_SOURCES = path to amalgamated C file(s)
# - PROG = name of main unit test source file
#
# - CFLAGS = default compiler flags
# - LDFLAGS = default linker flags
#
# = Parameters:
#
# - V=1 -> show commandlines of executed commands
# - TEST_FILTER -> test name (substring match)
# - CMD -> run wrapped in cmd (e.g. make test_cxx CMD=lldb)
#
# = Useful targets
#
# - compile: perform a very fast syntax check for all dialects
# - presubmit: suggested presubmit tests
# - cpplint: run the linter
# - lcov: generate coverage HTML in test/lcov/index.html
# - test_asan: run with AddressSanitizer
# - test_valgrind: run with valgrind
# OSX clang doesn't build ASAN. Use brew:
# $ brew tap homebrew/versions
# $ brew install llvm36 --with-clang --with-asan
CLANG:=clang
PEDANTIC=$(shell gcc --version 2>/dev/null | grep -q clang && echo -pedantic)
###
DIALECTS=cxx ansi c99 c11
SPECIALS=asan gcov valgrind
# Each test target might require either a different compiler name
# a compiler flag, or a wrapper to be invoked before executing the test
# they can be overriden here with <VAR>_<target>
#
# Vars are:
# - CC: compiler
# - CFLAGS: flags passed to the compiler, useful to set dialect and to disable incompatible tests
# - LDFLAGS: flags passed to the compiler only when linking (e.g. not in syntax only)
# - SOURCES: non-test source files. To be overriden if needs to build on non amalgamated files
# - CMD: command wrapper or env variables required to run the test binary
CMD=MallocLogFile=/dev/null
CC_cxx=$(CXX)
CFLAGS_cxx=-x c++
CFLAGS_ansi=-ansi
CFLAGS_c99=$(PEDANTIC) -std=c99
# Path to `gcov` binary
GCOV?=gcov
CFLAGS_gcov=$(PEDANTIC) -std=c99 -fprofile-arcs -ftest-coverage
#SOURCES_gcov=$(addprefix $(SRC_DIR)/, $(SOURCES))
SOURCES_gcov=$(AMALGAMATED_SOURCES)
CC_asan=$(CLANG)
CFLAGS_asan=-fsanitize=address -fcolor-diagnostics -std=c99 -DNO_DNS_TEST -UMG_ENABLE_SSL
CMD_asan=ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer ASAN_OPTIONS=allocator_may_return_null=1,symbolize=1 $(CMD)
CMD_valgrind=valgrind
###
SHELL := /bin/bash
SUFFIXES=$(DIALECTS) $(SPECIALS)
ALL_PROGS=$(foreach p,$(SUFFIXES),$(PROG)-$(p))
ALL_TESTS=$(foreach p,$(SUFFIXES),test_$(p))
SHORT_TESTS=$(foreach p,$(DIALECTS),test_$(p))
all: clean compile $(SHORT_TESTS) coverage
alltests: $(ALL_TESTS) lcov cpplint
# currently both valgrind and asan tests are failing for some test cases
# it's still useful to be able to run asan/valgrind on some specific test cases
# but we don't enforce them for presubmit until they are stable again.
presubmit: $(SHORT_TESTS) cpplint
.PHONY: clean clean_coverage lcov valgrind docker cpplint test_sources_resolved
ifneq ($(V), 1)
.SILENT: $(ALL_PROGS) $(ALL_TESTS)
endif
compile:
@make $(foreach p,$(DIALECTS),$(PROG)-$(p)) CFLAGS_EXTRA="$(CFLAGS_EXTRA) -fsyntax-only" LDFLAGS=
# A target which is only needed to VPATH-resolve $(TEST_SOURCES).
# Other targets which need exact (VPATH-resolved) paths to $(TEST_SOURCES),
# need to depend on this phony target, and then use $(TEST_SOURCES_RESOLVED)
# instead.
test_sources_resolved: $(TEST_SOURCES)
$(eval TEST_SOURCES_RESOLVED=$^)
# HACK: cannot have two underscores
$(PROG)-%: Makefile test_sources_resolved $(or $(SOURCES_$*), $(AMALGAMATED_SOURCES)) data/cgi/index.cgi
@echo -e "CC\t$(PROG)_$*"
$(or $(CC_$*), $(CC)) $(CFLAGS_$*) $(TEST_SOURCES_RESOLVED) $(or $(SOURCES_$*), $(AMALGAMATED_SOURCES)) -o $(PROG)_$* $(CFLAGS) $(LDFLAGS)
$(ALL_TESTS): test_%: Makefile $(PROG)-%
@echo -e "RUN\t$(PROG)_$* $(TEST_FILTER)"
@$(or $(CMD_$*), $(CMD)) ./$(PROG)_$* $(TEST_FILTER)
coverage: Makefile clean_coverage test_gcov test_sources_resolved
@echo -e "RUN\tGCOV"
@$(GCOV) -p $(notdir $(TEST_SOURCES_RESOLVED)) $(notdir $(GCOV_SOURCES)) >/dev/null
test_leaks: Makefile
$(MAKE) test_valgrind CMD_valgrind="$(CMD_valgrind) --leak-check=full"
lcov: clean coverage
@echo -e "RUN\tlcov"
@lcov -q -o lcov.info -c -d . 2>/dev/null
@genhtml -q -o lcov lcov.info
cpplint:
@echo -e "RUN\tcpplint"
@cpplint.py --verbose=0 --extensions=c,h $(SRC_DIR)/*.[ch] 2>&1 >/dev/null| grep -v "Done processing" | grep -v "file excluded by"
clean: clean_coverage
@echo -e "CLEAN\tall"
@rm -rf $(PROG) $(PROG)_* lcov.info *.txt *.exe *.obj *.o a.out *.pdb *.opt $(EXTRA_CLEAN_TARGETS)
clean_coverage:
@echo -e "CLEAN\tcoverage"
@rm -rf *.gc* *.dSYM index.html
-83
View File
@@ -1,83 +0,0 @@
/*
* Copyright (c) 2014-2018 Cesanta Software Limited
* All rights reserved
*
* Licensed under the Apache License, Version 2.0 (the ""License"");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an ""AS IS"" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "common/cs_dbg.h"
#include "test_main.h"
#include "test_util.h"
#if defined(_MSC_VER) && _MSC_VER >= 1900
#include <crtdbg.h>
int __cdecl CrtDbgHook(int nReportType, char *szMsg, int *pnRet) {
(void) nReportType;
(void) szMsg;
(void) pnRet;
fprintf(stderr, "CRT debug hook: type: %d, msg: %s\n", nReportType, szMsg);
/* Return true - Abort,Retry,Ignore dialog will *not* be displayed */
return 1;
}
#endif
#ifndef __cdecl
#define __cdecl
#endif
int g_num_tests = 0;
int g_num_checks = 0;
const char *g_argv_0 = NULL;
int __cdecl main(int argc, char *argv[]) {
const char *fail_msg;
const char *filter = argc > 1 ? argv[1] : "";
char *seed_str = getenv("TEST_SEED");
double started;
int seed = 0;
if (seed_str != NULL) {
seed = atoi(seed_str);
} else {
seed = (int) time(NULL);
}
printf("seed: %d\n", seed);
srand(seed);
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
#if defined(_MSC_VER) && _MSC_VER >= 1900
/* NOTE: not available on wine/vc6 */
_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, CrtDbgHook);
#endif
g_argv_0 = argv[0];
tests_setup();
started = cs_time();
fail_msg = tests_run(filter);
printf("%s, ran %d tests (%d checks) in %.3lfs\n", fail_msg ? "FAIL" : "PASS",
g_num_tests, g_num_checks, cs_time() - started);
tests_teardown();
if (fail_msg != NULL) {
/* Prevent leak analyzer from running: there will be "leaks" because of
* premature return from the test, and in this case we don't care. */
_exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
-34
View File
@@ -1,34 +0,0 @@
/*
* Copyright (c) 2014-2018 Cesanta Software Limited
* All rights reserved
*
* Licensed under the Apache License, Version 2.0 (the ""License"");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an ""AS IS"" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef CS_COMMON_TEST_MAIN_H_
#define CS_COMMON_TEST_MAIN_H_
#ifdef __cplusplus
extern "C" {
#endif
void tests_setup(void);
const char *tests_run(const char *filter);
void tests_teardown(void);
extern const char *g_argv_0;
#ifdef __cplusplus
}
#endif
#endif /* CS_COMMON_TEST_MAIN_H_ */
-105
View File
@@ -1,105 +0,0 @@
/*
* Copyright (c) 2014-2018 Cesanta Software Limited
* All rights reserved
*
* Licensed under the Apache License, Version 2.0 (the ""License"");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an ""AS IS"" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "test_util.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef _WIN32
#include <sys/time.h>
#else
#include <windows.h>
#endif
int num_tests = 0;
static char *_escape(const char *s, size_t n) {
size_t i, j;
char *res = (char *) malloc(n * 4 + 1);
for (i = j = 0; s[i] != '\0' && i < n; i++) {
if (!iscntrl((int) s[i])) {
res[j++] = s[i];
} else {
j += sprintf(res + j, "\\x%02x", s[i]);
}
}
res[j] = '\0';
return res;
}
void _strfail(const char *a, const char *e, int len) {
char *ae, *ee;
if (len < 0) {
len = strlen(a);
if (strlen(e) > (size_t) len) len = strlen(e);
}
ae = _escape(a, len);
ee = _escape(e, len);
printf("Expected: %s\nActual : %s\n", ee, ae);
free(ae);
free(ee);
}
int _assert_streq(const char *actual, const char *expected) {
if (strcmp(actual, expected) != 0) {
_strfail(actual, expected, -1);
return 0;
}
return 1;
}
int _assert_streq_nz(const char *actual, const char *expected) {
size_t n = strlen(expected);
if (strncmp(actual, expected, n) != 0) {
_strfail(actual, expected, n);
return 0;
}
return 1;
}
#if MG_ENABLE_POLL_UNTIL
int c_str_ne(void *a, void *b) {
int r = strcmp((const char *) a, (const char *) b);
return r;
}
int c_int_ne(void *a, void *b) {
return *((int *) a) != (intptr_t) b;
}
int c_int_eq(void *a, void *b) {
return *((int *) a) == (intptr_t) b;
}
void poll_until(struct mg_mgr *mgr, double timeout, int (*cond)(void *, void *),
void *cond_arg1, void *cond_arg2) {
int i;
double start = cs_time();
while (cs_time() - start < timeout) {
mg_mgr_poll(mgr, 2);
if (cond != NULL && cond(cond_arg1, cond_arg2)) {
/* A few more cycles to test for overshoots. */
for (i = 0; i < 5; i++) {
mg_mgr_poll(mgr, 2);
}
return;
}
}
}
#endif
-251
View File
@@ -1,251 +0,0 @@
/*
* Copyright (c) 2014-2018 Cesanta Software Limited
* All rights reserved
*
* Licensed under the Apache License, Version 2.0 (the ""License"");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an ""AS IS"" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef CS_COMMON_TEST_UTIL_H_
#define CS_COMMON_TEST_UTIL_H_
#include <string.h>
#include <stdio.h>
#include "common/cs_time.h"
#ifdef __cplusplus
extern "C" {
#endif
extern int g_num_tests;
extern int g_num_checks;
#ifdef MG_TEST_ABORT_ON_FAIL
#define MG_TEST_ABORT abort()
#else
#define MG_TEST_ABORT
#endif
int _assert_streq(const char *actual, const char *expected);
int _assert_streq_nz(const char *actual, const char *expected);
void _strfail(const char *a, const char *e, int len);
#define FAIL(str, line) \
do { \
printf("%s:%d:1 [%s] (in %s)\n", __FILE__, line, str, __func__); \
MG_TEST_ABORT; \
return str; \
} while (0)
#define ASSERT(expr) \
do { \
g_num_checks++; \
if (!(expr)) FAIL(#expr, __LINE__); \
} while (0)
#define ASSERT_TRUE(expr) ASSERT(expr)
#define ASSERT_FALSE(expr) ASSERT(!(expr))
/*
* Run test function, use its name as the test name to print
*/
#define RUN_TEST(test) RUN_TEST_WNAME(test, #test)
/*
* Run test function, use the provided name as the test name to print
*/
#define RUN_TEST_WNAME(test, test_name) \
do { \
const char *msg = NULL; \
if (strstr(test_name, filter)) { \
double elapsed = cs_time(); \
msg = test(); \
elapsed = cs_time() - elapsed; \
printf(" [%.3f] %s\n", elapsed, test_name); \
fflush(stdout); \
g_num_tests++; \
} \
if (msg) return msg; \
} while (0)
/* VC6 doesn't have long long. */
#if (defined(_MSC_VER) && _MSC_VER <= 1200)
#define LONG_TYPE int64_t
#else
#define LONG_TYPE long long
#endif
#define AS_DOUBLE(d) (double)(d)
#define RANGE_CHECK(x) (fabs(x) > 4503599627370496.0 /* 2 << 51 */)
/*
* Numeric equality assertion.
* Args are cast to double to ensure aruemnts are only evaluated once.
* This will work fine for all integer types except large 64-bit values.
*/
#define ASSERT_EQ(actual, expected) \
do { \
const double ad = AS_DOUBLE(actual); \
const double ed = AS_DOUBLE(expected); \
if (RANGE_CHECK(ad) || RANGE_CHECK(ed)) { \
FAIL("loss of precision, use ASSERT_EQ64", __LINE__); \
} \
g_num_checks++; \
if (!(ad == ed)) { \
printf("%lf != %lf\n", ad, ed); \
FAIL(#actual " != " #expected, __LINE__); \
} \
} while (0)
#define ASSERT_EQ64(actual, expected) \
do { \
const LONG_TYPE a64 = (LONG_TYPE)(actual); \
const LONG_TYPE e64 = (LONG_TYPE)(expected); \
g_num_checks++; \
if (!(a64 == e64)) { \
printf("%lld != %lld\n", a64, e64); \
FAIL(#actual " != " #expected, __LINE__); \
} \
} while (0)
#define ASSERT_NE(actual, expected) \
do { \
const double ad = AS_DOUBLE(actual); \
const double ed = AS_DOUBLE(expected); \
g_num_checks++; \
if (RANGE_CHECK(ad) || RANGE_CHECK(ed)) { \
FAIL("loss of precision, use ASSERT_NE64", __LINE__); \
} \
if (!(ad != ed)) { \
printf("%lf == %lf\n", ad, ed); \
FAIL(#actual " == " #expected, __LINE__); \
} \
} while (0)
#define ASSERT_NE64(actual, expected) \
do { \
const LONG_TYPE a64 = (LONG_TYPE)(actual); \
const LONG_TYPE e64 = (LONG_TYPE)(expected); \
g_num_checks++; \
if (!(a64 != e64)) { \
printf("%lld == %lld\n", a64, e64); \
FAIL(#actual " == " #expected, __LINE__); \
} \
} while (0)
/* "Less than" assertion. */
#define ASSERT_LT(a, b) \
do { \
const double ad = AS_DOUBLE(a); \
const double bd = AS_DOUBLE(b); \
g_num_checks++; \
if (RANGE_CHECK(ad) || RANGE_CHECK(bd)) { \
FAIL("loss of precision in comparison", __LINE__); \
} \
if (!(ad < bd)) { \
printf("%lf >= %lf\n", ad, bd); \
FAIL(#a " < " #b, __LINE__); \
} \
} while (0)
/* "Greater than" assertion. */
#define ASSERT_GT(a, b) \
do { \
const double ad = AS_DOUBLE(a); \
const double bd = AS_DOUBLE(b); \
g_num_checks++; \
if (!(ad > bd)) { \
printf("%lf <= %lf\n", ad, bd); \
FAIL(#a " > " #b, __LINE__); \
} \
} while (0)
/* Assert that actual == expected, where both are NUL-terminated. */
#define ASSERT_STREQ(actual, expected) \
do { \
g_num_checks++; \
if (!_assert_streq((actual), (expected))) { \
FAIL("ASSERT_STREQ(" #actual ", " #expected ")", __LINE__); \
} \
} while (0)
/* Assert that actual == expected, where both are pointers */
#define ASSERT_PTREQ(actual, expected) \
do { \
const void *ap = (const void *) (actual); \
const void *ep = (const void *) (expected); \
g_num_checks++; \
if (!(ap == ep)) { \
printf("%p != %p\n", ap, ep); \
FAIL("ASSERT_PTREQ(" #actual ", " #expected ")", __LINE__); \
} \
} while (0)
/* Assert that actual != expected, where both are pointers */
#define ASSERT_PTRNE(actual, expected) \
do { \
const void *ap = (const void *) (actual); \
const void *ep = (const void *) (expected); \
g_num_checks++; \
if (!(ap != ep)) { \
printf("%p == %p\n", ap, ep); \
FAIL("ASSERT_PTRNE(" #actual ", " #expected ")", __LINE__); \
} \
} while (0)
/* Same as STREQ, but only expected is NUL-terminated. */
#define ASSERT_STREQ_NZ(actual, expected) \
do { \
g_num_checks++; \
if (!_assert_streq_nz(actual, expected)) { \
FAIL("ASSERT_STREQ_NZ(" #actual ", " #expected ")", __LINE__); \
} \
} while (0)
#define ASSERT_MG_STREQ(actual, expected) \
do { \
g_num_checks++; \
if ((actual).len != strlen(expected) || \
memcmp((actual).p, expected, (actual).len) != 0) { \
printf("'%.*s' (%d) != '%s'\n", (int)(actual).len, (actual).p, \
(int)(actual).len, expected); \
FAIL("ASSERT_MG_STREQ(" #actual ", " #expected ")", __LINE__); \
} \
} while (0)
#define CHECK_CALL(call) \
do { \
const char *r = (call); \
if (r != NULL) { \
fprintf(stderr, "... %s:%d in %s\n", __FILE__, __LINE__, __func__); \
return r; \
} \
} while (0)
#ifndef MG_ENABLE_POLL_UNTIL
#define MG_ENABLE_POLL_UNTIL 0
#endif
#if MG_ENABLE_POLL_UNTIL
#include "mongoose.h"
int c_str_ne(void *a, void *b);
int c_int_ne(void *a, void *b);
int c_int_eq(void *a, void *b);
void poll_until(struct mg_mgr *mgr, double timeout, int (*cond)(void *, void *),
void *cond_arg1, void *cond_arg2);
#endif
#ifdef __cplusplus
}
#endif
#endif /* CS_COMMON_TEST_UTIL_H_ */
+778 -5967
View File
File diff suppressed because it is too large Load Diff
-28
View File
@@ -1,28 +0,0 @@
/*
* Copyright (c) 2014 Cesanta Software Limited
* All rights reserved
* This software is dual-licensed: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. For the terms of this
* license, see <http://www.gnu.org/licenses/>.
*
* You are free to use this software under the terms of the GNU General
* Public License, 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.
*
* Alternatively, you can license this software under a commercial
* license, as set out in <https://www.cesanta.com/license>.
*/
#ifndef CS_MONGOOSE_TEST_UNIT_TEST_H_
#define CS_MONGOOSE_TEST_UNIT_TEST_H_
#ifndef _WIN32
#include "common/platform.h"
#endif
extern void *(*test_malloc)(size_t);
extern void *(*test_calloc)(size_t, size_t);
#endif /* CS_MONGOOSE_TEST_UNIT_TEST_H_ */
-12
View File
@@ -1,12 +0,0 @@
#!/bin/bash -e
cd $(dirname $0)
./mkmgtest.cmd $PWD/mgtest.vcxproj
cd ..
cp win/Debug/mgtest.exe .
./mgtest.exe || {
#hack to flush the logs
echo failed
exit 1
}
-28
View File
@@ -1,28 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.24720.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mgtest", "mgtest.vcxproj", "{699B1D38-AFCE-4B16-B030-A54833909F8B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{699B1D38-AFCE-4B16-B030-A54833909F8B}.Debug|x64.ActiveCfg = Debug|x64
{699B1D38-AFCE-4B16-B030-A54833909F8B}.Debug|x64.Build.0 = Debug|x64
{699B1D38-AFCE-4B16-B030-A54833909F8B}.Debug|x86.ActiveCfg = Debug|Win32
{699B1D38-AFCE-4B16-B030-A54833909F8B}.Debug|x86.Build.0 = Debug|Win32
{699B1D38-AFCE-4B16-B030-A54833909F8B}.Release|x64.ActiveCfg = Release|x64
{699B1D38-AFCE-4B16-B030-A54833909F8B}.Release|x64.Build.0 = Release|x64
{699B1D38-AFCE-4B16-B030-A54833909F8B}.Release|x86.ActiveCfg = Release|Win32
{699B1D38-AFCE-4B16-B030-A54833909F8B}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
-161
View File
@@ -1,161 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{699B1D38-AFCE-4B16-B030-A54833909F8B}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>mgtest</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;MG_ENABLE_POLL_UNTIL;MG_ENABLE_COAP;MG_ENABLE_DNS_SERVER;MG_ENABLE_MQTT_BROKER;MG_ENABLE_THREADS;MG_DISABLE_DAV_AUTH;MG_INTERNAL=;_DEBUG;_CONSOLE;MG_ENABLE_COAP;MG_ENABLE_DNS_SERVER;MG_ENABLE_MQTT_BROKER;MG_ENABLE_THREADS;MG_ENABLE_HTTP_SSI_EXEC;MG_ENABLE_HTTP_WEBDAV;MG_DISABLE_DAV_AUTH;MG_ENABLE_SYNC_RESOLVER;NO_CGI_TEST;NO_RESOLVE_HOSTS_TEST;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>../../..</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;MG_ENABLE_COAP;MG_ENABLE_DNS_SERVER;MG_ENABLE_MQTT_BROKER;MG_ENABLE_THREADS;MG_ENABLE_HTTP_WEBDAV;MG_ENABLE_HTTP_SSI_EXEC;MG_ENABLE_SYNC_RESOLVER;MG_DISABLE_DAV_AUTH;MG_INTERNAL=;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\common\test_util.c" />
<ClCompile Include="..\..\..\mongoose\mongoose.c" />
<ClCompile Include="..\..\..\mongoose\test\unit_test.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\common\test_util.h" />
<ClInclude Include="..\..\..\mongoose\mongoose.h" />
<ClInclude Include="..\..\..\mongoose\test\unit_test.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
-42
View File
@@ -1,42 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\mongoose\mongoose.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\mongoose\test\unit_test.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\common\test_util.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\mongoose\mongoose.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\mongoose\test\unit_test.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\common\test_util.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
-1
View File
@@ -1 +0,0 @@
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /p:Configuration=Debug /t:Clean;Build %1