summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2017-12-12 20:23:46 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2017-12-12 20:23:46 +0000
commit068117e8d8884bf2700722c197fa2a56fbc19b6c (patch)
treebaf1c1e800276ea151d924c921c2d75957c993b5
parentInitial commit. (diff)
downloadmailmanclient-068117e8d8884bf2700722c197fa2a56fbc19b6c.zip
mailmanclient-068117e8d8884bf2700722c197fa2a56fbc19b6c.tar.xz
Adding upstream version 3.1.1.upstream/3.1.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--COPYING.LESSER165
-rw-r--r--MANIFEST.in7
-rw-r--r--Makefile94
-rw-r--r--PKG-INFO17
-rw-r--r--README.rst99
-rw-r--r--conf.py225
-rw-r--r--conftest.py27
-rw-r--r--pytest.ini2
-rw-r--r--setup.cfg11
-rw-r--r--setup.py51
-rw-r--r--setup_helpers.py143
-rw-r--r--src/mailmanclient.egg-info/PKG-INFO17
-rw-r--r--src/mailmanclient.egg-info/SOURCES.txt55
-rw-r--r--src/mailmanclient.egg-info/dependency_links.txt1
-rw-r--r--src/mailmanclient.egg-info/requires.txt2
-rw-r--r--src/mailmanclient.egg-info/top_level.txt1
-rw-r--r--src/mailmanclient/__init__.py68
-rw-r--r--src/mailmanclient/_client.py27
-rw-r--r--src/mailmanclient/client.py214
-rw-r--r--src/mailmanclient/constants.py21
-rw-r--r--src/mailmanclient/docs/NEWS.rst44
-rw-r--r--src/mailmanclient/docs/__init__.py0
-rw-r--r--src/mailmanclient/docs/apiref.rst69
-rw-r--r--src/mailmanclient/docs/conftest.py36
-rw-r--r--src/mailmanclient/docs/testing.rst104
-rw-r--r--src/mailmanclient/docs/using.rst1215
-rw-r--r--src/mailmanclient/restbase/__init__.py0
-rw-r--r--src/mailmanclient/restbase/base.py226
-rw-r--r--src/mailmanclient/restbase/connection.py113
-rw-r--r--src/mailmanclient/restbase/page.py92
-rw-r--r--src/mailmanclient/restobjects/__init__.py0
-rw-r--r--src/mailmanclient/restobjects/address.py76
-rw-r--r--src/mailmanclient/restobjects/archivers.py45
-rw-r--r--src/mailmanclient/restobjects/ban.py100
-rw-r--r--src/mailmanclient/restobjects/configuration.py34
-rw-r--r--src/mailmanclient/restobjects/domain.py99
-rw-r--r--src/mailmanclient/restobjects/header_match.py67
-rw-r--r--src/mailmanclient/restobjects/held_message.py62
-rw-r--r--src/mailmanclient/restobjects/mailinglist.py333
-rw-r--r--src/mailmanclient/restobjects/member.py51
-rw-r--r--src/mailmanclient/restobjects/preferences.py45
-rw-r--r--src/mailmanclient/restobjects/queue.py38
-rw-r--r--src/mailmanclient/restobjects/settings.py47
-rw-r--r--src/mailmanclient/restobjects/user.py104
-rw-r--r--src/mailmanclient/testing/__init__.py0
-rw-r--r--src/mailmanclient/testing/documentation.py40
-rw-r--r--src/mailmanclient/testing/vcr_helpers.py109
-rw-r--r--src/mailmanclient/tests/__init__.py0
-rw-r--r--src/mailmanclient/tests/data/TestDomains.test_no_domain.yaml14
-rw-r--r--src/mailmanclient/tests/data/TestUnicode.test_create_user.yaml59
-rw-r--r--src/mailmanclient/tests/data/using.rst.yaml5457
-rw-r--r--src/mailmanclient/tests/test_domain.py50
-rw-r--r--src/mailmanclient/tests/test_page.py58
-rw-r--r--src/mailmanclient/tests/test_unicode.py56
-rw-r--r--template.py23
-rw-r--r--tox.ini34
56 files changed, 10147 insertions, 0 deletions
diff --git a/COPYING.LESSER b/COPYING.LESSER
new file mode 100644
index 0000000..cca7fc2
--- /dev/null
+++ b/COPYING.LESSER
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ 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 that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU 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 as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..95b21d1
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,7 @@
+include *.py MANIFEST.in *.cfg *.ini COPYING.LESSER
+global-include *.txt *.rst *.yaml
+include Makefile
+prune _build
+prune dist
+prune .tox
+exclude .bzrignore
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..6a7ccab
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,94 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+ -rm -rf _build/*
+
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html
+ @echo
+ @echo "Build finished. The HTML pages are in _build/html."
+
+dirhtml:
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) _build/dirhtml
+ @echo
+ @echo "Build finished. The HTML pages are in _build/dirhtml."
+
+pickle:
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files."
+
+json:
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) _build/json
+ @echo
+ @echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in _build/htmlhelp."
+
+qthelp:
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) _build/qthelp
+ @echo
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
+ ".qhcp project file in _build/qthelp, like this:"
+ @echo "# qcollectiongenerator _build/qthelp/munepy.qhcp"
+ @echo "To view the help file:"
+ @echo "# assistant -collectionFile _build/qthelp/munepy.qhc"
+
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in _build/latex."
+ @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
+ "run these through (pdf)latex."
+
+changes:
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes
+ @echo
+ @echo "The overview file is in _build/changes."
+
+linkcheck:
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in _build/linkcheck/output.txt."
+
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) _build/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in _build/doctest/output.txt."
+
+pypi: html
+ (cd _build/html; \
+ rm -f index.html; \
+ ln -s README.html index.html; \
+ zip -r ../pypi .)
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..7a25972
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,17 @@
+Metadata-Version: 1.1
+Name: mailmanclient
+Version: 3.1.1
+Summary: mailmanclient -- python library for Mailman REST API
+Home-page: https://www.list.org/
+Author: Barry Warsaw
+Author-email: barry@list.org
+License: LGPLv3
+Description: ..
+Platform: UNKNOWN
+Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Topic :: Internet :: WWW/HTTP
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..d7d1286
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,99 @@
+..
+ This file is part of mailmanclient.
+
+ mailmanclient 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, version 3 of the License.
+
+ mailmanclient 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 mailman.client. If not, see <http://www.gnu.org/licenses/>.
+
+
+==============
+Mailman Client
+==============
+
+.. image:: https://gitlab.com/mailman/mailmanclient/badges/master/build.svg
+ :target: https://gitlab.com/mailman/mailmanclient/commits/master
+
+.. image:: https://readthedocs.org/projects/mailmanclient/badge
+ :target: https://mailmanclient.readthedocs.io
+
+.. image:: http://img.shields.io/pypi/v/mailmanclient.svg
+ :target: https://pypi.python.org/pypi/mailmanclient
+
+.. image:: http://img.shields.io/pypi/dm/mailmanclient.svg
+ :target: https://pypi.python.org/pypi/mailmanclient
+
+The ``mailmanclient`` library provides official Python bindings for the GNU
+Mailman 3 REST API.
+
+
+Requirements
+============
+
+``mailmanclient`` requires Python 2.7 or newer.
+
+
+Documentation
+=============
+
+A `simple guide`_ to using the library is available within this package, in
+the form of doctests. The manual is also available online at:
+
+ http://mailmanclient.readthedocs.org/en/latest/
+
+
+Project details
+===============
+
+The project home page is:
+
+ https://gitlab.com/mailman/mailmanclient
+
+You should report bugs at:
+
+ https://gitlab.com/mailman/mailmanclient/issues
+
+You can download the latest version of the package either from the `Cheese Shop`_:
+
+ http://pypi.python.org/pypi/mailmanclient
+
+or from the GitLab page above. Of course you can also just install it with
+``pip`` from the command line::
+
+ $ pip install mailmanclient
+
+You can grab the latest development copy of the code using Git, from the Gitlab
+home page above. If you have Git installed, you can grab your own branch of
+the code like this::
+
+ $ git clone https://gitlab.com/mailman/mailmanclient.git
+
+You may contact the developers via mailman-developers@python.org
+
+
+Acknowledgements
+================
+
+Many thanks to Florian Fuchs for his contribution of an initial REST
+client. Also thanks to all the contributors of Mailman Client who have
+contributed code, raised issues or devoted their time in any capacity!
+
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Table of Contents
+
+ src/mailmanclient/docs/NEWS.rst
+ src/mailmanclient/docs/using.rst
+ src/mailmanclient/docs/apiref.rst
+ src/mailmanclient/docs/testing.rst
+
+.. _`simple guide`: https://mailmanclient.readthedocs.io/en/latest/using.html
+.. _`Cheese Shop`: https://pypi.python.org/pypi/mailmanclient
diff --git a/conf.py b/conf.py
new file mode 100644
index 0000000..7d18575
--- /dev/null
+++ b/conf.py
@@ -0,0 +1,225 @@
+# -*- coding: utf-8 -*-
+#
+# mailman.client documentation build configuration file, created by
+# sphinx-quickstart on Wed Aug 17 15:43:10 2011.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys
+import os
+
+# import the source code directory into Python Path for use with Auto Module
+APP_ROOT = os.path.dirname(__file__)
+sys.path.insert(0, APP_ROOT)
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here
+# sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration ----------------------------------------------------
+# If your documentation needs a minimal Sphinx version, state it here.
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.autodoc',
+ 'sphinx.ext.viewcode']
+
+# Add any paths that contain templates here, relative to this directory.
+# templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+# source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'README'
+
+# General information about the project.
+project = u'Mailman Client'
+copyright = u'2012-2017, The Free Software Foundation'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+from setup_helpers import get_version # noqa
+_version = get_version('src/mailmanclient/constants.py')
+version = '.'.join(_version.split('.')[0:2])
+# The full version, including alpha/beta/rc tags.
+release = _version
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+# language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+# today = ''
+# Else, today_fmt is used as the format for a strftime call.
+# today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build', '.tox', 'eggs']
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+# default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+# add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+# add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+# show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+# modindex_common_prefix = []
+
+
+# -- Options for HTML output --------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+# html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+# html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+# html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+# html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+# html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+# html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+# html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+# html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+# html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+# html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+# html_additional_pages = {}
+
+# If false, no module index is generated.
+# html_domain_indices = True
+
+# If false, no index is generated.
+# html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+# html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+# html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+# html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+# html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+# html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+# html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'mailmanclientdoc'
+
+
+# -- Options for LaTeX output -------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+# latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+# latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual])
+latex_documents = [
+ ('README', 'mailmanclient.tex', u'Mailman Client Documentation',
+ u'Mailman Coders', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+# latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+# latex_use_parts = False
+
+# If true, show page references after internal links.
+# latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+# latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+# latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+# latex_appendices = []
+
+# If false, no module index is generated.
+# latex_domain_indices = True
+
+
+# -- Options for manual page output -------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('README', 'mailmanclient', u'Mailman Client Documentation',
+ [u'Mailman Coders'], 1)
+ ]
diff --git a/conftest.py b/conftest.py
new file mode 100644
index 0000000..66f0cc6
--- /dev/null
+++ b/conftest.py
@@ -0,0 +1,27 @@
+# Copyright (C) 2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailman.client.
+#
+# mailman.client 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, version 3 of the License.
+#
+# mailman.client 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 mailman.client. If not, see <http://www.gnu.org/licenses/>.
+
+"""pytest conftest"""
+
+__metaclass__ = type
+
+import os
+import pytest
+
+
+@pytest.fixture
+def vcr_cassette_path(request, vcr_cassette_name):
+ return os.path.join('src/mailmanclient/tests/data', vcr_cassette_name)
diff --git a/pytest.ini b/pytest.ini
new file mode 100644
index 0000000..bc96778
--- /dev/null
+++ b/pytest.ini
@@ -0,0 +1,2 @@
+[pytest]
+addopts = --doctest-glob='*.rst'
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..e893abb
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,11 @@
+[build_sphinx]
+source_dir = mailman/client
+
+[upload_docs]
+upload_dir = build/sphinx/html
+
+[egg_info]
+tag_build =
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..49b2aa8
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,51 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailman.client.
+#
+# mailman.client 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 3 of the License, or (at your
+# option) any later version.
+#
+# mailman.client 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 mailman.client. If not, see <http://www.gnu.org/licenses/>.
+
+from setup_helpers import description, get_version, require_python
+from setuptools import setup, find_packages
+
+
+require_python(0x20600f0)
+__version__ = get_version('src/mailmanclient/constants.py')
+
+
+setup(
+ name='mailmanclient',
+ version=__version__,
+ packages=find_packages('src'),
+ description='mailmanclient -- python library for Mailman REST API',
+ long_description=description('README.rst'),
+ package_dir={'': 'src'},
+ include_package_data=True,
+ maintainer='Barry Warsaw',
+ maintainer_email='barry@list.org',
+ license='LGPLv3',
+ url='https://www.list.org/',
+ classifiers=[
+ 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', # noqa
+ 'Operating System :: POSIX',
+ 'Programming Language :: Python :: 2.7',
+ 'Programming Language :: Python :: 3.4',
+ 'Programming Language :: Python :: 3.5',
+ 'Programming Language :: Python :: 3.6',
+ 'Topic :: Internet :: WWW/HTTP ',
+ ],
+ install_requires=[
+ 'httplib2',
+ 'six',
+ ],
+ )
diff --git a/setup_helpers.py b/setup_helpers.py
new file mode 100644
index 0000000..0b904df
--- /dev/null
+++ b/setup_helpers.py
@@ -0,0 +1,143 @@
+# Copyright (C) 2009-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailman.client
+#
+# mailman.client 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, version 3 of the License.
+#
+# mailman.client 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 mailman.client. If not, see <http://www.gnu.org/licenses/>.
+
+"""setup.py helper functions."""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+import os
+import re
+import sys
+import codecs
+
+
+__metaclass__ = type
+__all__ = [
+ 'description',
+ 'find_doctests',
+ 'get_version',
+ 'long_description',
+ 'require_python',
+ ]
+
+
+DEFAULT_VERSION_RE = re.compile(r'(?P<version>\d+\.\d(?:\.\w+)?)')
+NL = '\n'
+
+
+def require_python(minimum):
+ """Require at least a minimum Python version.
+
+ The version number is expressed in terms of `sys.hexversion`. E.g. to
+ require a minimum of Python 2.6, use::
+
+ >>> require_python(0x206000f0)
+
+ :param minimum: Minimum Python version supported.
+ :type minimum: integer
+ """
+ if sys.hexversion < minimum:
+ hversion = hex(minimum)[2:]
+ if len(hversion) % 2 != 0:
+ hversion = '0' + hversion
+ split = list(hversion)
+ parts = []
+ while split:
+ parts.append(int(''.join((split.pop(0), split.pop(0))), 16))
+ major, minor, micro, release = parts
+ if release == 0xf0:
+ print('Python {0}.{1}.{2} or better is required'.format(
+ major, minor, micro))
+ else:
+ print('Python {0}.{1}.{2} ({3}) or better is required'.format(
+ major, minor, micro, hex(release)[2:]))
+ sys.exit(1)
+
+
+def get_version(filename, pattern=None):
+ """Extract the __version__ from a file without importing it.
+
+ While you could get the __version__ by importing the module, the very act
+ of importing can cause unintended consequences. For example, Distribute's
+ automatic 2to3 support will break. Instead, this searches the file for a
+ line that starts with __version__, and extract the version number by
+ regular expression matching.
+
+ By default, two or three dot-separated digits are recognized, but by
+ passing a pattern parameter, you can recognize just about anything. Use
+ the `version` group name to specify the match group.
+
+ :param filename: The name of the file to search.
+ :type filename: string
+ :param pattern: Optional alternative regular expression pattern to use.
+ :type pattern: string
+ :return: The version that was extracted.
+ :rtype: string
+ """
+ if pattern is None:
+ cre = DEFAULT_VERSION_RE
+ else:
+ cre = re.compile(pattern)
+ with open(filename) as fp:
+ for line in fp:
+ if line.startswith('__version__'):
+ mo = cre.search(line)
+ assert mo, 'No valid __version__ string found'
+ return mo.group('version')
+ raise AssertionError('No __version__ assignment found')
+
+
+def find_doctests(start='.', extension='.txt'):
+ """Find separate-file doctests in the package.
+
+ This is useful for Distribute's automatic 2to3 conversion support. The
+ `setup()` keyword argument `convert_2to3_doctests` requires file names,
+ which may be difficult to track automatically as you add new doctests.
+
+ :param start: Directory to start searching in (default is cwd)
+ :type start: string
+ :param extension: Doctest file extension (default is .txt)
+ :type extension: string
+ :return: The doctest files found.
+ :rtype: list
+ """
+ doctests = []
+ for dirpath, dirnames, filenames in os.walk(start):
+ doctests.extend(os.path.join(dirpath, filename)
+ for filename in filenames
+ if filename.endswith(extension))
+ return doctests
+
+
+def long_description(*filenames):
+ """Provide a long description."""
+ res = []
+ for value in filenames:
+ base, ext = os.path.splitext(value)
+ if ext in ('.txt', '.rst'):
+ with codecs.open(value, 'r', encoding='utf-8') as fp:
+ value = fp.read()
+ res.append(value)
+ if not value.endswith(NL):
+ res.append('')
+ return NL.join(res)
+
+
+def description(filename):
+ """Provide a short description."""
+ with codecs.open(filename, 'r', encoding='utf-8') as fp:
+ for line in fp:
+ return line.strip()
diff --git a/src/mailmanclient.egg-info/PKG-INFO b/src/mailmanclient.egg-info/PKG-INFO
new file mode 100644
index 0000000..7a25972
--- /dev/null
+++ b/src/mailmanclient.egg-info/PKG-INFO
@@ -0,0 +1,17 @@
+Metadata-Version: 1.1
+Name: mailmanclient
+Version: 3.1.1
+Summary: mailmanclient -- python library for Mailman REST API
+Home-page: https://www.list.org/
+Author: Barry Warsaw
+Author-email: barry@list.org
+License: LGPLv3
+Description: ..
+Platform: UNKNOWN
+Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Topic :: Internet :: WWW/HTTP
diff --git a/src/mailmanclient.egg-info/SOURCES.txt b/src/mailmanclient.egg-info/SOURCES.txt
new file mode 100644
index 0000000..53309d2
--- /dev/null
+++ b/src/mailmanclient.egg-info/SOURCES.txt
@@ -0,0 +1,55 @@
+COPYING.LESSER
+MANIFEST.in
+Makefile
+README.rst
+conf.py
+conftest.py
+pytest.ini
+setup.cfg
+setup.py
+setup_helpers.py
+template.py
+tox.ini
+src/mailmanclient/__init__.py
+src/mailmanclient/_client.py
+src/mailmanclient/client.py
+src/mailmanclient/constants.py
+src/mailmanclient.egg-info/PKG-INFO
+src/mailmanclient.egg-info/SOURCES.txt
+src/mailmanclient.egg-info/dependency_links.txt
+src/mailmanclient.egg-info/requires.txt
+src/mailmanclient.egg-info/top_level.txt
+src/mailmanclient/docs/NEWS.rst
+src/mailmanclient/docs/__init__.py
+src/mailmanclient/docs/apiref.rst
+src/mailmanclient/docs/conftest.py
+src/mailmanclient/docs/testing.rst
+src/mailmanclient/docs/using.rst
+src/mailmanclient/restbase/__init__.py
+src/mailmanclient/restbase/base.py
+src/mailmanclient/restbase/connection.py
+src/mailmanclient/restbase/page.py
+src/mailmanclient/restobjects/__init__.py
+src/mailmanclient/restobjects/address.py
+src/mailmanclient/restobjects/archivers.py
+src/mailmanclient/restobjects/ban.py
+src/mailmanclient/restobjects/configuration.py
+src/mailmanclient/restobjects/domain.py
+src/mailmanclient/restobjects/header_match.py
+src/mailmanclient/restobjects/held_message.py
+src/mailmanclient/restobjects/mailinglist.py
+src/mailmanclient/restobjects/member.py
+src/mailmanclient/restobjects/preferences.py
+src/mailmanclient/restobjects/queue.py
+src/mailmanclient/restobjects/settings.py
+src/mailmanclient/restobjects/user.py
+src/mailmanclient/testing/__init__.py
+src/mailmanclient/testing/documentation.py
+src/mailmanclient/testing/vcr_helpers.py
+src/mailmanclient/tests/__init__.py
+src/mailmanclient/tests/test_domain.py
+src/mailmanclient/tests/test_page.py
+src/mailmanclient/tests/test_unicode.py
+src/mailmanclient/tests/data/TestDomains.test_no_domain.yaml
+src/mailmanclient/tests/data/TestUnicode.test_create_user.yaml
+src/mailmanclient/tests/data/using.rst.yaml \ No newline at end of file
diff --git a/src/mailmanclient.egg-info/dependency_links.txt b/src/mailmanclient.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/mailmanclient.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/src/mailmanclient.egg-info/requires.txt b/src/mailmanclient.egg-info/requires.txt
new file mode 100644
index 0000000..7229277
--- /dev/null
+++ b/src/mailmanclient.egg-info/requires.txt
@@ -0,0 +1,2 @@
+httplib2
+six
diff --git a/src/mailmanclient.egg-info/top_level.txt b/src/mailmanclient.egg-info/top_level.txt
new file mode 100644
index 0000000..8471bae
--- /dev/null
+++ b/src/mailmanclient.egg-info/top_level.txt
@@ -0,0 +1 @@
+mailmanclient
diff --git a/src/mailmanclient/__init__.py b/src/mailmanclient/__init__.py
new file mode 100644
index 0000000..1ef8d75
--- /dev/null
+++ b/src/mailmanclient/__init__.py
@@ -0,0 +1,68 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+#
+# flake8: noqa
+
+"""Package contents."""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+import six
+
+from mailmanclient.client import Client
+from mailmanclient.constants import __version__
+from mailmanclient.restbase.connection import MailmanConnectionError
+from mailmanclient.restobjects.address import Address, Addresses
+from mailmanclient.restobjects.ban import Bans, BannedAddress
+from mailmanclient.restobjects.configuration import Configuration
+from mailmanclient.restobjects.header_match import HeaderMatch, HeaderMatches
+from mailmanclient.restobjects.held_message import HeldMessage
+from mailmanclient.restobjects.archivers import ListArchivers
+from mailmanclient.restobjects.mailinglist import MailingList
+from mailmanclient.restobjects.member import Member
+from mailmanclient.restobjects.preferences import Preferences, PreferencesMixin
+from mailmanclient.restobjects.queue import Queue
+from mailmanclient.restobjects.settings import Settings
+from mailmanclient.restobjects.user import User
+
+
+__metaclass__ = type
+__all__ = [
+ 'Address',
+ 'Addresses',
+ 'Bans',
+ 'BannedAddress',
+ 'Client',
+ 'Configuration',
+ 'HeaderMatch',
+ 'HeaderMatches',
+ 'HeldMessage',
+ 'ListArchivers',
+ 'MailingList',
+ 'MailmanConnectionError',
+ 'Member',
+ 'Preferences',
+ 'PreferencesMixin',
+ 'Queue',
+ 'Settings',
+ 'User',
+ '__version__',
+]
+
+if six.PY2:
+ __all__ = [str(x) for x in __all__]
+elif six.PY3:
+ __all__ = [bytes(x, 'utf-8') for x in __all__]
diff --git a/src/mailmanclient/_client.py b/src/mailmanclient/_client.py
new file mode 100644
index 0000000..a79e6f2
--- /dev/null
+++ b/src/mailmanclient/_client.py
@@ -0,0 +1,27 @@
+# Copyright (C) 2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailman.client 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, version 3 of the License.
+#
+# mailman.client 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 mailman.client. If not, see <http://www.gnu.org/licenses/>.
+
+"""Old module for backwards compatibility"""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+from mailmanclient import * # noqa
+
+__metaclass__ = type
+
+# XXX: This module exists for backwards compatibility with older versions of
+# MailmanClient which had all the API under this module. It will be removed in
+# future after few cycles of deprecation.
diff --git a/src/mailmanclient/client.py b/src/mailmanclient/client.py
new file mode 100644
index 0000000..81a1ee7
--- /dev/null
+++ b/src/mailmanclient/client.py
@@ -0,0 +1,214 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+
+"""Client code."""
+
+from __future__ import absolute_import, unicode_literals
+
+import warnings
+from operator import itemgetter
+
+from mailmanclient.constants import (MISSING)
+from mailmanclient.restobjects.address import Address
+from mailmanclient.restobjects.ban import Bans, BannedAddress
+from mailmanclient.restobjects.configuration import Configuration
+from mailmanclient.restobjects.domain import Domain
+from mailmanclient.restobjects.mailinglist import MailingList
+from mailmanclient.restobjects.member import Member
+from mailmanclient.restobjects.preferences import Preferences
+from mailmanclient.restobjects.queue import Queue
+from mailmanclient.restobjects.user import User
+from mailmanclient.restbase.connection import Connection
+from mailmanclient.restbase.page import Page
+
+__metaclass__ = type
+__all__ = [
+ 'Client'
+]
+
+
+#
+# --- The following classes are part of the API
+#
+
+class Client:
+ """Access the Mailman REST API root."""
+
+ def __init__(self, baseurl, name=None, password=None):
+ """Initialize client access to the REST API.
+
+ :param baseurl: The base url to access the Mailman 3 REST API.
+ :param name: The Basic Auth user name. If given, the `password` must
+ also be given.
+ :param password: The Basic Auth password. If given the `name` must
+ also be given.
+ """
+ self._connection = Connection(baseurl, name, password)
+
+ def __repr__(self):
+ return '<Client ({0.name}:{0.password}) {0.baseurl}>'.format(
+ self._connection)
+
+ @property
+ def system(self):
+ return self._connection.call('system/versions')[1]
+
+ @property
+ def preferences(self):
+ return Preferences(self._connection, 'system/preferences')
+
+ @property
+ def configuration(self):
+ response, content = self._connection.call('system/configuration')
+ return {section: Configuration(
+ self._connection, section) for section in content['sections']}
+
+ @property
+ def pipelines(self):
+ response, content = self._connection.call('system/pipelines')
+ return content
+
+ @property
+ def chains(self):
+ response, content = self._connection.call('system/chains')
+ return content
+
+ @property
+ def queues(self):
+ response, content = self._connection.call('queues')
+ queues = {}
+ for entry in content['entries']:
+ queues[entry['name']] = Queue(
+ self._connection, entry['self_link'], entry)
+ return queues
+
+ @property
+ def lists(self):
+ return self.get_lists()
+
+ def get_lists(self, advertised=None):
+ url = 'lists'
+ if advertised:
+ url += '?advertised=true'
+ response, content = self._connection.call(url)
+ if 'entries' not in content:
+ return []
+ return [MailingList(self._connection, entry['self_link'], entry)
+ for entry in content['entries']]
+
+ def get_list_page(self, count=50, page=1, advertised=None):
+ url = 'lists'
+ if advertised:
+ url += '?advertised=true'
+ return Page(self._connection, url, MailingList, count, page)
+
+ @property
+ def domains(self):
+ response, content = self._connection.call('domains')
+ if 'entries' not in content:
+ return []
+ return [Domain(self._connection, entry['self_link'])
+ for entry in sorted(content['entries'],
+ key=itemgetter('mail_host'))]
+
+ @property
+ def members(self):
+ response, content = self._connection.call('members')
+ if 'entries' not in content:
+ return []
+ return [Member(self._connection, entry['self_link'], entry)
+ for entry in content['entries']]
+
+ def get_member(self, fqdn_listname, subscriber_address):
+ return self.get_list(fqdn_listname).get_member(subscriber_address)
+
+ def get_member_page(self, count=50, page=1):
+ return Page(self._connection, 'members', Member, count, page)
+
+ @property
+ def users(self):
+ response, content = self._connection.call('users')
+ if 'entries' not in content:
+ return []
+ return [User(self._connection, entry['self_link'], entry)
+ for entry in sorted(content['entries'],
+ key=itemgetter('self_link'))]
+
+ def get_user_page(self, count=50, page=1):
+ return Page(self._connection, 'users', User, count, page)
+
+ def create_domain(self, mail_host, base_url=MISSING,
+ description=None, owner=None):
+ if base_url is not MISSING:
+ warnings.warn(
+ 'The `base_url` parameter in the `create_domain()` method is '
+ 'deprecated. It is not used any more and will be removed in '
+ 'the future.', DeprecationWarning, stacklevel=2)
+ data = dict(mail_host=mail_host)
+ if description is not None:
+ data['description'] = description
+ if owner is not None:
+ data['owner'] = owner
+ response, content = self._connection.call('domains', data)
+ return Domain(self._connection, response['location'])
+
+ def delete_domain(self, mail_host):
+ response, content = self._connection.call(
+ 'domains/{0}'.format(mail_host), None, 'DELETE')
+
+ def get_domain(self, mail_host, web_host=MISSING):
+ """Get domain by its mail_host or its web_host."""
+ if web_host is not MISSING:
+ warnings.warn(
+ 'The `web_host` parameter in the `get_domain()` method is '
+ 'deprecated. It is not used any more and will be removed in '
+ 'the future.', DeprecationWarning, stacklevel=2)
+ response, content = self._connection.call(
+ 'domains/{0}'.format(mail_host))
+ return Domain(self._connection, content['self_link'])
+
+ def create_user(self, email, password, display_name=''):
+ response, content = self._connection.call(
+ 'users', dict(email=email,
+ password=password,
+ display_name=display_name))
+ return User(self._connection, response['location'])
+
+ def get_user(self, address):
+ response, content = self._connection.call(
+ 'users/{0}'.format(address))
+ return User(self._connection, content['self_link'], content)
+
+ def get_address(self, address):
+ response, content = self._connection.call(
+ 'addresses/{0}'.format(address))
+ return Address(self._connection, content['self_link'], content)
+
+ def get_list(self, fqdn_listname):
+ response, content = self._connection.call(
+ 'lists/{0}'.format(fqdn_listname))
+ return MailingList(self._connection, content['self_link'], content)
+
+ def delete_list(self, fqdn_listname):
+ response, content = self._connection.call(
+ 'lists/{0}'.format(fqdn_listname), None, 'DELETE')
+
+ @property
+ def bans(self):
+ return Bans(self._connection, 'bans', mlist=None)
+
+ def get_bans_page(self, count=50, page=1):
+ return Page(self._connection, 'bans', BannedAddress, count, page)
diff --git a/src/mailmanclient/constants.py b/src/mailmanclient/constants.py
new file mode 100644
index 0000000..b9a93f8
--- /dev/null
+++ b/src/mailmanclient/constants.py
@@ -0,0 +1,21 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+
+
+__version__ = '3.1.1'
+
+DEFAULT_PAGE_ITEM_COUNT = 50
+MISSING = object()
diff --git a/src/mailmanclient/docs/NEWS.rst b/src/mailmanclient/docs/NEWS.rst
new file mode 100644
index 0000000..45d6421
--- /dev/null
+++ b/src/mailmanclient/docs/NEWS.rst
@@ -0,0 +1,44 @@
+=======================
+NEWS for mailmanclient
+=======================
+
+
+3.1.1 (2017-10-07)
+==================
+
+ * Python3 compatibility is fixed, mailmanclient is now compatible through Python2.7 - Python3.6
+ * Internal source code is now split into several class-specific modules as
+ compared to previously a single giant _client module.
+ * All the RestObjects, like MailingList, are now exposed from the top level import.
+ * Old `mailmanclient._client` module is added back for compatibility with
+ versions of Postorius that use some internal APIs.
+
+
+3.1 (2017-05-25)
+================
+
+ * Bug fixes.
+ * Align with Mailman 3.1 Core REST API.
+ * Python3 compatibility is broken because of a urllib bug.
+
+
+1.0.1 (2015-11-14)
+==================
+
+ * Bugfix release.
+
+
+1.0.0 (2015-04-17)
+==================
+
+ * Port to Python 3.4.
+ * Run test suite with `tox`.
+ * Use vcrpy for HTTP testing.
+ * Add list archiver access.
+ * Add subscription moderation
+
+
+1.0.0a1 (2014-03-15)
+====================
+
+ * Initial release.
diff --git a/src/mailmanclient/docs/__init__.py b/src/mailmanclient/docs/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/mailmanclient/docs/__init__.py
diff --git a/src/mailmanclient/docs/apiref.rst b/src/mailmanclient/docs/apiref.rst
new file mode 100644
index 0000000..8057e2d
--- /dev/null
+++ b/src/mailmanclient/docs/apiref.rst
@@ -0,0 +1,69 @@
+=============
+API Reference
+=============
+
+.. autoclass:: mailmanclient.Client
+ :members:
+ :undoc-members:
+ :private-members:
+ :inherited-members:
+
+.. autoclass:: mailmanclient._client.Domain
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.MailingList
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.ListArchivers
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.Bans
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.BannedAddress
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.HeaderMatches
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.HeaderMatch
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.Member
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.User
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.Addresses
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.Address
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.HeldMessage
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.Preferences
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.Settings
+ :members:
+ :undoc-members:
+
+.. autoclass:: mailmanclient._client.Queue
+ :members:
+ :undoc-members:
diff --git a/src/mailmanclient/docs/conftest.py b/src/mailmanclient/docs/conftest.py
new file mode 100644
index 0000000..813c03b
--- /dev/null
+++ b/src/mailmanclient/docs/conftest.py
@@ -0,0 +1,36 @@
+# Copyright (C) 2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+
+"""Wrappers for doctests to run with pytest"""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+import pytest
+
+from mailmanclient.testing.documentation import dump
+
+
+def pytest_collection_modifyitems(items):
+ for item in items:
+ item.add_marker(pytest.mark.vcr)
+
+
+@pytest.fixture(autouse=True)
+def import_stuff(doctest_namespace):
+ doctest_namespace['absolute_import'] = absolute_import
+ doctest_namespace['print_function'] = print_function
+ doctest_namespace['unicode_literals'] = unicode_literals
+ doctest_namespace['dump'] = dump
diff --git a/src/mailmanclient/docs/testing.rst b/src/mailmanclient/docs/testing.rst
new file mode 100644
index 0000000..9ff26a6
--- /dev/null
+++ b/src/mailmanclient/docs/testing.rst
@@ -0,0 +1,104 @@
+========================
+Developing MailmanClient
+========================
+
+
+Running Tests
+=============
+
+The test suite is run with the `tox`_ tool, which allows it to be run against
+multiple versions of Python. There are two modes to the test suite:
+
+ * *Record mode* which is used to record the HTTP traffic against a live
+ Mailman 3 REST server.
+ * *Replay mode* which allows you to run the test suite off-line, without
+ running the REST server.
+
+Whenever you add tests for other parts of the REST API, you need to run the
+suite once in record mode to generate the YAML file of HTTP requests and
+responses.
+
+Then you can run the test suite in replay mode as often as you want, and
+Mailman 3 needn't even be installed on your system.
+
+Since this branch ships with a recording file, you don't need to run in record
+mode to start with.
+
+
+Replay mode
+===========
+
+To run the test suite in replay mode (the default), just run the following::
+
+ $ tox
+
+This will attempt to run the test suite against Python 2.7, 3.4, 3.5 and 3.6 or
+whatever combination of those that are available on your system.
+
+
+Record mode
+===========
+
+Start by branching the Mailman 3 code base, then you should install it into a
+virtual environment. The easiest way to do this is with `tox`::
+
+ $ tox --notest -r
+
+Now, use the virtual environment that `tox` creates to create a template `var`
+directory in the current directory::
+
+ $ .tox/py34/bin/mailman info
+
+Now you need to modify the ``var/etc/mailman.cfg`` configuration file, so that
+it contains the following::
+
+ [devmode]
+ enabled: yes
+ testing: yes
+ recipient: you@yourdomain.com
+
+ [mta]
+ smtp_port: 9025
+ lmtp_port: 9024
+ incoming: mailman.testing.mta.FakeMTA
+
+ [webservice]
+ port: 9001
+
+ [archiver.mhonarc]
+ enable: yes
+
+ [archiver.mail_archive]
+ enable: yes
+
+ [archiver.prototype]
+ enable: yes
+
+Now you can start Mailman 3::
+
+ $ .tox/py34/bin/mailman start
+
+Back in your ``mailmanclient`` branch, run the test suite in record mode::
+
+ $ tox -e record
+
+You should now have an updated recording file (``tape.yaml``).
+
+If you find you need to re-run the test suite, you *must* first stop the
+Mailman REST server, and then delete the ``mailman.db`` file, since it
+contains state that will mess up the ``mailmanclient`` test suite::
+
+ $ cd <mailman3-branch>
+ $ .tox/py34/bin/mailman stop
+ $ rm -f var/data/mailman.db
+ $ .tox/py34/bin/mailman start
+
+ $ cd <mailmanclient-branch>
+ $ tox -e record
+
+Once you're done recording the HTTP traffic, you can stop the Mailman 3 server
+and you won't need it again. It's a good idea to commit the ``tape.yaml``
+changes for other users of your branch.
+
+
+.. _`tox`: https://testrun.org/tox/latest/
diff --git a/src/mailmanclient/docs/using.rst b/src/mailmanclient/docs/using.rst
new file mode 100644
index 0000000..6175ae5
--- /dev/null
+++ b/src/mailmanclient/docs/using.rst
@@ -0,0 +1,1215 @@
+=============
+Example Usage
+=============
+
+This is the official Python bindings for the GNU Mailman REST API. In order
+to talk to Mailman, the engine's REST server must be running. You begin by
+instantiating a client object to access the root of the REST hierarchy,
+providing it the base URL, user name and password (for Basic Auth).
+
+ >>> from mailmanclient import Client
+ >>> client = Client('http://localhost:9001/3.1', 'restadmin', 'restpass')
+
+.. note::
+ Please note that port '9001' is used above, since mailman's test server
+ runs on port *9001*. In production Mailman's REST API usually listens on
+ port *8001*.
+
+We can retrieve basic information about the server.
+
+ >>> dump(client.system)
+ api_version: 3.1
+ http_etag: "..."
+ mailman_version: GNU Mailman ... (...)
+ python_version: ...
+ self_link: http://localhost:9001/3.1/system/versions
+
+To start with, there are no known mailing lists.
+
+ >>> client.lists
+ []
+
+
+Domains
+=======
+
+Before new mailing lists can be added, the domain that the list will live in
+must be added. By default, there are no known domains.
+
+ >>> client.domains
+ []
+
+It's easy to create a new domain; when you do, a proxy object for that domain
+is returned.
+
+ >>> example_dot_com = client.create_domain('example.com')
+ >>> example_dot_com
+ <Domain "example.com">
+ >>> print(example_dot_com.description)
+ None
+ >>> print(example_dot_com.mail_host)
+ example.com
+
+You can also get an existing domain independently using its mail host.
+
+ >>> example = client.get_domain('example.com')
+ >>> example
+ <Domain "example.com">
+
+After creating a few more domains, we can print the list of all domains.
+
+ >>> client.create_domain('example.net')
+ <Domain "example.net">
+ >>> example_org = client.create_domain('example.org')
+ >>> print(example_org)
+ <Domain "example.org">
+ >>> for mail_host in client.domains:
+ ... print(mail_host)
+ <Domain "example.com">
+ <Domain "example.net">
+ <Domain "example.org">
+
+Also, domain can be deleted.
+
+ >>> example_org.delete()
+ >>> for mail_host in client.domains:
+ ... print(mail_host)
+ <Domain "example.com">
+ <Domain "example.net">
+
+
+Mailing lists
+=============
+
+Once you have a domain, you can create mailing lists in that domain.
+
+ >>> test_one = example.create_list('test-1')
+ >>> test_one
+ <List "test-1@example.com">
+ >>> print(test_one.fqdn_listname)
+ test-1@example.com
+ >>> print(test_one.mail_host)
+ example.com
+ >>> print(test_one.list_name)
+ test-1
+ >>> print(test_one.display_name)
+ Test-1
+
+You can also retrieve the mailing list after the fact.
+
+ >>> my_list = client.get_list('test-1@example.com')
+ >>> my_list
+ <List "test-1@example.com">
+
+And you can print all the known mailing lists.
+::
+
+ >>> example.create_list('test-2')
+ <List "test-2@example.com">
+ >>> domain = client.get_domain('example.net')
+ >>> domain.create_list('test-3')
+ <List "test-3@example.net">
+ >>> example.create_list('test-3')
+ <List "test-3@example.com">
+
+ >>> for mlist in client.lists:
+ ... print(mlist)
+ <List "test-1@example.com">
+ <List "test-2@example.com">
+ <List "test-3@example.com">
+ <List "test-3@example.net">
+
+You can also select advertised lists only.
+::
+
+ >>> my_list.settings['advertised'] = False
+ >>> my_list.settings.save()
+ >>> for mlist in client.get_lists(advertised=True):
+ ... print(mlist)
+ <List "test-2@example.com">
+ <List "test-3@example.com">
+ <List "test-3@example.net">
+
+List results can be retrieved as pages:
+
+ >>> page = client.get_list_page(count=2, page=1)
+ >>> page.nr
+ 1
+ >>> len(page)
+ 2
+ >>> page.total_size
+ 4
+ >>> for m_list in page:
+ ... print(m_list)
+ <List "test-1@example.com">
+ <List "test-2@example.com">
+ >>> page = page.next
+ >>> page.nr
+ 2
+ >>> for m_list in page:
+ ... print(m_list)
+ <List "test-3@example.com">
+ <List "test-3@example.net">
+
+Pages can also use the advertised filter:
+
+ >>> page = client.get_list_page(count=2, page=1, advertised=True)
+ >>> for m_list in page:
+ ... print(m_list)
+ <List "test-2@example.com">
+ <List "test-3@example.com">
+
+If you only want to know all lists for a specific domain, use the domain
+object.
+
+ >>> for mlist in example.lists:
+ ... print(mlist)
+ <List "test-1@example.com">
+ <List "test-2@example.com">
+ <List "test-3@example.com">
+
+It is also possible to display only advertised lists when using the domain.
+
+ >>> for mlist in example.get_lists(advertised=True):
+ ... print(mlist)
+ <List "test-2@example.com">
+ <List "test-3@example.com">
+ >>> for mlist in example.get_list_page(count=2, page=1, advertised=True):
+ ... print(mlist)
+ <List "test-2@example.com">
+ <List "test-3@example.com">
+
+You can use a list instance to delete the list.
+
+ >>> test_three = client.get_list('test-3@example.net')
+ >>> test_three.delete()
+
+You can also delete a list using the client instance's delete_list method.
+
+ >>> client.delete_list('test-3@example.com')
+
+ >>> for mlist in client.lists:
+ ... print(mlist)
+ <List "test-1@example.com">
+ <List "test-2@example.com">
+
+
+Membership
+==========
+
+Email addresses can subscribe to existing mailing lists, becoming members of
+that list. The address is a unique id for a specific user in the system, and
+a member is a user that is subscribed to a mailing list. Email addresses need
+not be pre-registered, though the auto-registered user will be unique for each
+email address.
+
+The system starts out with no members.
+
+ >>> client.members
+ []
+
+New members can be easily added; users are automatically registered.
+::
+
+ >>> test_two = client.get_list('test-2@example.com')
+ >>> print(test_two.settings['subscription_policy'])
+ confirm
+
+Email addresses need to be verified first, so if we try to subscribe a
+user, we get a response with a token:
+
+ >>> data = test_one.subscribe('unverified@example.com', 'Unverified')
+ >>> data['token'] is not None
+ True
+ >>> print(data['token_owner'])
+ subscriber
+
+If we know the email address to be valid, we can set the
+``pre_verified`` flag. However, the list's subscription policy is
+"confirm", so if we try to subscribe a user, we will also get a token
+back:
+
+ >>> data = test_one.subscribe('unconfirmed@example.com',
+ ... 'Unconfirmed',
+ ... pre_verified=True)
+ >>> data['token'] is not None
+ True
+ >>> print(data['token_owner'])
+ subscriber
+
+If we know the user originated the subscription (for example if she or
+he has been authenticated elsewhere), we can set the ``pre_confirmed``
+flag.
+
+The ``pre_approved`` flag is used for lists that require moderator
+approval and should only be used if the subscription is initiated by a
+moderator or admin.
+
+ >>> test_one.subscribe('anna@example.com', 'Anna',
+ ... pre_verified=True,
+ ... pre_confirmed=True)
+ <Member "anna@example.com" on "test-1.example.com">
+
+ >>> test_one.subscribe('bill@example.com', 'Bill',
+ ... pre_verified=True,
+ ... pre_confirmed=True)
+ <Member "bill@example.com" on "test-1.example.com">
+
+ >>> test_two.subscribe('anna@example.com',
+ ... pre_verified=True,
+ ... pre_confirmed=True)
+ <Member "anna@example.com" on "test-2.example.com">
+
+ >>> test_two.subscribe('cris@example.com', 'Cris',
+ ... pre_verified=True,
+ ... pre_confirmed=True)
+ <Member "cris@example.com" on "test-2.example.com">
+
+We can retrieve all known memberships. These are sorted first by mailing list
+name, then by email address.
+
+ >>> for member in client.members:
+ ... print(member)
+ <Member "anna@example.com" on "test-1.example.com">
+ <Member "bill@example.com" on "test-1.example.com">
+ <Member "anna@example.com" on "test-2.example.com">
+ <Member "cris@example.com" on "test-2.example.com">
+
+We can also view the memberships for a single mailing list.
+
+ >>> for member in test_one.members:
+ ... print(member)
+ <Member "anna@example.com" on "test-1.example.com">
+ <Member "bill@example.com" on "test-1.example.com">
+
+Membership lists can be paginated, to recieve only a part of the result.
+
+ >>> page = client.get_member_page(count=2, page=1)
+ >>> page.nr
+ 1
+ >>> page.total_size
+ 4
+ >>> for member in page:
+ ... print(member)
+ <Member "anna@example.com" on "test-1.example.com">
+ <Member "bill@example.com" on "test-1.example.com">
+
+ >>> page = page.next
+ >>> page.nr
+ 2
+ >>> for member in page:
+ ... print(member)
+ <Member "anna@example.com" on "test-2.example.com">
+ <Member "cris@example.com" on "test-2.example.com">
+
+ >>> page = test_one.get_member_page(count=1, page=1)
+ >>> page.nr
+ 1
+ >>> page.total_size
+ 2
+ >>> for member in page:
+ ... print(member)
+ <Member "anna@example.com" on "test-1.example.com">
+ >>> page = page.next
+ >>> page.nr
+ 2
+ >>> page.total_size
+ 2
+ >>> for member in page:
+ ... print(member)
+ <Member "bill@example.com" on "test-1.example.com">
+
+We can get a single membership too.
+
+ >>> cris_test_two = test_two.get_member('cris@example.com')
+ >>> cris_test_two
+ <Member "cris@example.com" on "test-2.example.com">
+ >>> print(cris_test_two.role)
+ member
+
+A membership can also be retrieved without instantiating the list object first:
+
+ >>> client.get_member('test-2@example.com', 'cris@example.com')
+ <Member "cris@example.com" on "test-2.example.com">
+
+A membership has preferences.
+
+ >>> prefs = cris_test_two.preferences
+ >>> print(prefs['delivery_mode'])
+ None
+ >>> print(prefs['acknowledge_posts'])
+ None
+ >>> print(prefs['delivery_status'])
+ None
+ >>> print(prefs['hide_address'])
+ None
+ >>> print(prefs['preferred_language'])
+ None
+ >>> print(prefs['receive_list_copy'])
+ None
+ >>> print(prefs['receive_own_postings'])
+ None
+
+The membership object's ``user`` attribute will return a User object:
+
+ >>> cris_test_two.user
+ <User "Cris" (...)>
+
+If you use an address which is not a member of test_two `ValueError` is raised:
+
+ >>> test_two.unsubscribe('nomember@example.com')
+ Traceback (most recent call last):
+ ...
+ ValueError: nomember@example.com is not a member address of test-2@example.com
+
+After a while, Anna decides to unsubscribe from the Test One mailing list,
+though she keeps her Test Two membership active.
+
+ >>> import time
+ >>> time.sleep(2)
+ >>> test_one.unsubscribe('anna@example.com')
+ >>> for member in client.members:
+ ... print(member)
+ <Member "bill@example.com" on "test-1.example.com">
+ <Member "anna@example.com" on "test-2.example.com">
+ <Member "cris@example.com" on "test-2.example.com">
+
+A little later, Cris decides to unsubscribe from the Test Two mailing list.
+
+ >>> cris_test_two.unsubscribe()
+ >>> for member in client.members:
+ ... print(member)
+ <Member "bill@example.com" on "test-1.example.com">
+ <Member "anna@example.com" on "test-2.example.com">
+
+If you try to unsubscribe an address which is not a member address
+`ValueError` is raised:
+
+ >>> test_one.unsubscribe('nomember@example.com')
+ Traceback (most recent call last):
+ ...
+ ValueError: nomember@example.com is not a member address of test-1@example.com
+
+
+Non-Members
+===========
+
+When someone attempts to post to a list but is not a member, then they are
+listed as a "non-member" of that list so that a moderator can choose how to
+handle their messages going forward. In some cases, one might wish to
+accept or reject their future messages automatically. Just like with regular
+members, they are given a unique id.
+
+The list starts out with no nonmembers.
+
+ >>> test_one.nonmembers
+ []
+
+When someone tries to send a message to the list and they are not a
+subscriber, they get added to the nonmember list.
+
+
+Users
+=====
+
+Users are people with one or more list memberships. To get a list of all users,
+access the clients user property.
+
+ >>> for user in client.users:
+ ... print(user)
+ <User "..." (...)>
+ <User "..." (...)>
+ <User "..." (...)>
+
+The list of users can also be paginated:
+
+ >>> page = client.get_user_page(count=4, page=1)
+ >>> page.nr
+ 1
+ >>> page.total_size
+ 5
+
+ >>> for user in page:
+ ... print(user)
+ <User "Unverified" (...)>
+ <User "Unconfirmed" (...)>
+ <User "Anna" (...)>
+ <User "Bill" (...)>
+
+You can get the next or previous pages without calling ``get_userpage`` again.
+
+ >>> page = page.next
+ >>> page.nr
+ 2
+
+ >>> for user in page:
+ ... print(user)
+ <User "Cris" (...)>
+
+ >>> page = page.previous
+ >>> page.nr
+ 1
+
+ >>> for user in page:
+ ... print(user)
+ <User "Unverified" (...)>
+ <User "Unconfirmed" (...)>
+ <User "Anna" (...)>
+ <User "Bill" (...)>
+
+A single user can be retrieved using their email address.
+
+ >>> cris = client.get_user('cris@example.com')
+ >>> print(cris.display_name)
+ Cris
+
+Every user has a list of one or more addresses.
+
+ >>> for address in cris.addresses:
+ ... print(address)
+ ... print(address.display_name)
+ ... print(address.registered_on)
+ cris@example.com
+ Cris
+ ...
+
+Multiple addresses can be assigned to a user record:
+
+ >>> cris.add_address('cris.person@example.org')
+ cris.person@example.org
+ >>> print(client.get_address('cris.person@example.org'))
+ cris.person@example.org
+
+ >>> for address in cris.addresses:
+ ... print(address)
+ cris.person@example.org
+ cris@example.com
+
+Trying to add an existing address will raise an error:
+
+ >>> client.create_user(email='dana@example.org',
+ ... password='somepass',
+ ... display_name='Dana')
+ <User "Dana" (...)>
+ >>> cris.add_address('dana@example.org') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ HTTPError: HTTP Error 400: Address already exists
+
+This can be overridden by using the ``absorb_existing`` flag:
+
+ >>> cris.add_address('dana@example.org', absorb_existing=True)
+ dana@example.org
+
+The user Chris will then be merged with Dana, acquiring all its subscriptions
+and preferences. In case of conflict, Chris' original preferences will prevail.
+
+ >>> for address in cris.addresses:
+ ... print(address)
+ cris.person@example.org
+ cris@example.com
+ dana@example.org
+
+
+Addresses
+=========
+
+Addresses can be accessed directly:
+
+ >>> address = client.get_address('dana@example.org')
+ >>> print(address)
+ dana@example.org
+ >>> print(address.display_name)
+ Dana
+
+The address has not been verified:
+
+ >>> print(address.verified)
+ False
+
+But that can be done via the address object:
+
+ >>> address.verify()
+ >>> print(address.verified)
+ True
+
+It can also be unverified:
+
+ >>> address.unverify()
+ >>> print(address.verified)
+ False
+
+Addresses can be deleted by calling their ``delete()`` method or by removing
+them from their user's ``addresses`` list:
+
+ >>> cris.addresses.remove('dana@example.org')
+ >>> for address in cris.addresses:
+ ... print(address)
+ cris.person@example.org
+ cris@example.com
+
+
+Users can be added using ``create_user``. The display_name is optional:
+ >>> client.create_user(email='ler@primus.org',
+ ... password='somepass',
+ ... display_name='Ler')
+ <User "Ler" (...)>
+ >>> ler = client.get_user('ler@primus.org')
+ >>> print(ler.password)
+ $...
+ >>> print(ler.display_name)
+ Ler
+
+User attributes can be changed through assignment, but you need to call the
+object's ``save`` method to store the changes in the mailman core database.
+
+ >>> ler.display_name = 'Sir Ler'
+ >>> ler.save()
+ >>> ler = client.get_user('ler@primus.org')
+ >>> print(ler.display_name)
+ Sir Ler
+
+Passwords can be changed as well:
+
+ >>> old_pwd = ler.password
+ >>> ler.password = 'easy'
+ >>> old_pwd == ler.password
+ True
+ >>> ler.save()
+ >>> old_pwd == ler.password
+ False
+
+
+User Subscriptions
+------------------
+
+A User's subscriptions can be access through their ``subscriptions`` property.
+
+ >>> bill = client.get_user('bill@example.com')
+ >>> for subscription in bill.subscriptions:
+ ... print(subscription)
+ <Member "bill@example.com" on "test-1.example.com">
+
+If all you need are the list ids of all mailing lists a user is subscribed to,
+you can use the ``subscription_list_ids`` property.
+
+ >>> for list_id in bill.subscription_list_ids:
+ ... print(list_id)
+ test-1.example.com
+
+
+List Settings
+=============
+
+We can get all list settings via a lists settings attribute. A proxy object
+for the settings is returned which behaves much like a dictionary.
+
+ >>> settings = test_one.settings
+ >>> len(settings)
+ 56
+
+ >>> for attr in sorted(settings):
+ ... print(attr + ': ' + str(settings[attr]))
+ acceptable_aliases: []
+ ...
+ volume: 1
+
+ >>> print(settings['display_name'])
+ Test-1
+
+We can access all valid list settings as attributes.
+
+ >>> print(settings['fqdn_listname'])
+ test-1@example.com
+ >>> print(settings['description'])
+ <BLANKLINE>
+ >>> settings['description'] = 'A very meaningful description.'
+ >>> settings['display_name'] = 'Test Numero Uno'
+
+ >>> settings.save()
+
+ >>> settings_new = test_one.settings
+ >>> print(settings_new['description'])
+ A very meaningful description.
+ >>> print(settings_new['display_name'])
+ Test Numero Uno
+
+The settings object also supports the `get` method of usual Python
+dictionaries:
+
+ >>> print(settings_new.get('OhNoIForgotTheKey',
+ ... 'HowGoodIPlacedOneUnderTheDoormat'))
+ HowGoodIPlacedOneUnderTheDoormat
+
+
+Preferences
+===========
+
+Preferences can be accessed and set for users, members and addresses.
+
+By default, preferences are not set and fall back to the global system
+preferences. They're read-only and can be accessed through the client object.
+
+ >>> global_prefs = client.preferences
+ >>> print(global_prefs['acknowledge_posts'])
+ False
+ >>> print(global_prefs['delivery_mode'])
+ regular
+ >>> print(global_prefs['delivery_status'])
+ enabled
+ >>> print(global_prefs['hide_address'])
+ True
+ >>> print(global_prefs['preferred_language'])
+ en
+ >>> print(global_prefs['receive_list_copy'])
+ True
+ >>> print(global_prefs['receive_own_postings'])
+ True
+
+Preferences can be set, but you have to call ``save`` to make your changes
+permanent.
+
+ >>> prefs = test_two.get_member('anna@example.com').preferences
+ >>> prefs['delivery_status'] = 'by_user'
+ >>> prefs.save()
+ >>> prefs = test_two.get_member('anna@example.com').preferences
+ >>> print(prefs['delivery_status'])
+ by_user
+
+
+Pipelines and Chains
+====================
+
+The available pipelines and chains can also be retrieved:
+
+ >>> pipelines = client.pipelines['pipelines']
+ >>> for pipeline in pipelines:
+ ... print(pipeline)
+ default-owner-pipeline
+ default-posting-pipeline
+ virgin
+ >>> chains = client.chains['chains']
+ >>> for chain in chains:
+ ... print(chain)
+ accept
+ default-owner-chain
+ default-posting-chain
+ discard
+ header-match
+ hold
+ moderation
+ reject
+
+
+Owners and Moderators
+=====================
+
+Owners and moderators are properties of the list object.
+
+ >>> test_one.owners
+ []
+ >>> test_one.moderators
+ []
+
+Owners can be added via the ``add_owner`` method:
+
+ >>> test_one.add_owner('foo@example.com')
+ >>> for owner in test_one.owners:
+ ... print(owner)
+ foo@example.com
+
+The owner of the list not automatically added as a member:
+
+ >>> test_one.members
+ [<Member "bill@example.com" on "test-1.example.com">]
+
+Moderators can be added similarly:
+
+ >>> test_one.add_moderator('bar@example.com')
+ >>> for moderator in test_one.moderators:
+ ... print(moderator)
+ bar@example.com
+
+Moderators are also not automatically added as members:
+
+ >>> test_one.members
+ [<Member "bill@example.com" on "test-1.example.com">]
+
+Members and owners/moderators are separate entries in in the general members
+list:
+
+ >>> test_one.subscribe('bar@example.com', 'Bar',
+ ... pre_verified=True,
+ ... pre_confirmed=True)
+ <Member "bar@example.com" on "test-1.example.com">
+
+ >>> for member in client.members:
+ ... print('%s: %s' %(member, member.role))
+ <Member "foo@example.com" on "test-1.example.com">: owner
+ <Member "bar@example.com" on "test-1.example.com">: moderator
+ <Member "bar@example.com" on "test-1.example.com">: member
+ <Member "bill@example.com" on "test-1.example.com">: member
+ <Member "anna@example.com" on "test-2.example.com">: member
+
+Both owners and moderators can be removed:
+
+ >>> test_one.remove_owner('foo@example.com')
+ >>> test_one.owners
+ []
+
+ test_one.remove_moderator('bar@example.com')
+ test_one.moderators
+ []
+
+
+Moderation
+==========
+
+
+Subscription Moderation
+-----------------------
+
+Subscription requests can be accessed through the list object's
+`request` property. So let's create a non-open list first.
+
+ >>> confirm_first = example_dot_com.create_list('confirm-first')
+ >>> settings = confirm_first.settings
+ >>> settings['subscription_policy'] = 'moderate'
+ >>> settings.save()
+
+ >>> confirm_first = client.get_list('confirm-first.example.com')
+ >>> print(confirm_first.settings['subscription_policy'])
+ moderate
+
+Initially there are no requests, so let's to subscribe someone to the
+list. We'll get a token back.
+
+ >>> confirm_first.requests
+ []
+ >>> data = confirm_first.subscribe('groucho@example.com',
+ ... pre_verified=True,
+ ... pre_confirmed=True)
+ >>> print(data['token_owner'])
+ moderator
+
+Now the request shows up in the list of requests:
+
+ >>> import time; time.sleep(5)
+ >>> len(confirm_first.requests)
+ 1
+
+ >>> request_1 = confirm_first.requests[0]
+ >>> print(request_1['email'])
+ groucho@example.com
+ >>> print (request_1['token'] is not None)
+ True
+ >>> print(request_1['token_owner'])
+ moderator
+ >>> print(request_1['request_date'] is not None)
+ True
+ >>> print(request_1['list_id'])
+ confirm-first.example.com
+
+Subscription requests can be accepted, deferred, rejected or
+discarded using the request token.
+
+ >>> data = confirm_first.subscribe('harpo@example.com',
+ ... pre_verified=True,
+ ... pre_confirmed=True)
+ >>> data = confirm_first.subscribe('zeppo@example.com',
+ ... pre_verified=True,
+ ... pre_confirmed=True)
+
+ >>> len(confirm_first.requests)
+ 3
+
+Let's accept Groucho:
+
+ >>> response = confirm_first.moderate_request(request_1['token'], 'accept')
+ >>> len(confirm_first.requests)
+ 2
+
+ >>> request_2 = confirm_first.requests[0]
+ >>> print(request_2['email'])
+ harpo@example.com
+
+ >>> request_3 = confirm_first.requests[1]
+ >>> print(request_3['email'])
+ zeppo@example.com
+
+Let's reject Harpo:
+
+ >>> response = confirm_first.moderate_request(request_2['token'], 'reject')
+ >>> len(confirm_first.requests)
+ 1
+
+Let's discard Zeppo's request:
+
+ >>> response = confirm_first.moderate_request(request_3['token'], 'discard')
+ >>> len(confirm_first.requests)
+ 0
+
+
+Message Moderation
+------------------
+
+By injecting a message by a non-member into the incoming queue, we can
+simulate a message being held for moderator approval.
+
+ >>> msg = """From: nomember@example.com
+ ... To: test-1@example.com
+ ... Subject: Something
+ ... Message-ID: <moderated_01>
+ ...
+ ... Some text.
+ ...
+ ... """
+ >>> inq = client.queues['in']
+ >>> inq.inject('test-1.example.com', msg)
+
+Now wait until the message has been processed.
+
+ >>> while True:
+ ... if len(inq.files) == 0:
+ ... break
+ ... time.sleep(0.1)
+
+It might take a few moments for the message to show up in the moderation
+queue.
+
+ >>> while True:
+ ... all_held = test_one.held
+ ... if len(all_held) > 0:
+ ... break
+ ... time.sleep(0.1)
+
+Messages held for moderation can be listed on a per list basis.
+
+ >>> print(all_held[0].request_id)
+ 1
+
+A held message can be retrieved by ID, and have attributes:
+
+ >>> heldmsg = test_one.get_held_message(1)
+ >>> print(heldmsg.subject)
+ Something
+ >>> print(heldmsg.reason)
+ The message is not from a list member
+ >>> print(heldmsg.sender)
+ nomember@example.com
+ >>> 'Message-ID: <moderated_01>' in heldmsg.msg
+ True
+
+A moderation action can be taken on them using the list methods or the held
+message's methods.
+
+ >>> print(test_one.defer_message(heldmsg.request_id)['status'])
+ 204
+
+ >>> len(test_one.held)
+ 1
+
+ >>> print(heldmsg.discard()['status'])
+ 204
+
+ >>> len(test_one.held)
+ 0
+
+Member moderation
+-----------------
+
+Each member or non-member can have a specific moderation action. It is set
+using the 'moderation_action' property:
+
+ >>> bill_member = test_one.get_member('bill@example.com')
+ >>> print(bill_member.moderation_action)
+ None
+ >>> bill_member.moderation_action = 'hold'
+ >>> bill_member.save()
+ >>> print(test_one.get_member('bill@example.com').moderation_action)
+ hold
+
+Banning addresses
+-----------------
+
+A ban list is a list of email addresses that are not allowed to subscribe to a
+mailing-list. There are two types of ban lists: each mailing-list has its ban
+list, and there is a site-wide list. Addresses on the site-wide list are
+prevented from subscribing to every mailing-list on the server.
+
+To view the site-wide ban list, use the `bans` property::
+
+ >>> list(client.bans)
+ []
+
+You can use the `add` method on the ban list to ban an email address::
+
+ >>> banned_anna = client.bans.add('anna@example.com')
+ >>> print(banned_anna)
+ anna@example.com
+ >>> 'anna@example.com' in client.bans
+ True
+ >>> client.bans.add('bill@example.com')
+ bill@example.com
+ >>> print(list(client.bans))
+ [anna@example.com, bill@example.com]
+
+The list of banned addresses can be paginated using the ``get_bans_page()``
+method::
+
+ >>> print(list(client.get_bans_page(count=1, page=1)))
+ [anna@example.com]
+ >>> print(list(client.get_bans_page(count=1, page=2)))
+ [bill@example.com]
+
+You can use the ``delete()`` method on a banned address to unban it, or the
+``remove()`` method on the ban list::
+
+ >>> banned_anna.delete()
+ >>> 'anna@example.com' in client.bans
+ False
+ >>> print(list(client.bans))
+ [bill@example.com]
+ >>> client.bans.remove('bill@example.com')
+ >>> 'bill@example.com' in client.bans
+ False
+ >>> print(list(client.bans))
+ []
+
+
+The mailing-list-specific ban lists work in the same way::
+
+ >>> print(list(test_one.bans))
+ []
+ >>> banned_anna = test_one.bans.add('anna@example.com')
+ >>> 'anna@example.com' in test_one.bans
+ True
+ >>> test_one.bans.add('bill@example.com')
+ bill@example.com
+ >>> print(list(test_one.bans))
+ [anna@example.com, bill@example.com]
+ >>> print(list(test_one.get_bans_page(count=1, page=1)))
+ [anna@example.com]
+ >>> print(list(test_one.get_bans_page(count=1, page=2)))
+ [bill@example.com]
+ >>> banned_anna.delete()
+ >>> 'anna@example.com' in test_one.bans
+ False
+ >>> test_one.bans.remove('bill@example.com')
+ >>> print(list(test_one.bans))
+ []
+
+
+Archivers
+=========
+
+
+Each list object has an ``archivers`` attribute.
+
+ >>> archivers = test_one.archivers
+ >>> print(archivers)
+ <Archivers on "test-1.example.com">
+
+The activation status of each available archiver can be accessed like a
+key in a dictionary.
+
+ >>> archivers = test_one.archivers
+ >>> for archiver in sorted(archivers.keys()):
+ ... print('{0}: {1}'.format(archiver, archivers[archiver]))
+ mail-archive: True
+ mhonarc: True
+ prototype: True
+
+ >>> archivers['mail-archive']
+ True
+ >>> archivers['mhonarc']
+ True
+
+They can also be set like items in dictionary.
+
+ >>> archivers['mail-archive'] = False
+ >>> archivers['mhonarc'] = False
+
+So if we get a new ``archivers`` object from the API (by accessing the
+list's archiver attribute again), we can see that the archiver stati
+have now been set.
+
+ >>> archivers = test_one.archivers
+ >>> archivers['mail-archive']
+ False
+ >>> archivers['mhonarc']
+ False
+
+
+Header matches
+==============
+
+Header matches are filtering rules that apply to messages sent to a mailing
+list. They match a header to a pattern using a regular expression, and matching
+patterns can trigger specific moderation actions. They are accessible via the
+mailing list's ``header_matches`` attribute, which behaves like a list.
+
+ >>> header_matches = test_one.header_matches
+ >>> print(header_matches)
+ <HeaderMatches for "test-1.example.com">
+ >>> len(header_matches)
+ 0
+
+Header matches can be added using the ``add()`` method. The arguments are:
+
+- the header to consider (``str``). Il will be lower-cased.
+- the regular expression to use for filtering (``str``)
+- the action to take when the header matches the pattern. This can be
+ ``'accept'``, ``'discard'``, ``'reject'``, or ``'hold'``.
+
+ >>> header_matches.add('Subject', '^test: ', 'discard')
+ <HeaderMatch on "subject">
+ >>> print(header_matches)
+ <HeaderMatches for "test-1.example.com">
+ >>> len(header_matches)
+ 1
+ >>> print(list(header_matches))
+ [<HeaderMatch on "subject">]
+
+You can delete a header match by deleting it from the ``header_matches``
+collection.
+
+ >>> del header_matches[0]
+ >>> len(header_matches)
+ 0
+
+You can also delete a header match using its ``delete()`` method, but be aware
+that the collection will not automatically be updated. Get a new collection
+from the list's ``header_matches`` attribute to see the change.
+
+ >>> header_matches.add('Subject', '^test: ', 'discard')
+ <HeaderMatch on "subject">
+ >>> header_matches[0].delete()
+ >>> len(header_matches) # not automatically updated
+ 1
+ >>> len(test_one.header_matches)
+ 0
+
+
+Configuration
+=============
+
+Mailman Core exposes all its configuration through REST API. All these
+configuration options are read-only.
+
+ >>> cfg = client.configuration
+ >>> for key in sorted(cfg):
+ ... print(cfg[key])
+ <Configuration: "antispam">
+ <Configuration: "archiver.mail_archive">
+ <Configuration: "archiver.master">
+ <Configuration: "archiver.mhonarc">
+ <Configuration: "archiver.prototype">
+ <Configuration: "bounces">
+ <Configuration: "database">
+ <Configuration: "devmode">
+ <Configuration: "digests">
+ <Configuration: "dmarc">
+ <Configuration: "language.ar">
+ <Configuration: "language.ast">
+ <Configuration: "language.ca">
+ <Configuration: "language.cs">
+ <Configuration: "language.da">
+ <Configuration: "language.de">
+ <Configuration: "language.el">
+ <Configuration: "language.en">
+ <Configuration: "language.es">
+ <Configuration: "language.et">
+ <Configuration: "language.eu">
+ <Configuration: "language.fi">
+ <Configuration: "language.fr">
+ <Configuration: "language.gl">
+ <Configuration: "language.he">
+ <Configuration: "language.hr">
+ <Configuration: "language.hu">
+ <Configuration: "language.ia">
+ <Configuration: "language.it">
+ <Configuration: "language.ja">
+ <Configuration: "language.ko">
+ <Configuration: "language.lt">
+ <Configuration: "language.nl">
+ <Configuration: "language.no">
+ <Configuration: "language.pl">
+ <Configuration: "language.pt">
+ <Configuration: "language.pt_BR">
+ <Configuration: "language.ro">
+ <Configuration: "language.ru">
+ <Configuration: "language.sk">
+ <Configuration: "language.sl">
+ <Configuration: "language.sr">
+ <Configuration: "language.sv">
+ <Configuration: "language.tr">
+ <Configuration: "language.uk">
+ <Configuration: "language.vi">
+ <Configuration: "language.zh_CN">
+ <Configuration: "language.zh_TW">
+ <Configuration: "logging.archiver">
+ <Configuration: "logging.bounce">
+ <Configuration: "logging.config">
+ <Configuration: "logging.database">
+ <Configuration: "logging.debug">
+ <Configuration: "logging.error">
+ <Configuration: "logging.fromusenet">
+ <Configuration: "logging.http">
+ <Configuration: "logging.locks">
+ <Configuration: "logging.mischief">
+ <Configuration: "logging.root">
+ <Configuration: "logging.runner">
+ <Configuration: "logging.smtp">
+ <Configuration: "logging.subscribe">
+ <Configuration: "logging.vette">
+ <Configuration: "mailman">
+ <Configuration: "mta">
+ <Configuration: "nntp">
+ <Configuration: "passwords">
+ <Configuration: "paths.dev">
+ <Configuration: "paths.fhs">
+ <Configuration: "paths.here">
+ <Configuration: "paths.local">
+ <Configuration: "runner.archive">
+ <Configuration: "runner.bad">
+ <Configuration: "runner.bounces">
+ <Configuration: "runner.command">
+ <Configuration: "runner.digest">
+ <Configuration: "runner.in">
+ <Configuration: "runner.lmtp">
+ <Configuration: "runner.nntp">
+ <Configuration: "runner.out">
+ <Configuration: "runner.pipeline">
+ <Configuration: "runner.rest">
+ <Configuration: "runner.retry">
+ <Configuration: "runner.shunt">
+ <Configuration: "runner.virgin">
+ <Configuration: "shell">
+ <Configuration: "styles">
+ <Configuration: "webservice">
+
+
+Each configuration object is a dictionary and you can iterate over them:
+
+ >>> for key in sorted(cfg['mailman']):
+ ... print('{} : {}'.format(key, cfg['mailman'][key]))
+ cache_life : 7d
+ default_language : en
+ email_commands_max_lines : 10
+ filtered_messages_are_preservable : no
+ html_to_plain_text_command : /usr/bin/lynx -dump $filename
+ layout : here
+ listname_chars : [-_.0-9a-z]
+ noreply_address : noreply
+ pending_request_life : 3d
+ post_hook :
+ pre_hook :
+ self_link : http://localhost:9001/3.1/system/configuration/mailman
+ sender_headers : from from_ reply-to sender
+ site_owner : changeme@example.com
+
+.. >>> for domain in client.domains:
+ ... domain.delete()
+ >>> for user in client.users:
+ ... user.delete()
diff --git a/src/mailmanclient/restbase/__init__.py b/src/mailmanclient/restbase/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/mailmanclient/restbase/__init__.py
diff --git a/src/mailmanclient/restbase/base.py b/src/mailmanclient/restbase/base.py
new file mode 100644
index 0000000..89f55bb
--- /dev/null
+++ b/src/mailmanclient/restbase/base.py
@@ -0,0 +1,226 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+
+import six
+
+from collections import MutableMapping, Sequence
+
+__metaclass__ = type
+__all__ = [
+ 'RESTBase',
+ 'RESTDict',
+ 'RESTList',
+ 'RESTObject'
+]
+
+
+class RESTBase:
+ """
+ Base class for data coming from the REST API.
+
+ Subclasses can (and sometimes must) define some attributes to handle a
+ particular entity.
+
+ :cvar _properties: the list of expected entity properties. This is required
+ for API elements that behave like an object, with REST data accessed
+ through attributes. If this value is None, the REST data is used to
+ list available properties.
+ :cvar _writable_properties: list of properties that can be written to using
+ a `PATCH` request. If this value is `None`, all properties are
+ writable.
+ :cvar _read_only_properties: list of properties that cannot be written to
+ (defaults to `self_link` only).
+ :cvar _autosave: automatically send a `PATCH` request to the API when a
+ value is changed. Otherwise, the `save()` method must be called.
+ """
+
+ _properties = None
+ _writable_properties = None
+ _read_only_properties = ['self_link']
+ _autosave = False
+
+ def __init__(self, connection, url, data=None):
+ """
+ :param connection: An API connection object.
+ :type connection: Connection.
+ :param url: The url of the API endpoint.
+ :type url: str.
+ :param data: The initial data to use.
+ :type data: dict.
+ """
+ self._connection = connection
+ self._url = url
+ self._rest_data = data
+ self._changed_rest_data = {}
+
+ def __repr__(self):
+ return '<{0} at {1}>'.format(self.__class__.__name__, self._url)
+
+ @property
+ def rest_data(self):
+ """Get data from API and cache it (only once per instance)."""
+ if self._rest_data is None:
+ response, content = self._connection.call(self._url)
+ if isinstance(content, dict) and 'http_etag' in content:
+ del content['http_etag'] # We don't care about etags.
+ self._rest_data = content
+ return self._rest_data
+
+ def _get(self, key):
+ if self._properties is not None:
+ # Some REST key/values may not be returned by Mailman if the value
+ # is None.
+ if key in self._properties:
+ return self.rest_data.get(key)
+ raise KeyError(key)
+ else:
+ return self.rest_data[key]
+
+ def _set(self, key, value):
+ if (key in self._read_only_properties or (
+ self._writable_properties is not None
+ and key not in self._writable_properties)):
+ raise ValueError('value is read-only')
+ # Don't check that the key is in _properties, the accepted values for
+ # write may be different from the returned values (eg: User.password
+ # and User.cleartext_password).
+ if key in self.rest_data and self.rest_data[key] == value:
+ return # Nothing to do
+ self._changed_rest_data[key] = value
+ if self._autosave:
+ self.save()
+
+ def _reset_cache(self):
+ self._changed_rest_data = {}
+ self._rest_data = None
+
+ def save(self):
+ response, content = self._connection.call(
+ self._url, self._changed_rest_data, method='PATCH')
+ self._reset_cache()
+
+
+class RESTObject(RESTBase):
+ """Base class for REST data that behaves like an object with attributes."""
+
+ def __getattr__(self, name):
+ try:
+ return self._get(name)
+ except KeyError:
+ # Transform the KeyError into the more appropriate AttributeError
+ raise AttributeError(
+ "'{0}' object has no attribute '{1}'".format(
+ self.__class__.__name__, name))
+
+ def __setattr__(self, name, value):
+ # RESTObject must list REST-specific properties or we won't be able to
+ # store the _connection, _url, etc.
+ assert self._properties is not None
+ if name not in self._properties:
+ return super(RESTObject, self).__setattr__(name, value)
+ return self._set(name, value)
+
+ def delete(self):
+ self._connection.call(self._url, method='DELETE')
+ self._reset_cache()
+
+
+class RESTDict(RESTBase, MutableMapping):
+ """Base class for REST data that behaves like a dictionary."""
+
+ def __repr__(self):
+ return repr(self.rest_data)
+
+ def __unicode__(self):
+ return six.text_type(self.rest_data)
+
+ def __getitem__(self, key):
+ return self._get(key)
+
+ def __setitem__(self, key, value):
+ self._set(key, value)
+
+ def __delitem__(self, key):
+ raise NotImplementedError("REST dictionnary keys can't be deleted.")
+
+ def __iter__(self):
+ for key in self.rest_data:
+ if self._properties is not None and key not in self._properties:
+ continue
+ yield key
+
+ def __len__(self):
+ return len(self.rest_data)
+
+ def get(self, key, default=None):
+ return self.rest_data.get(key, default)
+
+ def keys(self):
+ return list(self)
+
+ def update(self, other):
+ # Optimize the update to call save() only once
+ _old_autosave = self._autosave
+ self._autosave = False
+ super(RESTDict, self).update(other)
+ self._autosave = _old_autosave
+ if self._autosave:
+ self.save()
+
+
+class RESTList(RESTBase, Sequence):
+ """
+ Base class for REST data that behaves like a list.
+
+ The `_factory` attribute is a callable that will be applied on each
+ returned member of the list.
+ """
+
+ _factory = lambda x: x # flake8: noqa
+
+ @property
+ def rest_data(self):
+ if self._rest_data is None:
+ response, content = self._connection.call(self._url)
+ if 'entries' not in content:
+ self._rest_data = []
+ else:
+ self._rest_data = content['entries']
+ return self._rest_data
+
+ def __repr__(self):
+ return repr(self.rest_data)
+
+ def __unicode__(self):
+ return six.text_type(self.rest_data)
+
+ def __getitem__(self, key):
+ return self._factory(self.rest_data[key])
+
+ def __delitem__(self, key):
+ self[key].delete()
+ self._reset_cache()
+
+ def __len__(self):
+ return len(self.rest_data)
+
+ def __iter__(self):
+ for entry in self.rest_data:
+ yield self._factory(entry)
+
+ def clear(self):
+ self._connection.call(self._url, method='DELETE')
+ self._reset_cache() \ No newline at end of file
diff --git a/src/mailmanclient/restbase/connection.py b/src/mailmanclient/restbase/connection.py
new file mode 100644
index 0000000..8e1adfe
--- /dev/null
+++ b/src/mailmanclient/restbase/connection.py
@@ -0,0 +1,113 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+import json
+from base64 import b64encode
+from six.moves.urllib_error import HTTPError
+from six.moves.urllib_parse import urljoin, urlencode
+
+import six
+from httplib2 import Http
+
+from mailmanclient.constants import __version__
+
+__metaclass__ = type
+__all__ = [
+ 'MailmanConnectionError',
+ 'Connection'
+]
+
+
+class MailmanConnectionError(Exception):
+ """Custom Exception to catch connection errors."""
+
+
+class Connection:
+ """A connection to the REST client."""
+
+ def __init__(self, baseurl, name=None, password=None):
+ """Initialize a connection to the REST API.
+
+ :param baseurl: The base url to access the Mailman 3 REST API.
+ :param name: The Basic Auth user name. If given, the `password` must
+ also be given.
+ :param password: The Basic Auth password. If given the `name` must
+ also be given.
+ """
+ if baseurl[-1] != '/':
+ baseurl += '/'
+ self.baseurl = baseurl
+ self.name = name
+ self.password = password
+ if name is not None and password is None:
+ raise TypeError('`password` is required when `name` is given')
+ if name is None and password is not None:
+ raise TypeError('`name` is required when `password` is given')
+ if name is None:
+ self.basic_auth = None
+ else:
+ auth = '{0}:{1}'.format(name, password)
+ self.basic_auth = b64encode(auth.encode('utf-8')).decode('utf-8')
+
+ def call(self, path, data=None, method=None):
+ """Make a call to the Mailman REST API.
+
+ :param path: The url path to the resource.
+ :type path: str
+ :param data: Data to send, implies POST (default) or PUT.
+ :type data: dict
+ :param method: The HTTP method to call. Defaults to GET when `data`
+ is None or POST if `data` is given.
+ :type method: str
+ :return: The response content, which will be None, a dictionary, or a
+ list depending on the actual JSON type returned.
+ :rtype: None, list, dict
+ :raises HTTPError: when a non-2xx status code is returned.
+ """
+ headers = {
+ 'User-Agent': 'GNU Mailman REST client v{0}'.format(__version__),
+ }
+ data_str = None
+ if data is not None:
+ for k, v in data.items():
+ if not isinstance(v, bytes):
+ data[k] = six.text_type(v).encode('utf-8')
+ data_str = urlencode(data, doseq=True)
+ headers['Content-Type'] = 'application/x-www-form-urlencoded'
+ if method is None:
+ if data_str is None:
+ method = 'GET'
+ else:
+ method = 'POST'
+ method = method.upper()
+ if self.basic_auth:
+ headers['Authorization'] = 'Basic ' + self.basic_auth
+ url = urljoin(self.baseurl, path)
+ try:
+ response, content = Http().request(url, method, data_str, headers)
+ # If we did not get a 2xx status code, make this look like a
+ # urllib2 exception, for backward compatibility.
+ if response.status // 100 != 2:
+ raise HTTPError(url, response.status, content, response, None)
+ if len(content) == 0:
+ return response, None
+ # XXX Work around for http://bugs.python.org/issue10038
+ if isinstance(content, six.binary_type):
+ content = content.decode('utf-8')
+ return response, json.loads(content)
+ except HTTPError:
+ raise
+ except IOError:
+ raise MailmanConnectionError('Could not connect to Mailman API')
diff --git a/src/mailmanclient/restbase/page.py b/src/mailmanclient/restbase/page.py
new file mode 100644
index 0000000..bad2af7
--- /dev/null
+++ b/src/mailmanclient/restbase/page.py
@@ -0,0 +1,92 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+from six.moves.urllib_parse import urlencode, urlsplit, parse_qs, urlunsplit
+
+from mailmanclient.constants import DEFAULT_PAGE_ITEM_COUNT
+
+__metaclass__ = type
+__all__ = [
+ 'Page'
+]
+
+
+class Page:
+
+ def __init__(self, connection, path, model, count=DEFAULT_PAGE_ITEM_COUNT,
+ page=1):
+ self._connection = connection
+ self._path = path
+ self._count = count
+ self._page = page
+ self._model = model
+ self._entries = []
+ self.total_size = 0
+ self._create_page()
+
+ def __getitem__(self, key):
+ return self._entries[key]
+
+ def __iter__(self):
+ for entry in self._entries:
+ yield entry
+
+ def __repr__(self):
+ return '<Page {0} ({1})'.format(self._page, self._model)
+
+ def __len__(self):
+ return len(self._entries)
+
+ def _build_url(self):
+ url = list(urlsplit(self._path))
+ qs = parse_qs(url[3])
+ qs["count"] = self._count
+ qs["page"] = self._page
+ url[3] = urlencode(qs, doseq=True)
+ return urlunsplit(url)
+
+ def _create_page(self):
+ self._entries = []
+ response, content = self._connection.call(self._build_url())
+ self.total_size = content["total_size"]
+ for entry in content.get('entries', []):
+ instance = self._model(
+ self._connection, entry['self_link'], entry)
+ self._entries.append(instance)
+
+ @property
+ def nr(self):
+ return self._page
+
+ @property
+ def next(self):
+ return self.__class__(
+ self._connection, self._path, self._model, self._count,
+ self._page + 1)
+
+ @property
+ def previous(self):
+ if self.has_previous:
+ return self.__class__(
+ self._connection, self._path, self._model, self._count,
+ self._page - 1)
+
+ @property
+ def has_previous(self):
+ return self._page > 1
+
+ @property
+ def has_next(self):
+ return self._count * self._page < self.total_size
diff --git a/src/mailmanclient/restobjects/__init__.py b/src/mailmanclient/restobjects/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/mailmanclient/restobjects/__init__.py
diff --git a/src/mailmanclient/restobjects/address.py b/src/mailmanclient/restobjects/address.py
new file mode 100644
index 0000000..cb23439
--- /dev/null
+++ b/src/mailmanclient/restobjects/address.py
@@ -0,0 +1,76 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+from mailmanclient.restobjects.preferences import PreferencesMixin
+from mailmanclient.restbase.base import RESTList, RESTObject
+
+__metaclass__ = type
+__all__ = [
+ 'Address',
+ 'Addresses'
+]
+
+
+class Addresses(RESTList):
+
+ def __init__(self, connection, url, data=None):
+ super(Addresses, self).__init__(connection, url, data)
+ self._factory = lambda data: Address(
+ self._connection, data['self_link'], data)
+
+ def find_by_email(self, email):
+ for address in self:
+ if address.email == email:
+ return address
+ return None
+
+ def remove(self, email):
+ address = self.find_by_email(email)
+ if address is not None:
+ address.delete()
+ self._reset_cache()
+ else:
+ raise ValueError('The address {} does not exist'.format(email))
+
+
+class Address(RESTObject, PreferencesMixin):
+
+ _properties = ('display_name', 'email', 'original_email', 'registered_on',
+ 'self_link', 'verified_on')
+
+ def __repr__(self):
+ return self.email
+
+ @property
+ def user(self):
+ from mailmanclient.restobjects.user import User
+ if 'user' in self.rest_data:
+ return User(self._connection, self.rest_data['user'])
+ else:
+ return None
+
+ @property
+ def verified(self):
+ return self.verified_on is not None
+
+ def verify(self):
+ self._connection.call(
+ 'addresses/{0}/verify'.format(self.email), method='POST')
+ self._reset_cache()
+
+ def unverify(self):
+ self._connection.call(
+ 'addresses/{0}/unverify'.format(self.email), method='POST')
+ self._reset_cache()
diff --git a/src/mailmanclient/restobjects/archivers.py b/src/mailmanclient/restobjects/archivers.py
new file mode 100644
index 0000000..c9dcc57
--- /dev/null
+++ b/src/mailmanclient/restobjects/archivers.py
@@ -0,0 +1,45 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+from mailmanclient.restbase.base import RESTDict
+
+__metaclass__ = type
+__all__ = [
+ 'ListArchivers'
+]
+
+
+class ListArchivers(RESTDict):
+ """
+ Represents the activation status for each site-wide available archiver
+ for a given list.
+ """
+
+ _autosave = True
+
+ def __init__(self, connection, url, mlist):
+ """
+ :param connection: An API connection object.
+ :type connection: Connection.
+ :param url: The API url of the list's archiver endpoint.
+ :type url: str.
+ :param mlist: The corresponding list object.
+ :type mlist: MailingList.
+ """
+ super(ListArchivers, self).__init__(connection, url)
+ self._mlist = mlist
+
+ def __repr__(self):
+ return '<Archivers on "{0}">'.format(self._mlist.list_id)
diff --git a/src/mailmanclient/restobjects/ban.py b/src/mailmanclient/restobjects/ban.py
new file mode 100644
index 0000000..3f1753b
--- /dev/null
+++ b/src/mailmanclient/restobjects/ban.py
@@ -0,0 +1,100 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+from six.moves.urllib_error import HTTPError
+
+from mailmanclient.restobjects.mailinglist import MailingList
+from mailmanclient.restbase.base import RESTList, RESTObject
+
+__metaclass__ = type
+__all__ = [
+ 'Bans',
+ 'BannedAddress'
+]
+
+
+class Bans(RESTList):
+ """
+ The list of banned addresses from a mailing-list or from the whole site.
+ """
+
+ def __init__(self, connection, url, data=None, mlist=None):
+ """
+ :param mlist: The corresponding list object, or None if it is a global
+ ban list.
+ :type mlist: MailingList or None.
+ """
+ super(Bans, self).__init__(connection, url, data)
+ self._mlist = mlist
+ self._factory = lambda data: BannedAddress(
+ self._connection, data['self_link'], data)
+
+ def __repr__(self):
+ if self._mlist is None:
+ return '<Global bans>'
+ else:
+ return '<Bans on "{0}">'.format(self._mlist.list_id)
+
+ def __contains__(self, item):
+ # Accept email addresses and BannedAddress restobjects
+ if isinstance(item, BannedAddress):
+ item = item.email
+ if self._rest_data is not None:
+ return item in [data['email'] for data in self._rest_data]
+ else:
+ # Avoid getting the whole list just to check membership
+ try:
+ response, content = self._connection.call(
+ '{}/{}'.format(self._url, item))
+ except HTTPError as e:
+ if e.code == 404:
+ return False
+ else:
+ raise
+ else:
+ return True
+
+ def add(self, email):
+ response, content = self._connection.call(self._url, dict(email=email))
+ self._reset_cache()
+ return BannedAddress(self._connection, response['location'])
+
+ def find_by_email(self, email):
+ for ban in self:
+ if ban.email == email:
+ return ban
+ return None
+
+ def remove(self, email):
+ ban = self.find_by_email(email)
+ if ban is not None:
+ ban.delete()
+ self._reset_cache()
+ else:
+ raise ValueError('The address {} is not banned'.format(email))
+
+
+class BannedAddress(RESTObject):
+
+ _properties = ('email', 'list_id', 'self_link')
+ _writable_properties = []
+
+ def __repr__(self):
+ return self.email
+
+ @property
+ def mailinglist(self):
+ return MailingList(
+ self._connection, 'lists/{0}'.format(self.list_id))
diff --git a/src/mailmanclient/restobjects/configuration.py b/src/mailmanclient/restobjects/configuration.py
new file mode 100644
index 0000000..252e9e9
--- /dev/null
+++ b/src/mailmanclient/restobjects/configuration.py
@@ -0,0 +1,34 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+from mailmanclient.restbase.base import RESTDict
+
+__metaclass__ = type
+__all__ = [
+ 'Configuration'
+]
+
+
+class Configuration(RESTDict):
+
+ _writable_properties = ()
+
+ def __init__(self, connection, name):
+ super(Configuration, self).__init__(
+ connection, 'system/configuration/{}'.format(name))
+ self.name = name
+
+ def __repr__(self):
+ return '<Configuration: "{}">'.format(self.name)
diff --git a/src/mailmanclient/restobjects/domain.py b/src/mailmanclient/restobjects/domain.py
new file mode 100644
index 0000000..dc9c176
--- /dev/null
+++ b/src/mailmanclient/restobjects/domain.py
@@ -0,0 +1,99 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+import warnings
+
+from mailmanclient.restobjects.mailinglist import MailingList
+from mailmanclient.restbase.base import RESTObject
+from mailmanclient.restbase.page import Page
+
+__metaclass__ = type
+__all__ = [
+ 'Domain'
+]
+
+
+class Domain(RESTObject):
+
+ _properties = ('description', 'mail_host', 'self_link')
+
+ def __repr__(self):
+ return '<Domain "{0}">'.format(self.mail_host)
+
+ @property
+ def web_host(self):
+ warnings.warn(
+ 'The `Domain.web_host` attribute is deprecated. It is not used '
+ 'any more and will be removed in the future.',
+ DeprecationWarning, stacklevel=2)
+ return 'http://{}'.format(self.mail_host)
+
+ @property
+ def base_url(self):
+ warnings.warn(
+ 'The `Domain.base_url` attribute is deprecated. It is not used '
+ 'any more and will be removed in the future.',
+ DeprecationWarning, stacklevel=2)
+ return 'http://{}'.format(self.mail_host)
+
+ @property
+ def owners(self):
+ url = self._url + '/owners'
+ response, content = self._connection.call(url)
+ if 'entries' not in content:
+ return []
+ else:
+ return [item for item in content['entries']]
+
+ @property
+ def lists(self):
+ return self.get_lists()
+
+ def get_lists(self, advertised=None):
+ url = 'domains/{0}/lists'.format(self.mail_host)
+ if advertised:
+ url += '?advertised=true'
+ response, content = self._connection.call(url)
+ if 'entries' not in content:
+ return []
+ return [MailingList(self._connection, entry['self_link'], entry)
+ for entry in content['entries']]
+
+ def get_list_page(self, count=50, page=1, advertised=None):
+ url = 'domains/{0}/lists'.format(self.mail_host)
+ if advertised:
+ url += '?advertised=true'
+ return Page(self._connection, url, MailingList, count, page)
+
+ def create_list(self, list_name):
+ fqdn_listname = '{0}@{1}'.format(list_name, self.mail_host)
+ response, content = self._connection.call(
+ 'lists', dict(fqdn_listname=fqdn_listname))
+ return MailingList(self._connection, response['location'])
+
+ # def remove_owner(self, owner):
+ # TODO: add this when API supports it.
+ # pass
+
+ def remove_all_owners(self):
+ url = self._url + '/owners'
+ response, content = self._connection.call(
+ url, method='DELETE')
+ return response
+
+ def add_owner(self, owner):
+ url = self._url + '/owners'
+ response, content = self._connection.call(
+ url, {'owner': owner})
diff --git a/src/mailmanclient/restobjects/header_match.py b/src/mailmanclient/restobjects/header_match.py
new file mode 100644
index 0000000..97684f0
--- /dev/null
+++ b/src/mailmanclient/restobjects/header_match.py
@@ -0,0 +1,67 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+from mailmanclient.restbase.base import RESTList, RESTObject
+
+__metaclass__ = type
+__all__ = [
+ 'HeaderMatch',
+ 'HeaderMatches'
+]
+
+
+class HeaderMatches(RESTList):
+ """
+ The list of header matches for a mailing-list.
+ """
+
+ def __init__(self, connection, url, mlist):
+ """
+ :param mlist: The corresponding list object.
+ :type mlist: MailingList.
+ """
+ super(HeaderMatches, self).__init__(connection, url)
+ self._mlist = mlist
+ self._factory = lambda data: HeaderMatch(
+ self._connection, data['self_link'], data)
+
+ def __repr__(self):
+ return '<HeaderMatches for "{0}">'.format(self._mlist.list_id)
+
+ def add(self, header, pattern, action=None):
+ """
+ :param header: The header to consider.
+ :type header: str
+ :param pattern: The regular expression to use for filtering.
+ :type pattern: str
+ :param action: The action to take when the header matches the pattern.
+ This can be 'accept', 'discard', 'reject', or 'hold'.
+ :type action: str
+ """
+ data = dict(header=header, pattern=pattern)
+ if action is not None:
+ data['action'] = action
+ response, content = self._connection.call(self._url, data)
+ self._reset_cache()
+ return HeaderMatch(self._connection, response['location'])
+
+
+class HeaderMatch(RESTObject):
+
+ _properties = ('header', 'pattern', 'position', 'action', 'self_link')
+ _writable_properties = ('header', 'pattern', 'position', 'action')
+
+ def __repr__(self):
+ return '<HeaderMatch on "{0}">'.format(self.header)
diff --git a/src/mailmanclient/restobjects/held_message.py b/src/mailmanclient/restobjects/held_message.py
new file mode 100644
index 0000000..a2affb7
--- /dev/null
+++ b/src/mailmanclient/restobjects/held_message.py
@@ -0,0 +1,62 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+import six
+
+from mailmanclient.restbase.base import RESTObject
+
+__metaclass__ = type
+__all__ = [
+ 'HeldMessage'
+]
+
+
+class HeldMessage(RESTObject):
+
+ _properties = ('hold_date', 'message_id', 'msg', 'reason', 'request_id',
+ 'self_link', 'sender', 'subject', 'type')
+
+ def __repr__(self):
+ return '<HeldMessage "{0}" by {1}>'.format(
+ self.request_id, self.sender)
+
+ def __unicode__(self):
+ return six.text_type(self.rest_data)
+
+ def moderate(self, action):
+ """Moderate a held message.
+
+ :param action: Action to perform on held message.
+ :type action: String.
+ """
+ response, content = self._connection.call(
+ self._url, dict(action=action), 'POST')
+ return response
+
+ def discard(self):
+ """Shortcut for moderate."""
+ return self.moderate('discard')
+
+ def reject(self):
+ """Shortcut for moderate."""
+ return self.moderate('reject')
+
+ def defer(self):
+ """Shortcut for moderate."""
+ return self.moderate('defer')
+
+ def accept(self):
+ """Shortcut for moderate."""
+ return self.moderate('accept')
diff --git a/src/mailmanclient/restobjects/mailinglist.py b/src/mailmanclient/restobjects/mailinglist.py
new file mode 100644
index 0000000..032bcbe
--- /dev/null
+++ b/src/mailmanclient/restobjects/mailinglist.py
@@ -0,0 +1,333 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+import warnings
+from operator import itemgetter
+from six.moves.urllib_error import HTTPError
+from six.moves.urllib_parse import urlencode
+
+from mailmanclient.restobjects.header_match import HeaderMatches
+from mailmanclient.restobjects.archivers import ListArchivers
+from mailmanclient.restobjects.member import Member
+from mailmanclient.restobjects.settings import Settings
+from mailmanclient.restobjects.held_message import HeldMessage
+from mailmanclient.restbase.base import RESTObject
+from mailmanclient.restbase.page import Page
+
+__metaclass__ = type
+__all__ = [
+ 'MailingList'
+]
+
+
+class MailingList(RESTObject):
+
+ _properties = ('display_name', 'fqdn_listname', 'list_id', 'list_name',
+ 'mail_host', 'member_count', 'volume', 'self_link')
+
+ def __init__(self, connection, url, data=None):
+ super(MailingList, self).__init__(connection, url, data)
+ self._settings = None
+
+ def __repr__(self):
+ return '<List "{0}">'.format(self.fqdn_listname)
+
+ @property
+ def owners(self):
+ url = self._url + '/roster/owner'
+ response, content = self._connection.call(url)
+ if 'entries' not in content:
+ return []
+ else:
+ return [item['email'] for item in content['entries']]
+
+ @property
+ def moderators(self):
+ url = self._url + '/roster/moderator'
+ response, content = self._connection.call(url)
+ if 'entries' not in content:
+ return []
+ else:
+ return [item['email'] for item in content['entries']]
+
+ @property
+ def members(self):
+ url = 'lists/{0}/roster/member'.format(self.fqdn_listname)
+ response, content = self._connection.call(url)
+ if 'entries' not in content:
+ return []
+ return [Member(self._connection, entry['self_link'], entry)
+ for entry in sorted(content['entries'],
+ key=itemgetter('address'))]
+
+ @property
+ def nonmembers(self):
+ url = 'members/find'
+ data = {'role': 'nonmember',
+ 'list_id': self.list_id}
+ response, content = self._connection.call(url, data)
+ if 'entries' not in content:
+ return []
+ return [Member(self._connection, entry['self_link'], entry)
+ for entry in sorted(content['entries'],
+ key=itemgetter('address'))]
+
+ def get_member_page(self, count=50, page=1):
+ url = 'lists/{0}/roster/member'.format(self.fqdn_listname)
+ return Page(self._connection, url, Member, count, page)
+
+ def find_members(self, address, role='member', page=None, count=50):
+ data = {
+ 'subscriber': address,
+ 'role': role,
+ 'list_id': self.list_id,
+ }
+ url = 'members/find?{}'.format(urlencode(data, doseq=True))
+ if page is None:
+ response, content = self._connection.call(url, data)
+ if 'entries' not in content:
+ return []
+ return [Member(self._connection, entry['self_link'], entry)
+ for entry in content['entries']]
+ else:
+ return Page(self._connection, url, Member, count, page)
+
+ @property
+ def settings(self):
+ if self._settings is None:
+ self._settings = Settings(
+ self._connection,
+ 'lists/{0}/config'.format(self.fqdn_listname))
+ return self._settings
+
+ @property
+ def held(self):
+ """Return a list of dicts with held message information."""
+ response, content = self._connection.call(
+ 'lists/{0}/held'.format(self.fqdn_listname), None, 'GET')
+ if 'entries' not in content:
+ return []
+ return [HeldMessage(self._connection, entry['self_link'], entry)
+ for entry in content['entries']]
+
+ def get_held_page(self, count=50, page=1):
+ url = 'lists/{0}/held'.format(self.fqdn_listname)
+ return Page(self._connection, url, HeldMessage, count, page)
+
+ def get_held_message(self, held_id):
+ url = 'lists/{0}/held/{1}'.format(self.fqdn_listname, held_id)
+ return HeldMessage(self._connection, url)
+
+ @property
+ def requests(self):
+ """Return a list of dicts with subscription requests."""
+ response, content = self._connection.call(
+ 'lists/{0}/requests'.format(self.fqdn_listname), None, 'GET')
+ if 'entries' not in content:
+ return []
+ else:
+ entries = []
+ for entry in content['entries']:
+ request = dict(email=entry['email'],
+ token=entry['token'],
+ token_owner=entry['token_owner'],
+ list_id=entry['list_id'],
+ request_date=entry['when'])
+ entries.append(request)
+ return entries
+
+ @property
+ def archivers(self):
+ url = 'lists/{0}/archivers'.format(self.list_id)
+ return ListArchivers(self._connection, url, self)
+
+ @archivers.setter
+ def archivers(self, new_value):
+ url = 'lists/{0}/archivers'.format(self.list_id)
+ archivers = ListArchivers(self._connection, url, self)
+ archivers.update(new_value)
+ archivers.save()
+
+ def add_owner(self, address):
+ self.add_role('owner', address)
+
+ def add_moderator(self, address):
+ self.add_role('moderator', address)
+
+ def add_role(self, role, address):
+ data = dict(list_id=self.list_id,
+ subscriber=address,
+ role=role)
+ self._connection.call('members', data)
+
+ def remove_owner(self, address):
+ self.remove_role('owner', address)
+
+ def remove_moderator(self, address):
+ self.remove_role('moderator', address)
+
+ def remove_role(self, role, address):
+ url = 'lists/%s/%s/%s' % (self.fqdn_listname, role, address)
+ self._connection.call(url, method='DELETE')
+
+ def moderate_message(self, request_id, action):
+ """Moderate a held message.
+
+ :param request_id: Id of the held message.
+ :type request_id: Int.
+ :param action: Action to perform on held message.
+ :type action: String.
+ """
+ path = 'lists/{0}/held/{1}'.format(
+ self.fqdn_listname, str(request_id))
+ response, content = self._connection.call(
+ path, dict(action=action), 'POST')
+ return response
+
+ def discard_message(self, request_id):
+ """Shortcut for moderate_message."""
+ return self.moderate_message(request_id, 'discard')
+
+ def reject_message(self, request_id):
+ """Shortcut for moderate_message."""
+ return self.moderate_message(request_id, 'reject')
+
+ def defer_message(self, request_id):
+ """Shortcut for moderate_message."""
+ return self.moderate_message(request_id, 'defer')
+
+ def accept_message(self, request_id):
+ """Shortcut for moderate_message."""
+ return self.moderate_message(request_id, 'accept')
+
+ def moderate_request(self, request_id, action):
+ """
+ Moderate a subscription request.
+
+ :param action: accept|reject|discard|defer
+ :type action: str.
+ """
+ path = 'lists/{0}/requests/{1}'.format(self.list_id, request_id)
+ response, content = self._connection.call(path, {'action': action})
+ return response
+
+ def manage_request(self, token, action):
+ """Alias for moderate_request, kept for compatibility"""
+ warnings.warn(
+ 'The `manage_request()` method has been replaced by '
+ '`moderate_request()` and will be removed in the future.',
+ DeprecationWarning, stacklevel=2)
+ return self.moderate_request(token, action)
+
+ def accept_request(self, request_id):
+ """Shortcut to accept a subscription request."""
+ return self.moderate_request(request_id, 'accept')
+
+ def reject_request(self, request_id):
+ """Shortcut to reject a subscription request."""
+ return self.moderate_request(request_id, 'reject')
+
+ def discard_request(self, request_id):
+ """Shortcut to discard a subscription request."""
+ return self.moderate_request(request_id, 'discard')
+
+ def defer_request(self, request_id):
+ """Shortcut to defer a subscription request."""
+ return self.moderate_request(request_id, 'defer')
+
+ def get_member(self, email):
+ """Get a membership.
+
+ :param address: The email address of the member for this list.
+ :return: A member proxy object.
+ """
+ # In order to get the member object we query the REST API for
+ # the member. Incase there is no matching subscription, an
+ # HTTPError is returned instead.
+ try:
+ path = 'lists/{0}/member/{1}'.format(self.list_id, email)
+ response, content = self._connection.call(path)
+ return Member(self._connection, content['self_link'], content)
+ except HTTPError:
+ raise ValueError('%s is not a member address of %s' %
+ (email, self.fqdn_listname))
+
+ def subscribe(self, address, display_name=None, pre_verified=False,
+ pre_confirmed=False, pre_approved=False):
+ """Subscribe an email address to a mailing list.
+
+ :param address: Email address to subscribe to the list.
+ :type address: str
+ :param display_name: The real name of the new member.
+ :param pre_verified: True if the address has been verified.
+ :type pre_verified: bool
+ :param pre_confirmed: True if membership has been approved by the user.
+ :type pre_confirmed: bool
+ :param pre_approved: True if membership is moderator-approved.
+ :type pre_approved: bool
+ :type display_name: str
+ :return: A member proxy object.
+ """
+ data = dict(
+ list_id=self.list_id,
+ subscriber=address,
+ display_name=display_name,
+ )
+ if pre_verified:
+ data['pre_verified'] = True
+ if pre_confirmed:
+ data['pre_confirmed'] = True
+ if pre_approved:
+ data['pre_approved'] = True
+ response, content = self._connection.call('members', data)
+ # If a member is not immediately subscribed (i.e. verificatoin,
+ # confirmation or approval need), the response content is returned.
+ if response.status == 202:
+ return content
+ # I the subscription is executed immediately, a member object
+ # is returned.
+ return Member(self._connection, response['location'])
+
+ def unsubscribe(self, email):
+ """Unsubscribe an email address from a mailing list.
+
+ :param address: The address to unsubscribe.
+ """
+ # In order to get the member object we need to
+ # iterate over the existing member list
+
+ try:
+ path = 'lists/{0}/member/{1}'.format(self.list_id, email)
+ self._connection.call(path, method='DELETE')
+ except HTTPError:
+ # The member link does not exist, i.e. he is not a member
+ raise ValueError('%s is not a member address of %s' %
+ (email, self.fqdn_listname))
+
+ @property
+ def bans(self):
+ from mailmanclient.restobjects.ban import Bans
+ url = 'lists/{0}/bans'.format(self.list_id)
+ return Bans(self._connection, url, mlist=self)
+
+ def get_bans_page(self, count=50, page=1):
+ from mailmanclient.restobjects.ban import BannedAddress
+ url = 'lists/{0}/bans'.format(self.list_id)
+ return Page(self._connection, url, BannedAddress, count, page)
+
+ @property
+ def header_matches(self):
+ url = 'lists/{0}/header-matches'.format(self.list_id)
+ return HeaderMatches(self._connection, url, self)
diff --git a/src/mailmanclient/restobjects/member.py b/src/mailmanclient/restobjects/member.py
new file mode 100644
index 0000000..1016042
--- /dev/null
+++ b/src/mailmanclient/restobjects/member.py
@@ -0,0 +1,51 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+from mailmanclient.restobjects.preferences import PreferencesMixin
+from mailmanclient.restbase.base import RESTObject
+
+__metaclass__ = type
+__all__ = [
+ 'Member'
+]
+
+
+class Member(RESTObject, PreferencesMixin):
+
+ _properties = ('delivery_mode', 'email', 'list_id', 'moderation_action',
+ 'role', 'self_link')
+ _writable_properties = ('address', 'delivery_mode', 'moderation_action')
+
+ def __repr__(self):
+ return '<Member "{0}" on "{1}">'.format(self.email, self.list_id)
+
+ def __unicode__(self):
+ return '<Member "{0}" on "{1}">'.format(self.email, self.list_id)
+
+ @property
+ def address(self):
+ from mailmanclient.restobjects.address import Address
+ return Address(self._connection, self.rest_data['address'])
+
+ @property
+ def user(self):
+ from mailmanclient.restobjects.user import User
+ return User(self._connection, self.rest_data['user'])
+
+ def unsubscribe(self):
+ """Unsubscribe the member from a mailing list.
+ """
+ # TODO: call .delete() instead?
+ self._connection.call(self.self_link, method='DELETE')
diff --git a/src/mailmanclient/restobjects/preferences.py b/src/mailmanclient/restobjects/preferences.py
new file mode 100644
index 0000000..8a5879e
--- /dev/null
+++ b/src/mailmanclient/restobjects/preferences.py
@@ -0,0 +1,45 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+from mailmanclient.restbase.base import RESTDict
+
+__metaclass__ = type
+__all__ = [
+ 'Preferences',
+ 'PreferencesMixin'
+]
+
+
+class Preferences(RESTDict):
+
+ _properties = (
+ 'acknowledge_posts', 'delivery_mode', 'delivery_status',
+ 'hide_address', 'preferred_language', 'receive_list_copy',
+ 'receive_own_postings',
+ )
+
+ def delete(self):
+ response, content = self._connection.call(self._url, method='DELETE')
+
+
+class PreferencesMixin:
+ """Mixin for restobjects that have preferences."""
+
+ @property
+ def preferences(self):
+ if getattr(self, '_preferences', None) is None:
+ path = '{0}/preferences'.format(self.self_link)
+ self._preferences = Preferences(self._connection, path)
+ return self._preferences
diff --git a/src/mailmanclient/restobjects/queue.py b/src/mailmanclient/restobjects/queue.py
new file mode 100644
index 0000000..62e2be3
--- /dev/null
+++ b/src/mailmanclient/restobjects/queue.py
@@ -0,0 +1,38 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+from mailmanclient.restbase.base import RESTObject
+
+__metaclass__ = type
+__all__ = [
+ 'Queue'
+]
+
+
+class Queue(RESTObject):
+
+ _properties = ('name', 'directory', 'files')
+
+ def __repr__(self):
+ return '<Queue: {}>'.format(self.name)
+
+ def inject(self, list_id, text):
+ self._connection.call(self._url, dict(list_id=list_id, text=text))
+
+ @property
+ def files(self):
+ # No caching.
+ response, content = self._connection.call(self._url)
+ return content['files']
diff --git a/src/mailmanclient/restobjects/settings.py b/src/mailmanclient/restobjects/settings.py
new file mode 100644
index 0000000..10ab017
--- /dev/null
+++ b/src/mailmanclient/restobjects/settings.py
@@ -0,0 +1,47 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+from mailmanclient.restbase.base import RESTDict
+
+__metaclass__ = type
+__all__ = [
+ 'Settings'
+]
+
+
+class Settings(RESTDict):
+
+ _read_only_properties = (
+ 'bounces_address',
+ 'created_at',
+ 'digest_last_sent_at',
+ 'fqdn_listname',
+ 'join_address',
+ 'last_post_at',
+ 'leave_address',
+ 'list_id',
+ 'list_name',
+ 'mail_host',
+ 'next_digest_number',
+ 'no_reply_address',
+ 'owner_address',
+ 'post_id',
+ 'posting_address',
+ 'request_address',
+ 'scheme',
+ 'self_link',
+ 'volume',
+ 'web_host',
+ )
diff --git a/src/mailmanclient/restobjects/user.py b/src/mailmanclient/restobjects/user.py
new file mode 100644
index 0000000..0371303
--- /dev/null
+++ b/src/mailmanclient/restobjects/user.py
@@ -0,0 +1,104 @@
+# Copyright (C) 2010-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+
+from mailmanclient.restobjects.preferences import PreferencesMixin
+
+from mailmanclient.restobjects.address import Addresses, Address
+from mailmanclient.restbase.base import RESTObject
+
+__metaclass__ = type
+__all__ = [
+ 'User'
+]
+
+
+class User(RESTObject, PreferencesMixin):
+
+ _properties = ('created_on', 'display_name', 'is_server_owner',
+ 'password', 'self_link', 'user_id')
+ _writable_properties = ('cleartext_password', 'display_name',
+ 'is_server_owner')
+
+ def __init__(self, connection, url, data=None):
+ super(User, self).__init__(connection, url, data)
+ self._subscriptions = None
+ self._subscription_list_ids = None
+
+ def __repr__(self):
+ return '<User "{0}" ({1})>'.format(self.display_name, self.user_id)
+
+ @property
+ def addresses(self):
+ return Addresses(
+ self._connection, 'users/{0}/addresses'.format(self.user_id))
+
+ def __setattr__(self, name, value):
+ """Special case for the password"""
+ if name == 'password':
+ self._changed_rest_data['cleartext_password'] = value
+ if self._autosave:
+ self.save()
+ else:
+ super(User, self).__setattr__(name, value)
+
+ @property
+ def subscriptions(self):
+ from mailmanclient.restobjects.member import Member
+ if self._subscriptions is None:
+ subscriptions = []
+ for address in self.addresses:
+ response, content = self._connection.call(
+ 'members/find', data={'subscriber': address})
+ try:
+ for entry in content['entries']:
+ subscriptions.append(Member(
+ self._connection, entry['self_link'], entry))
+ except KeyError:
+ pass
+ self._subscriptions = subscriptions
+ return self._subscriptions
+
+ @property
+ def subscription_list_ids(self):
+ if self._subscription_list_ids is None:
+ list_ids = []
+ for sub in self.subscriptions:
+ list_ids.append(sub.list_id)
+ self._subscription_list_ids = list_ids
+ return self._subscription_list_ids
+
+ def add_address(self, email, absorb_existing=False):
+ """
+ Adds another email adress to the user record and returns an
+ _Address object.
+
+ :param email: The address to add
+ :type email: str.
+ :param absorb_existing: set this to True if you want to add the address
+ even if it already exists. It will import the existing user into
+ the current one, not overwriting any previously set value.
+ :type absorb_existing: bool.
+ """
+ url = '{0}/addresses'.format(self._url)
+ data = {'email': email}
+ if absorb_existing:
+ data['absorb_existing'] = 1
+ response, content = self._connection.call(url, data)
+ address = {
+ 'email': email,
+ 'self_link': response['location'],
+ }
+ return Address(self._connection, address['self_link'], address)
diff --git a/src/mailmanclient/testing/__init__.py b/src/mailmanclient/testing/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/mailmanclient/testing/__init__.py
diff --git a/src/mailmanclient/testing/documentation.py b/src/mailmanclient/testing/documentation.py
new file mode 100644
index 0000000..2108c95
--- /dev/null
+++ b/src/mailmanclient/testing/documentation.py
@@ -0,0 +1,40 @@
+# Copyright (C) 2007-2017 The Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Harness for testing Mailman's documentation."""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+__metaclass__ = type
+__all__ = [
+ 'dump',
+ ]
+
+
+def dump(results):
+ if results is None:
+ print(None)
+ return
+ for key in sorted(results):
+ if key == 'entries':
+ for i, entry in enumerate(results[key]):
+ # entry is a dictionary.
+ print('entry %d:' % i)
+ for entry_key in sorted(entry):
+ print(' {0}: {1}'.format(entry_key, entry[entry_key]))
+ else:
+ print('{0}: {1}'.format(key, results[key]))
diff --git a/src/mailmanclient/testing/vcr_helpers.py b/src/mailmanclient/testing/vcr_helpers.py
new file mode 100644
index 0000000..dab7a5f
--- /dev/null
+++ b/src/mailmanclient/testing/vcr_helpers.py
@@ -0,0 +1,109 @@
+# Copyright (C) 2015-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Helpers for VCR"""
+
+import vcr
+
+from functools import update_wrapper
+from six import binary_type, text_type
+from six.moves.urllib.parse import urlparse, urlunparse, parse_qsl, urlencode
+
+
+__all__ = [
+ 'get_vcr',
+ ]
+
+# XXX: This module exists to maintain compatibility with some parts of
+# Postorius' test suite which use this internal API. This is duplicated in new
+# versions of Postorius (for >1.1 releases).
+
+
+def filter_response_headers(response):
+ for header in ('Date', 'Server', 'date', 'server'):
+ # The headers are lowercase on Python 2 and capitalized on Python 3
+ if header in response['headers']:
+ del response['headers'][header]
+ return response
+
+
+def reorder_request_params(request):
+ def reorder_params(params):
+ parsed = parse_qsl(params)
+ if parsed:
+ return urlencode(sorted(parsed, key=lambda kv: kv[0]))
+ else:
+ # Parsing failed, it may be a simple string.
+ return params
+ # sort the URL query-string by key names.
+ uri_parts = urlparse(request.uri)
+ if uri_parts.query:
+ request.uri = urlunparse((
+ uri_parts.scheme, uri_parts.netloc, uri_parts.path,
+ uri_parts.params, reorder_params(uri_parts.query),
+ uri_parts.fragment,
+ ))
+ # convert the request body to text and sort the parameters.
+ if isinstance(request.body, binary_type):
+ try:
+ request._body = request._body.decode('utf-8')
+ except UnicodeDecodeError:
+ pass
+ if isinstance(request.body, text_type):
+ request._body = reorder_params(request._body.encode('utf-8'))
+ return request
+
+
+def get_vcr(**kwargs):
+ return vcr.VCR(
+ filter_headers=['authorization', 'user-agent', 'date'],
+ before_record=reorder_request_params,
+ before_record_response=filter_response_headers,
+ **kwargs
+ )
+
+
+class vcr_testcase:
+ """
+ Decorator for TestCases that use VCR.
+ It automatically sets up a different cassette for each test function.
+ """
+
+ def __init__(self, vcr_instance):
+ self.vcr = vcr_instance
+
+ def __call__(self, testcase):
+ return self.decorate_class(testcase)
+
+ def decorate_class(self, testcase):
+ """Create a subclass that will add setUp instructions."""
+ vcr_instance = self.vcr
+
+ class VCRTestCase(testcase):
+ vcr = vcr_instance
+
+ def setUp(self):
+ cm = self.vcr.use_cassette('.'.join([
+ # testcase.__module__.rpartition('.')[2],
+ testcase.__name__, self._testMethodName, 'yaml']))
+ self.cassette = cm.__enter__()
+ self.addCleanup(cm.__exit__, None, None, None)
+ super(VCRTestCase, self).setUp()
+
+ return update_wrapper(
+ VCRTestCase, testcase,
+ assigned=('__module__', '__name__'), updated=[])
diff --git a/src/mailmanclient/tests/__init__.py b/src/mailmanclient/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/mailmanclient/tests/__init__.py
diff --git a/src/mailmanclient/tests/data/TestDomains.test_no_domain.yaml b/src/mailmanclient/tests/data/TestDomains.test_no_domain.yaml
new file mode 100644
index 0000000..eeffa76
--- /dev/null
+++ b/src/mailmanclient/tests/data/TestDomains.test_no_domain.yaml
@@ -0,0 +1,14 @@
+interactions:
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.0/domains/example.org
+ response:
+ body: {string: !!python/unicode '404 Not Found'}
+ headers:
+ content-length: ['13']
+ content-type: [application/json; charset=UTF-8]
+ status: {code: 404, message: Not Found}
+version: 1
diff --git a/src/mailmanclient/tests/data/TestUnicode.test_create_user.yaml b/src/mailmanclient/tests/data/TestUnicode.test_create_user.yaml
new file mode 100644
index 0000000..8290524
--- /dev/null
+++ b/src/mailmanclient/tests/data/TestUnicode.test_create_user.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: !!python/unicode 'display_name=J%C3%A9r%C3%B4me&email=jeremy%40example.com&password=1234'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/users
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ location: ['http://localhost:9001/3.1/users/0000000000000000000000000000000d']
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000000d
+ response:
+ body: {string: !!python/unicode '{"created_on": "2005-08-01T07:49:23", "display_name":
+ "J\u00e9r\u00f4me", "http_etag": "\"d78f048ae1392154b9563088e8f784ef26e5be62\"",
+ "is_server_owner": false, "password": "$6$rounds=656000$OnXXy2o/Ekoi2lAu$F4C.1ma.fdl9ovvmkjWloLrdn4z2.Z47vV1wvcBQK008zDXw0Dyl2Gp2GH3qQmCAuuY7MC5qmnkPR9vKE2j.u/",
+ "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000000d",
+ "user_id": "0000000000000000000000000000000d"}'}
+ headers:
+ content-length: ['424']
+ content-type: [application/json; charset=UTF-8]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/jeremy@example.com
+ response:
+ body: {string: !!python/unicode '{"created_on": "2005-08-01T07:49:23", "display_name":
+ "J\u00e9r\u00f4me", "http_etag": "\"d78f048ae1392154b9563088e8f784ef26e5be62\"",
+ "is_server_owner": false, "password": "$6$rounds=656000$OnXXy2o/Ekoi2lAu$F4C.1ma.fdl9ovvmkjWloLrdn4z2.Z47vV1wvcBQK008zDXw0Dyl2Gp2GH3qQmCAuuY7MC5qmnkPR9vKE2j.u/",
+ "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000000d",
+ "user_id": "0000000000000000000000000000000d"}'}
+ headers:
+ content-length: ['424']
+ content-type: [application/json; charset=UTF-8]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000000d
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ status: {code: 204, message: No Content}
+version: 1
diff --git a/src/mailmanclient/tests/data/using.rst.yaml b/src/mailmanclient/tests/data/using.rst.yaml
new file mode 100644
index 0000000..7b614bb
--- /dev/null
+++ b/src/mailmanclient/tests/data/using.rst.yaml
@@ -0,0 +1,5457 @@
+interactions:
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/system/versions
+ response:
+ body: {string: !!python/unicode '{"api_version": "3.1", "http_etag": "\"37ddc1fe42b81fd3b6952798c015a6f321f481a8\"",
+ "mailman_version": "GNU Mailman 3.2.0a1 (La Villa Strangiato)", "python_version":
+ "3.5.3 (default, Jan 19 2017, 14:11:04) \n[GCC 6.3.0 20170118]", "self_link":
+ "http://localhost:9001/3.1/system/versions"}'}
+ headers:
+ content-length: ['288']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'mail_host=example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/domains
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ location: ['http://localhost:9001/3.1/domains/example.com']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.com
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"d6e3312427f77f8bae17740af4d812349a811a55\"",
+ "mail_host": "example.com", "self_link": "http://localhost:9001/3.1/domains/example.com"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.com
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"d6e3312427f77f8bae17740af4d812349a811a55\"",
+ "mail_host": "example.com", "self_link": "http://localhost:9001/3.1/domains/example.com"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.com
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"d6e3312427f77f8bae17740af4d812349a811a55\"",
+ "mail_host": "example.com", "self_link": "http://localhost:9001/3.1/domains/example.com"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'mail_host=example.net'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/domains
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ location: ['http://localhost:9001/3.1/domains/example.net']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.net
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"593e581e7bf6c9599b156d6d52a6ca5d56f174f3\"",
+ "mail_host": "example.net", "self_link": "http://localhost:9001/3.1/domains/example.net"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'mail_host=example.org'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/domains
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ location: ['http://localhost:9001/3.1/domains/example.org']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.org
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"9db56968670dce724a7280d88f5b29c8ba0cb516\"",
+ "mail_host": "example.org", "self_link": "http://localhost:9001/3.1/domains/example.org"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains
+ response:
+ body: {string: !!python/unicode '{"entries": [{"description": null, "http_etag":
+ "\"d6e3312427f77f8bae17740af4d812349a811a55\"", "mail_host": "example.com",
+ "self_link": "http://localhost:9001/3.1/domains/example.com"}, {"description":
+ null, "http_etag": "\"593e581e7bf6c9599b156d6d52a6ca5d56f174f3\"", "mail_host":
+ "example.net", "self_link": "http://localhost:9001/3.1/domains/example.net"},
+ {"description": null, "http_etag": "\"9db56968670dce724a7280d88f5b29c8ba0cb516\"",
+ "mail_host": "example.org", "self_link": "http://localhost:9001/3.1/domains/example.org"}],
+ "http_etag": "\"cbb432be6bf5871343ad67746a268dcd9d52f0a7\"", "start": 0, "total_size":
+ 3}'}
+ headers:
+ content-length: ['625']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.com
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"d6e3312427f77f8bae17740af4d812349a811a55\"",
+ "mail_host": "example.com", "self_link": "http://localhost:9001/3.1/domains/example.com"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.net
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"593e581e7bf6c9599b156d6d52a6ca5d56f174f3\"",
+ "mail_host": "example.net", "self_link": "http://localhost:9001/3.1/domains/example.net"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.org
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"9db56968670dce724a7280d88f5b29c8ba0cb516\"",
+ "mail_host": "example.org", "self_link": "http://localhost:9001/3.1/domains/example.org"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/domains/example.org
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains
+ response:
+ body: {string: !!python/unicode '{"entries": [{"description": null, "http_etag":
+ "\"d6e3312427f77f8bae17740af4d812349a811a55\"", "mail_host": "example.com",
+ "self_link": "http://localhost:9001/3.1/domains/example.com"}, {"description":
+ null, "http_etag": "\"593e581e7bf6c9599b156d6d52a6ca5d56f174f3\"", "mail_host":
+ "example.net", "self_link": "http://localhost:9001/3.1/domains/example.net"}],
+ "http_etag": "\"ca79d1241b5c323f634284232ad894799b5a3c63\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['451']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.com
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"d6e3312427f77f8bae17740af4d812349a811a55\"",
+ "mail_host": "example.com", "self_link": "http://localhost:9001/3.1/domains/example.com"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.net
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"593e581e7bf6c9599b156d6d52a6ca5d56f174f3\"",
+ "mail_host": "example.net", "self_link": "http://localhost:9001/3.1/domains/example.net"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'fqdn_listname=test-1%40example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ location: ['http://localhost:9001/3.1/lists/test-1.example.com']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com
+ response:
+ body: {string: !!python/unicode '{"display_name": "Test-1", "fqdn_listname": "test-1@example.com",
+ "http_etag": "\"40cd89e168750b73cbc0d60933bba97892048be2\"", "list_id": "test-1.example.com",
+ "list_name": "test-1", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-1.example.com", "volume": 1}'}
+ headers:
+ content-length: ['309']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com
+ response:
+ body: {string: !!python/unicode '{"display_name": "Test-1", "fqdn_listname": "test-1@example.com",
+ "http_etag": "\"40cd89e168750b73cbc0d60933bba97892048be2\"", "list_id": "test-1.example.com",
+ "list_name": "test-1", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-1.example.com", "volume": 1}'}
+ headers:
+ content-length: ['309']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'fqdn_listname=test-2%40example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ location: ['http://localhost:9001/3.1/lists/test-2.example.com']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-2.example.com
+ response:
+ body: {string: !!python/unicode '{"display_name": "Test-2", "fqdn_listname": "test-2@example.com",
+ "http_etag": "\"a52f87bcdd7a4035c93a8b0a4a92ee4342278428\"", "list_id": "test-2.example.com",
+ "list_name": "test-2", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-2.example.com", "volume": 1}'}
+ headers:
+ content-length: ['309']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.net
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"593e581e7bf6c9599b156d6d52a6ca5d56f174f3\"",
+ "mail_host": "example.net", "self_link": "http://localhost:9001/3.1/domains/example.net"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.net
+ response:
+ body: {string: !!python/unicode '{"description": null, "http_etag": "\"593e581e7bf6c9599b156d6d52a6ca5d56f174f3\"",
+ "mail_host": "example.net", "self_link": "http://localhost:9001/3.1/domains/example.net"}'}
+ headers:
+ content-length: ['172']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'fqdn_listname=test-3%40example.net'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ location: ['http://localhost:9001/3.1/lists/test-3.example.net']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-3.example.net
+ response:
+ body: {string: !!python/unicode '{"display_name": "Test-3", "fqdn_listname": "test-3@example.net",
+ "http_etag": "\"351777e7d0678dfb6668c73f9fc37a0147a47297\"", "list_id": "test-3.example.net",
+ "list_name": "test-3", "mail_host": "example.net", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-3.example.net", "volume": 1}'}
+ headers:
+ content-length: ['309']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'fqdn_listname=test-3%40example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ location: ['http://localhost:9001/3.1/lists/test-3.example.com']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-3.example.com
+ response:
+ body: {string: !!python/unicode '{"display_name": "Test-3", "fqdn_listname": "test-3@example.com",
+ "http_etag": "\"28ebc14149a5a5a2d1768712201e7bd96d1a6d40\"", "list_id": "test-3.example.com",
+ "list_name": "test-3", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-3.example.com", "volume": 1}'}
+ headers:
+ content-length: ['309']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Test-1", "fqdn_listname":
+ "test-1@example.com", "http_etag": "\"40cd89e168750b73cbc0d60933bba97892048be2\"",
+ "list_id": "test-1.example.com", "list_name": "test-1", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-1.example.com",
+ "volume": 1}, {"display_name": "Test-2", "fqdn_listname": "test-2@example.com",
+ "http_etag": "\"a52f87bcdd7a4035c93a8b0a4a92ee4342278428\"", "list_id": "test-2.example.com",
+ "list_name": "test-2", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-2.example.com", "volume": 1}, {"display_name":
+ "Test-3", "fqdn_listname": "test-3@example.com", "http_etag": "\"28ebc14149a5a5a2d1768712201e7bd96d1a6d40\"",
+ "list_id": "test-3.example.com", "list_name": "test-3", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-3.example.com",
+ "volume": 1}, {"display_name": "Test-3", "fqdn_listname": "test-3@example.net",
+ "http_etag": "\"351777e7d0678dfb6668c73f9fc37a0147a47297\"", "list_id": "test-3.example.net",
+ "list_name": "test-3", "mail_host": "example.net", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-3.example.net", "volume": 1}], "http_etag":
+ "\"cc8a6adc8dee9865e485162fedfccfc5cb00ee7d\"", "start": 0, "total_size":
+ 4}'}
+ headers:
+ content-length: ['1347']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/config
+ response:
+ body: {string: !!python/unicode '{"acceptable_aliases": [], "admin_immed_notify":
+ true, "admin_notify_mchanges": false, "administrivia": true, "advertised":
+ true, "allow_list_posts": true, "anonymous_list": false, "archive_policy":
+ "public", "autorespond_owner": "none", "autorespond_postings": "none", "autorespond_requests":
+ "none", "autoresponse_grace_period": "90d", "autoresponse_owner_text": "",
+ "autoresponse_postings_text": "", "autoresponse_request_text": "", "bounces_address":
+ "test-1-bounces@example.com", "collapse_alternatives": true, "convert_html_to_plaintext":
+ false, "created_at": "2005-08-01T07:49:23", "default_member_action": "defer",
+ "default_nonmember_action": "hold", "description": "", "digest_last_sent_at":
+ null, "digest_send_periodic": true, "digest_size_threshold": 30.0, "digest_volume_frequency":
+ "monthly", "digests_enabled": true, "display_name": "Test-1", "dmarc_mitigate_action":
+ "no_mitigation", "dmarc_mitigate_unconditionally": false, "dmarc_moderation_notice":
+ "", "dmarc_wrapped_message_text": "", "filter_content": false, "first_strip_reply_to":
+ false, "fqdn_listname": "test-1@example.com", "http_etag": "\"f78b48eaabed841fc433122a21c9ab5d8304ce42\"",
+ "include_rfc2369_headers": true, "info": "", "join_address": "test-1-join@example.com",
+ "last_post_at": null, "leave_address": "test-1-leave@example.com", "list_name":
+ "test-1", "mail_host": "example.com", "moderator_password": null, "next_digest_number":
+ 1, "no_reply_address": "noreply@example.com", "owner_address": "test-1-owner@example.com",
+ "post_id": 1, "posting_address": "test-1@example.com", "posting_pipeline":
+ "default-posting-pipeline", "reply_goes_to_list": "no_munging", "reply_to_address":
+ "", "request_address": "test-1-request@example.com", "send_welcome_message":
+ true, "subject_prefix": "[Test-1] ", "subscription_policy": "confirm", "volume":
+ 1}'}
+ headers:
+ content-length: ['1827']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'advertised=False'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'PATCH'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/config
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists?advertised=true
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Test-2", "fqdn_listname":
+ "test-2@example.com", "http_etag": "\"a52f87bcdd7a4035c93a8b0a4a92ee4342278428\"",
+ "list_id": "test-2.example.com", "list_name": "test-2", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-2.example.com",
+ "volume": 1}, {"display_name": "Test-3", "fqdn_listname": "test-3@example.com",
+ "http_etag": "\"28ebc14149a5a5a2d1768712201e7bd96d1a6d40\"", "list_id": "test-3.example.com",
+ "list_name": "test-3", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-3.example.com", "volume": 1}, {"display_name":
+ "Test-3", "fqdn_listname": "test-3@example.net", "http_etag": "\"351777e7d0678dfb6668c73f9fc37a0147a47297\"",
+ "list_id": "test-3.example.net", "list_name": "test-3", "mail_host": "example.net",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-3.example.net",
+ "volume": 1}], "http_etag": "\"202af86b8895e04728a0881bd9c5373baf8f61a2\"",
+ "start": 0, "total_size": 3}'}
+ headers:
+ content-length: ['1036']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists?count=2&page=1
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Test-1", "fqdn_listname":
+ "test-1@example.com", "http_etag": "\"40cd89e168750b73cbc0d60933bba97892048be2\"",
+ "list_id": "test-1.example.com", "list_name": "test-1", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-1.example.com",
+ "volume": 1}, {"display_name": "Test-2", "fqdn_listname": "test-2@example.com",
+ "http_etag": "\"a52f87bcdd7a4035c93a8b0a4a92ee4342278428\"", "list_id": "test-2.example.com",
+ "list_name": "test-2", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-2.example.com", "volume": 1}], "http_etag":
+ "\"690582fb9a8017c589b175f493b814cf061b0246\"", "start": 0, "total_size":
+ 4}'}
+ headers:
+ content-length: ['725']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists?count=2&page=2
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Test-3", "fqdn_listname":
+ "test-3@example.com", "http_etag": "\"28ebc14149a5a5a2d1768712201e7bd96d1a6d40\"",
+ "list_id": "test-3.example.com", "list_name": "test-3", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-3.example.com",
+ "volume": 1}, {"display_name": "Test-3", "fqdn_listname": "test-3@example.net",
+ "http_etag": "\"351777e7d0678dfb6668c73f9fc37a0147a47297\"", "list_id": "test-3.example.net",
+ "list_name": "test-3", "mail_host": "example.net", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-3.example.net", "volume": 1}], "http_etag":
+ "\"476bdd05804643bfe24ba8508b85c89b5ae30a8a\"", "start": 2, "total_size":
+ 4}'}
+ headers:
+ content-length: ['725']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists?count=2&page=1&advertised=true
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Test-2", "fqdn_listname":
+ "test-2@example.com", "http_etag": "\"a52f87bcdd7a4035c93a8b0a4a92ee4342278428\"",
+ "list_id": "test-2.example.com", "list_name": "test-2", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-2.example.com",
+ "volume": 1}, {"display_name": "Test-3", "fqdn_listname": "test-3@example.com",
+ "http_etag": "\"28ebc14149a5a5a2d1768712201e7bd96d1a6d40\"", "list_id": "test-3.example.com",
+ "list_name": "test-3", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-3.example.com", "volume": 1}], "http_etag":
+ "\"075bb20436aa2ce3e524750ff3e1cd56e713c9c1\"", "start": 0, "total_size":
+ 3}'}
+ headers:
+ content-length: ['725']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.com/lists
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Test-1", "fqdn_listname":
+ "test-1@example.com", "http_etag": "\"40cd89e168750b73cbc0d60933bba97892048be2\"",
+ "list_id": "test-1.example.com", "list_name": "test-1", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-1.example.com",
+ "volume": 1}, {"display_name": "Test-2", "fqdn_listname": "test-2@example.com",
+ "http_etag": "\"a52f87bcdd7a4035c93a8b0a4a92ee4342278428\"", "list_id": "test-2.example.com",
+ "list_name": "test-2", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-2.example.com", "volume": 1}, {"display_name":
+ "Test-3", "fqdn_listname": "test-3@example.com", "http_etag": "\"28ebc14149a5a5a2d1768712201e7bd96d1a6d40\"",
+ "list_id": "test-3.example.com", "list_name": "test-3", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-3.example.com",
+ "volume": 1}], "http_etag": "\"1a8b03ae8ce6b9432939f5f0c0c67bed3164a498\"",
+ "start": 0, "total_size": 3}'}
+ headers:
+ content-length: ['1036']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.com/lists?advertised=true
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Test-2", "fqdn_listname":
+ "test-2@example.com", "http_etag": "\"a52f87bcdd7a4035c93a8b0a4a92ee4342278428\"",
+ "list_id": "test-2.example.com", "list_name": "test-2", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-2.example.com",
+ "volume": 1}, {"display_name": "Test-3", "fqdn_listname": "test-3@example.com",
+ "http_etag": "\"28ebc14149a5a5a2d1768712201e7bd96d1a6d40\"", "list_id": "test-3.example.com",
+ "list_name": "test-3", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-3.example.com", "volume": 1}], "http_etag":
+ "\"c5aa652d137063eca2743e8376dc85c999df1ffa\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['725']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/domains/example.com/lists?count=2&page=1&advertised=true
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Test-2", "fqdn_listname":
+ "test-2@example.com", "http_etag": "\"a52f87bcdd7a4035c93a8b0a4a92ee4342278428\"",
+ "list_id": "test-2.example.com", "list_name": "test-2", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-2.example.com",
+ "volume": 1}, {"display_name": "Test-3", "fqdn_listname": "test-3@example.com",
+ "http_etag": "\"28ebc14149a5a5a2d1768712201e7bd96d1a6d40\"", "list_id": "test-3.example.com",
+ "list_name": "test-3", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-3.example.com", "volume": 1}], "http_etag":
+ "\"c5aa652d137063eca2743e8376dc85c999df1ffa\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['725']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-3@example.net
+ response:
+ body: {string: !!python/unicode '{"display_name": "Test-3", "fqdn_listname": "test-3@example.net",
+ "http_etag": "\"351777e7d0678dfb6668c73f9fc37a0147a47297\"", "list_id": "test-3.example.net",
+ "list_name": "test-3", "mail_host": "example.net", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-3.example.net", "volume": 1}'}
+ headers:
+ content-length: ['309']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/lists/test-3.example.net
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/lists/test-3@example.com
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Test-1", "fqdn_listname":
+ "test-1@example.com", "http_etag": "\"40cd89e168750b73cbc0d60933bba97892048be2\"",
+ "list_id": "test-1.example.com", "list_name": "test-1", "mail_host": "example.com",
+ "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/test-1.example.com",
+ "volume": 1}, {"display_name": "Test-2", "fqdn_listname": "test-2@example.com",
+ "http_etag": "\"a52f87bcdd7a4035c93a8b0a4a92ee4342278428\"", "list_id": "test-2.example.com",
+ "list_name": "test-2", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-2.example.com", "volume": 1}], "http_etag":
+ "\"fdf5436ef16b7913746f78cc72de5a354f93918b\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['725']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-2@example.com
+ response:
+ body: {string: !!python/unicode '{"display_name": "Test-2", "fqdn_listname": "test-2@example.com",
+ "http_etag": "\"a52f87bcdd7a4035c93a8b0a4a92ee4342278428\"", "list_id": "test-2.example.com",
+ "list_name": "test-2", "mail_host": "example.com", "member_count": 0, "self_link":
+ "http://localhost:9001/3.1/lists/test-2.example.com", "volume": 1}'}
+ headers:
+ content-length: ['309']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-2@example.com/config
+ response:
+ body: {string: !!python/unicode '{"acceptable_aliases": [], "admin_immed_notify":
+ true, "admin_notify_mchanges": false, "administrivia": true, "advertised":
+ true, "allow_list_posts": true, "anonymous_list": false, "archive_policy":
+ "public", "autorespond_owner": "none", "autorespond_postings": "none", "autorespond_requests":
+ "none", "autoresponse_grace_period": "90d", "autoresponse_owner_text": "",
+ "autoresponse_postings_text": "", "autoresponse_request_text": "", "bounces_address":
+ "test-2-bounces@example.com", "collapse_alternatives": true, "convert_html_to_plaintext":
+ false, "created_at": "2005-08-01T07:49:23", "default_member_action": "defer",
+ "default_nonmember_action": "hold", "description": "", "digest_last_sent_at":
+ null, "digest_send_periodic": true, "digest_size_threshold": 30.0, "digest_volume_frequency":
+ "monthly", "digests_enabled": true, "display_name": "Test-2", "dmarc_mitigate_action":
+ "no_mitigation", "dmarc_mitigate_unconditionally": false, "dmarc_moderation_notice":
+ "", "dmarc_wrapped_message_text": "", "filter_content": false, "first_strip_reply_to":
+ false, "fqdn_listname": "test-2@example.com", "http_etag": "\"f36e1331e828c417e08a07563a1d78030baf302e\"",
+ "include_rfc2369_headers": true, "info": "", "join_address": "test-2-join@example.com",
+ "last_post_at": null, "leave_address": "test-2-leave@example.com", "list_name":
+ "test-2", "mail_host": "example.com", "moderator_password": null, "next_digest_number":
+ 1, "no_reply_address": "noreply@example.com", "owner_address": "test-2-owner@example.com",
+ "post_id": 1, "posting_address": "test-2@example.com", "posting_pipeline":
+ "default-posting-pipeline", "reply_goes_to_list": "no_munging", "reply_to_address":
+ "", "request_address": "test-2-request@example.com", "send_welcome_message":
+ true, "subject_prefix": "[Test-2] ", "subscription_policy": "confirm", "volume":
+ 1}'}
+ headers:
+ content-length: ['1827']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscriber=unverified%40example.com&display_name=Unverified&list_id=test-1.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"1aca89199df0caf000b3b808201b46b5e4db573c\"",
+ "token": "0000000000000000000000000000000000000647", "token_owner": "subscriber"}'}
+ headers:
+ content-length: ['143']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 202, message: Accepted}
+- request:
+ body: !!python/unicode 'subscriber=unconfirmed%40example.com&pre_verified=True&display_name=Unconfirmed&list_id=test-1.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"858116a4a02340890b528d88e487e7fd21f8debb\"",
+ "token": "0000000000000000000000000000000000000648", "token_owner": "subscriber"}'}
+ headers:
+ content-length: ['143']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:18 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 202, message: Accepted}
+- request:
+ body: !!python/unicode 'subscriber=anna%40example.com&pre_confirmed=True&pre_verified=True&display_name=Anna&list_id=test-1.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ location: ['http://localhost:9001/3.1/members/0000000000000000000000000000033e']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members/0000000000000000000000000000033e
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/anna@example.com",
+ "delivery_mode": "regular", "email": "anna@example.com", "http_etag": "\"177587f08e1f2b2aeeb96de21bcdf9eab1734c13\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033e",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033e",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"}'}
+ headers:
+ content-length: ['444']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscriber=bill%40example.com&pre_confirmed=True&pre_verified=True&display_name=Bill&list_id=test-1.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ location: ['http://localhost:9001/3.1/members/0000000000000000000000000000033f']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members/0000000000000000000000000000033f
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/bill@example.com",
+ "delivery_mode": "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"}'}
+ headers:
+ content-length: ['444']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscriber=anna%40example.com&pre_confirmed=True&pre_verified=True&display_name=None&list_id=test-2.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ location: ['http://localhost:9001/3.1/members/00000000000000000000000000000340']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members/00000000000000000000000000000340
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/anna@example.com",
+ "delivery_mode": "regular", "email": "anna@example.com", "http_etag": "\"a2f87859154c808a8911db829df672878daabf0d\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000340",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000340",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"}'}
+ headers:
+ content-length: ['444']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscriber=cris%40example.com&pre_confirmed=True&pre_verified=True&display_name=Cris&list_id=test-2.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ location: ['http://localhost:9001/3.1/members/00000000000000000000000000000341']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members/00000000000000000000000000000341
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/cris@example.com",
+ "delivery_mode": "regular", "email": "cris@example.com", "http_etag": "\"ec9bbf36110495e8c916aea6056e5bb4fcc83dec\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000341",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000341",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}'}
+ headers:
+ content-length: ['444']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/anna@example.com",
+ "delivery_mode": "regular", "email": "anna@example.com", "http_etag": "\"177587f08e1f2b2aeeb96de21bcdf9eab1734c13\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033e",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033e",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"},
+ {"address": "http://localhost:9001/3.1/addresses/bill@example.com", "delivery_mode":
+ "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"},
+ {"address": "http://localhost:9001/3.1/addresses/anna@example.com", "delivery_mode":
+ "regular", "email": "anna@example.com", "http_etag": "\"a2f87859154c808a8911db829df672878daabf0d\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000340",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000340",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"},
+ {"address": "http://localhost:9001/3.1/addresses/cris@example.com", "delivery_mode":
+ "regular", "email": "cris@example.com", "http_etag": "\"ec9bbf36110495e8c916aea6056e5bb4fcc83dec\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000341",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000341",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}],
+ "http_etag": "\"14f0855e6cc3229e09a0b96bf0724218e6af6249\"", "start": 0, "total_size":
+ 4}'}
+ headers:
+ content-length: ['1887']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/roster/member
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/anna@example.com",
+ "delivery_mode": "regular", "email": "anna@example.com", "http_etag": "\"177587f08e1f2b2aeeb96de21bcdf9eab1734c13\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033e",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033e",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"},
+ {"address": "http://localhost:9001/3.1/addresses/bill@example.com", "delivery_mode":
+ "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"}],
+ "http_etag": "\"c261d0811ec4047a99b68d6e2ee00247b502bdb1\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['995']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members?count=2&page=1
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/anna@example.com",
+ "delivery_mode": "regular", "email": "anna@example.com", "http_etag": "\"177587f08e1f2b2aeeb96de21bcdf9eab1734c13\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033e",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033e",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"},
+ {"address": "http://localhost:9001/3.1/addresses/bill@example.com", "delivery_mode":
+ "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"}],
+ "http_etag": "\"219a1f22638e51e72b805e487458e7c0a7141203\"", "start": 0, "total_size":
+ 4}'}
+ headers:
+ content-length: ['995']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members?count=2&page=2
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/anna@example.com",
+ "delivery_mode": "regular", "email": "anna@example.com", "http_etag": "\"a2f87859154c808a8911db829df672878daabf0d\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000340",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000340",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"},
+ {"address": "http://localhost:9001/3.1/addresses/cris@example.com", "delivery_mode":
+ "regular", "email": "cris@example.com", "http_etag": "\"ec9bbf36110495e8c916aea6056e5bb4fcc83dec\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000341",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000341",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}],
+ "http_etag": "\"edade9ce623bfba815542a50960a237d332271e8\"", "start": 2, "total_size":
+ 4}'}
+ headers:
+ content-length: ['995']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/roster/member?count=1&page=1
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/anna@example.com",
+ "delivery_mode": "regular", "email": "anna@example.com", "http_etag": "\"177587f08e1f2b2aeeb96de21bcdf9eab1734c13\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033e",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033e",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"}],
+ "http_etag": "\"0ce276769846af340782f865f2f1fbd31cf81a1e\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['549']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/roster/member?count=1&page=2
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/bill@example.com",
+ "delivery_mode": "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"}],
+ "http_etag": "\"8f54a0eeaf24ad41b43839c63aded37bc19cfa23\"", "start": 1, "total_size":
+ 2}'}
+ headers:
+ content-length: ['549']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-2.example.com/member/cris@example.com
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/cris@example.com",
+ "delivery_mode": "regular", "email": "cris@example.com", "http_etag": "\"ec9bbf36110495e8c916aea6056e5bb4fcc83dec\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000341",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000341",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}'}
+ headers:
+ content-length: ['444']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-2@example.com
+ response:
+ body: {string: !!python/unicode '{"display_name": "Test-2", "fqdn_listname": "test-2@example.com",
+ "http_etag": "\"9e65ac42ffbf62ab2deab791745ce1695a09e505\"", "list_id": "test-2.example.com",
+ "list_name": "test-2", "mail_host": "example.com", "member_count": 2, "self_link":
+ "http://localhost:9001/3.1/lists/test-2.example.com", "volume": 1}'}
+ headers:
+ content-length: ['309']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-2.example.com/member/cris@example.com
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/cris@example.com",
+ "delivery_mode": "regular", "email": "cris@example.com", "http_etag": "\"ec9bbf36110495e8c916aea6056e5bb4fcc83dec\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000341",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000341",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}'}
+ headers:
+ content-length: ['444']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members/00000000000000000000000000000341/preferences
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"4520dfb39af4de604e7fa2fa6560621fc5a778f9\"",
+ "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000341/preferences"}'}
+ headers:
+ content-length: ['156']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047b
+ response:
+ body: {string: !!python/unicode '{"created_on": "2005-08-01T07:49:23", "display_name":
+ "Cris", "http_etag": "\"ad735a213419d53c39c79a7fca7946c6336811c1\"", "is_server_owner":
+ false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047b",
+ "user_id": "0000000000000000000000000000047b"}'}
+ headers:
+ content-length: ['276']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/lists/test-2.example.com/member/nomember@example.com
+ response:
+ body: {string: !!python/unicode '{"title": "404 Not Found"}'}
+ headers:
+ content-length: ['26']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:19 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ vary: [Accept]
+ status: {code: 404, message: Not Found}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/member/anna@example.com
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/bill@example.com",
+ "delivery_mode": "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"},
+ {"address": "http://localhost:9001/3.1/addresses/anna@example.com", "delivery_mode":
+ "regular", "email": "anna@example.com", "http_etag": "\"a2f87859154c808a8911db829df672878daabf0d\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000340",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000340",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"},
+ {"address": "http://localhost:9001/3.1/addresses/cris@example.com", "delivery_mode":
+ "regular", "email": "cris@example.com", "http_etag": "\"ec9bbf36110495e8c916aea6056e5bb4fcc83dec\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000341",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000341",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}],
+ "http_etag": "\"6f2bde56f2f0c2b17e8deeb2e928aa5c543790bc\"", "start": 0, "total_size":
+ 3}'}
+ headers:
+ content-length: ['1441']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/members/00000000000000000000000000000341
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/bill@example.com",
+ "delivery_mode": "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"},
+ {"address": "http://localhost:9001/3.1/addresses/anna@example.com", "delivery_mode":
+ "regular", "email": "anna@example.com", "http_etag": "\"a2f87859154c808a8911db829df672878daabf0d\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000340",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000340",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"}],
+ "http_etag": "\"690bddbfaeeb62c7e5235706cfe3c6290e880e90\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['995']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/member/nomember@example.com
+ response:
+ body: {string: !!python/unicode '{"title": "404 Not Found"}'}
+ headers:
+ content-length: ['26']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ vary: [Accept]
+ status: {code: 404, message: Not Found}
+- request:
+ body: !!python/unicode 'role=nonmember&list_id=test-1.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members/find
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users
+ response:
+ body: {string: !!python/unicode '{"entries": [{"created_on": "2005-08-01T07:49:23",
+ "display_name": "Unverified", "http_etag": "\"c1122b8a2734e8e4a8a93f574782939315a5af25\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000477",
+ "user_id": "00000000000000000000000000000477"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Unconfirmed", "http_etag": "\"a3f755e773a108a25f54e68048b6c735bbe1ba77\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000478",
+ "user_id": "00000000000000000000000000000478"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Anna", "http_etag": "\"d75a29d94399449661d955fae2269182c0ecbce8\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000479",
+ "user_id": "00000000000000000000000000000479"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Bill", "http_etag": "\"083120bb35acbf4593cfd55fb1d23cb3e113ac15\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047a",
+ "user_id": "0000000000000000000000000000047a"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Cris", "http_etag": "\"ad735a213419d53c39c79a7fca7946c6336811c1\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047b",
+ "user_id": "0000000000000000000000000000047b"}], "http_etag": "\"1db5f7b1c0fd5391ebbc7b5da26684cec05ad5da\"",
+ "start": 0, "total_size": 5}'}
+ headers:
+ content-length: ['1506']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users?count=4&page=1
+ response:
+ body: {string: !!python/unicode '{"entries": [{"created_on": "2005-08-01T07:49:23",
+ "display_name": "Unverified", "http_etag": "\"c1122b8a2734e8e4a8a93f574782939315a5af25\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000477",
+ "user_id": "00000000000000000000000000000477"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Unconfirmed", "http_etag": "\"a3f755e773a108a25f54e68048b6c735bbe1ba77\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000478",
+ "user_id": "00000000000000000000000000000478"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Anna", "http_etag": "\"d75a29d94399449661d955fae2269182c0ecbce8\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000479",
+ "user_id": "00000000000000000000000000000479"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Bill", "http_etag": "\"083120bb35acbf4593cfd55fb1d23cb3e113ac15\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047a",
+ "user_id": "0000000000000000000000000000047a"}], "http_etag": "\"5bc8b0e155b75f24fc0c7f9135c4895e41f2e3a9\"",
+ "start": 0, "total_size": 5}'}
+ headers:
+ content-length: ['1228']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users?count=4&page=2
+ response:
+ body: {string: !!python/unicode '{"entries": [{"created_on": "2005-08-01T07:49:23",
+ "display_name": "Cris", "http_etag": "\"ad735a213419d53c39c79a7fca7946c6336811c1\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047b",
+ "user_id": "0000000000000000000000000000047b"}], "http_etag": "\"b080ff3729449cfe60da2cbd47989430362cfc8f\"",
+ "start": 4, "total_size": 5}'}
+ headers:
+ content-length: ['381']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users?count=4&page=1
+ response:
+ body: {string: !!python/unicode '{"entries": [{"created_on": "2005-08-01T07:49:23",
+ "display_name": "Unverified", "http_etag": "\"c1122b8a2734e8e4a8a93f574782939315a5af25\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000477",
+ "user_id": "00000000000000000000000000000477"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Unconfirmed", "http_etag": "\"a3f755e773a108a25f54e68048b6c735bbe1ba77\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000478",
+ "user_id": "00000000000000000000000000000478"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Anna", "http_etag": "\"d75a29d94399449661d955fae2269182c0ecbce8\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000479",
+ "user_id": "00000000000000000000000000000479"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Bill", "http_etag": "\"083120bb35acbf4593cfd55fb1d23cb3e113ac15\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047a",
+ "user_id": "0000000000000000000000000000047a"}], "http_etag": "\"5bc8b0e155b75f24fc0c7f9135c4895e41f2e3a9\"",
+ "start": 0, "total_size": 5}'}
+ headers:
+ content-length: ['1228']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/cris@example.com
+ response:
+ body: {string: !!python/unicode '{"created_on": "2005-08-01T07:49:23", "display_name":
+ "Cris", "http_etag": "\"ad735a213419d53c39c79a7fca7946c6336811c1\"", "is_server_owner":
+ false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047b",
+ "user_id": "0000000000000000000000000000047b"}'}
+ headers:
+ content-length: ['276']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047b/addresses
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Cris", "email":
+ "cris@example.com", "http_etag": "\"247e19eb5145b3f481be5d1d675487ee12aaea67\"",
+ "original_email": "cris@example.com", "registered_on": "2005-08-01T07:49:23",
+ "self_link": "http://localhost:9001/3.1/addresses/cris@example.com", "user":
+ "http://localhost:9001/3.1/users/0000000000000000000000000000047b", "verified_on":
+ "2005-08-01T07:49:23"}], "http_etag": "\"7413e23c8c650922ada9d2f96b4570c5e163944c\"",
+ "start": 0, "total_size": 1}'}
+ headers:
+ content-length: ['480']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'email=cris.person%40example.org'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047b/addresses
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ location: ['http://localhost:9001/3.1/addresses/cris.person@example.org']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/addresses/cris.person@example.org
+ response:
+ body: {string: !!python/unicode '{"email": "cris.person@example.org", "http_etag":
+ "\"65697dd3d9809a56914f75bf483507f458eb0317\"", "original_email": "cris.person@example.org",
+ "registered_on": "2005-08-01T07:49:23", "self_link": "http://localhost:9001/3.1/addresses/cris.person@example.org",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}'}
+ headers:
+ content-length: ['334']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047b/addresses
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "cris.person@example.org",
+ "http_etag": "\"65697dd3d9809a56914f75bf483507f458eb0317\"", "original_email":
+ "cris.person@example.org", "registered_on": "2005-08-01T07:49:23", "self_link":
+ "http://localhost:9001/3.1/addresses/cris.person@example.org", "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"},
+ {"display_name": "Cris", "email": "cris@example.com", "http_etag": "\"247e19eb5145b3f481be5d1d675487ee12aaea67\"",
+ "original_email": "cris@example.com", "registered_on": "2005-08-01T07:49:23",
+ "self_link": "http://localhost:9001/3.1/addresses/cris@example.com", "user":
+ "http://localhost:9001/3.1/users/0000000000000000000000000000047b", "verified_on":
+ "2005-08-01T07:49:23"}], "http_etag": "\"da88d5cf19cccb285688428633d1e4ee75e01644\"",
+ "start": 0, "total_size": 2}'}
+ headers:
+ content-length: ['816']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:21 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'password=somepass&display_name=Dana&email=dana%40example.org'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/users
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ location: ['http://localhost:9001/3.1/users/0000000000000000000000000000047c']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047c
+ response:
+ body: {string: !!python/unicode '{"created_on": "2005-08-01T07:49:23", "display_name":
+ "Dana", "http_etag": "\"a3fb0c90554c940c552aa24eeb8451a1c0c52449\"", "is_server_owner":
+ false, "password": "$6$rounds=656000$.q0SmTobhYqCQXAQ$HsRDORbQwHtBH4CKPlP.Y.yiKl5HTwOfvgzfh9CxRKf8TXMEnvhQnzeJAYVW4mzba5jr32xd2o.pgi8yJ.YgM1",
+ "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047c",
+ "user_id": "0000000000000000000000000000047c"}'}
+ headers:
+ content-length: ['412']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'email=dana%40example.org'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047b/addresses
+ response:
+ body: {string: !!python/unicode 'Address belongs to other user'}
+ headers:
+ content-length: ['29']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 400, message: Bad Request}
+- request:
+ body: !!python/unicode 'absorb_existing=1&email=dana%40example.org'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047b/addresses
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ location: ['http://localhost:9001/3.1/addresses/dana@example.org']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047b/addresses
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "cris.person@example.org",
+ "http_etag": "\"65697dd3d9809a56914f75bf483507f458eb0317\"", "original_email":
+ "cris.person@example.org", "registered_on": "2005-08-01T07:49:23", "self_link":
+ "http://localhost:9001/3.1/addresses/cris.person@example.org", "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"},
+ {"display_name": "Cris", "email": "cris@example.com", "http_etag": "\"247e19eb5145b3f481be5d1d675487ee12aaea67\"",
+ "original_email": "cris@example.com", "registered_on": "2005-08-01T07:49:23",
+ "self_link": "http://localhost:9001/3.1/addresses/cris@example.com", "user":
+ "http://localhost:9001/3.1/users/0000000000000000000000000000047b", "verified_on":
+ "2005-08-01T07:49:23"}, {"display_name": "Dana", "email": "dana@example.org",
+ "http_etag": "\"4f5fb9bbf5bf3b208362a666d773265c4abcea42\"", "original_email":
+ "dana@example.org", "registered_on": "2005-08-01T07:49:23", "self_link": "http://localhost:9001/3.1/addresses/dana@example.org",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}],
+ "http_etag": "\"0bd7fd95c0c541cfe7a488ca9a590e64d1c7a0b9\"", "start": 0, "total_size":
+ 3}'}
+ headers:
+ content-length: ['1155']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/addresses/dana@example.org
+ response:
+ body: {string: !!python/unicode '{"display_name": "Dana", "email": "dana@example.org",
+ "http_etag": "\"4f5fb9bbf5bf3b208362a666d773265c4abcea42\"", "original_email":
+ "dana@example.org", "registered_on": "2005-08-01T07:49:23", "self_link": "http://localhost:9001/3.1/addresses/dana@example.org",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}'}
+ headers:
+ content-length: ['337']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/addresses/dana@example.org/verify
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/addresses/dana@example.org
+ response:
+ body: {string: !!python/unicode '{"display_name": "Dana", "email": "dana@example.org",
+ "http_etag": "\"cb67c82f968abf00fc4a1325091b7a3d61692614\"", "original_email":
+ "dana@example.org", "registered_on": "2005-08-01T07:49:23", "self_link": "http://localhost:9001/3.1/addresses/dana@example.org",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b",
+ "verified_on": "2005-08-01T07:49:23"}'}
+ headers:
+ content-length: ['375']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/addresses/dana@example.org/unverify
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/addresses/dana@example.org
+ response:
+ body: {string: !!python/unicode '{"display_name": "Dana", "email": "dana@example.org",
+ "http_etag": "\"4f5fb9bbf5bf3b208362a666d773265c4abcea42\"", "original_email":
+ "dana@example.org", "registered_on": "2005-08-01T07:49:23", "self_link": "http://localhost:9001/3.1/addresses/dana@example.org",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}'}
+ headers:
+ content-length: ['337']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047b/addresses
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "cris.person@example.org",
+ "http_etag": "\"65697dd3d9809a56914f75bf483507f458eb0317\"", "original_email":
+ "cris.person@example.org", "registered_on": "2005-08-01T07:49:23", "self_link":
+ "http://localhost:9001/3.1/addresses/cris.person@example.org", "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"},
+ {"display_name": "Cris", "email": "cris@example.com", "http_etag": "\"247e19eb5145b3f481be5d1d675487ee12aaea67\"",
+ "original_email": "cris@example.com", "registered_on": "2005-08-01T07:49:23",
+ "self_link": "http://localhost:9001/3.1/addresses/cris@example.com", "user":
+ "http://localhost:9001/3.1/users/0000000000000000000000000000047b", "verified_on":
+ "2005-08-01T07:49:23"}, {"display_name": "Dana", "email": "dana@example.org",
+ "http_etag": "\"4f5fb9bbf5bf3b208362a666d773265c4abcea42\"", "original_email":
+ "dana@example.org", "registered_on": "2005-08-01T07:49:23", "self_link": "http://localhost:9001/3.1/addresses/dana@example.org",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"}],
+ "http_etag": "\"0bd7fd95c0c541cfe7a488ca9a590e64d1c7a0b9\"", "start": 0, "total_size":
+ 3}'}
+ headers:
+ content-length: ['1155']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/addresses/dana@example.org
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047b/addresses
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "cris.person@example.org",
+ "http_etag": "\"65697dd3d9809a56914f75bf483507f458eb0317\"", "original_email":
+ "cris.person@example.org", "registered_on": "2005-08-01T07:49:23", "self_link":
+ "http://localhost:9001/3.1/addresses/cris.person@example.org", "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047b"},
+ {"display_name": "Cris", "email": "cris@example.com", "http_etag": "\"247e19eb5145b3f481be5d1d675487ee12aaea67\"",
+ "original_email": "cris@example.com", "registered_on": "2005-08-01T07:49:23",
+ "self_link": "http://localhost:9001/3.1/addresses/cris@example.com", "user":
+ "http://localhost:9001/3.1/users/0000000000000000000000000000047b", "verified_on":
+ "2005-08-01T07:49:23"}], "http_etag": "\"da88d5cf19cccb285688428633d1e4ee75e01644\"",
+ "start": 0, "total_size": 2}'}
+ headers:
+ content-length: ['816']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'password=somepass&display_name=Ler&email=ler%40primus.org'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/users
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ location: ['http://localhost:9001/3.1/users/0000000000000000000000000000047d']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047d
+ response:
+ body: {string: !!python/unicode '{"created_on": "2005-08-01T07:49:23", "display_name":
+ "Ler", "http_etag": "\"ced9c4bc8ad3e11fbb83bc610e7d6f6e4f60ce50\"", "is_server_owner":
+ false, "password": "$6$rounds=656000$hIACt25Q0lqJEkyI$gUtd5aJu0QIpoaWPW./vkAEyibdoLYfN3WjA5yQf8rqDsHHfoOs0f368sKXLOi2TDVFu7FiMaSRd7MySY3PIk0",
+ "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047d",
+ "user_id": "0000000000000000000000000000047d"}'}
+ headers:
+ content-length: ['411']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/ler@primus.org
+ response:
+ body: {string: !!python/unicode '{"created_on": "2005-08-01T07:49:23", "display_name":
+ "Ler", "http_etag": "\"ced9c4bc8ad3e11fbb83bc610e7d6f6e4f60ce50\"", "is_server_owner":
+ false, "password": "$6$rounds=656000$hIACt25Q0lqJEkyI$gUtd5aJu0QIpoaWPW./vkAEyibdoLYfN3WjA5yQf8rqDsHHfoOs0f368sKXLOi2TDVFu7FiMaSRd7MySY3PIk0",
+ "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047d",
+ "user_id": "0000000000000000000000000000047d"}'}
+ headers:
+ content-length: ['411']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'display_name=Sir+Ler'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'PATCH'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047d
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/ler@primus.org
+ response:
+ body: {string: !!python/unicode '{"created_on": "2005-08-01T07:49:23", "display_name":
+ "Sir Ler", "http_etag": "\"65ae00a4bcf2029fcaf7b8079a0352684b27dbc6\"", "is_server_owner":
+ false, "password": "$6$rounds=656000$hIACt25Q0lqJEkyI$gUtd5aJu0QIpoaWPW./vkAEyibdoLYfN3WjA5yQf8rqDsHHfoOs0f368sKXLOi2TDVFu7FiMaSRd7MySY3PIk0",
+ "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047d",
+ "user_id": "0000000000000000000000000000047d"}'}
+ headers:
+ content-length: ['415']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'cleartext_password=easy'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'PATCH'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047d
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047d
+ response:
+ body: {string: !!python/unicode '{"created_on": "2005-08-01T07:49:23", "display_name":
+ "Sir Ler", "http_etag": "\"50447df82c18d9a1797764a18962585ffff81eca\"", "is_server_owner":
+ false, "password": "$6$rounds=656000$vxCVBA6LZfVsFYGH$qegjTOweTyGZMzwnTJe3KeczIzn2QFGAHQjJBsRHIp0Sb9HKZIU1.lPO7EZ/ptZHCLeBjULzEVTHmOvGhP6d..",
+ "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047d",
+ "user_id": "0000000000000000000000000000047d"}'}
+ headers:
+ content-length: ['415']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/bill@example.com
+ response:
+ body: {string: !!python/unicode '{"created_on": "2005-08-01T07:49:23", "display_name":
+ "Bill", "http_etag": "\"083120bb35acbf4593cfd55fb1d23cb3e113ac15\"", "is_server_owner":
+ false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047a",
+ "user_id": "0000000000000000000000000000047a"}'}
+ headers:
+ content-length: ['276']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047a/addresses
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "Bill", "email":
+ "bill@example.com", "http_etag": "\"3b37cc20851888148b0390a4dafffc7455bbbf16\"",
+ "original_email": "bill@example.com", "registered_on": "2005-08-01T07:49:23",
+ "self_link": "http://localhost:9001/3.1/addresses/bill@example.com", "user":
+ "http://localhost:9001/3.1/users/0000000000000000000000000000047a", "verified_on":
+ "2005-08-01T07:49:23"}], "http_etag": "\"6c7ebfef2165f914e5015ead4e6c3d5aebb18443\"",
+ "start": 0, "total_size": 1}'}
+ headers:
+ content-length: ['480']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscriber=bill%40example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members/find
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/bill@example.com",
+ "delivery_mode": "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"}],
+ "http_etag": "\"9a0085970b8b55d4af14264b825b98891a3a7ce1\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['549']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/config
+ response:
+ body: {string: !!python/unicode '{"acceptable_aliases": [], "admin_immed_notify":
+ true, "admin_notify_mchanges": false, "administrivia": true, "advertised":
+ false, "allow_list_posts": true, "anonymous_list": false, "archive_policy":
+ "public", "autorespond_owner": "none", "autorespond_postings": "none", "autorespond_requests":
+ "none", "autoresponse_grace_period": "90d", "autoresponse_owner_text": "",
+ "autoresponse_postings_text": "", "autoresponse_request_text": "", "bounces_address":
+ "test-1-bounces@example.com", "collapse_alternatives": true, "convert_html_to_plaintext":
+ false, "created_at": "2005-08-01T07:49:23", "default_member_action": "defer",
+ "default_nonmember_action": "hold", "description": "", "digest_last_sent_at":
+ null, "digest_send_periodic": true, "digest_size_threshold": 30.0, "digest_volume_frequency":
+ "monthly", "digests_enabled": true, "display_name": "Test-1", "dmarc_mitigate_action":
+ "no_mitigation", "dmarc_mitigate_unconditionally": false, "dmarc_moderation_notice":
+ "", "dmarc_wrapped_message_text": "", "filter_content": false, "first_strip_reply_to":
+ false, "fqdn_listname": "test-1@example.com", "http_etag": "\"fb430080d986cc221e2d083d6ae27c18e7d3e32b\"",
+ "include_rfc2369_headers": true, "info": "", "join_address": "test-1-join@example.com",
+ "last_post_at": null, "leave_address": "test-1-leave@example.com", "list_name":
+ "test-1", "mail_host": "example.com", "moderator_password": null, "next_digest_number":
+ 1, "no_reply_address": "noreply@example.com", "owner_address": "test-1-owner@example.com",
+ "post_id": 1, "posting_address": "test-1@example.com", "posting_pipeline":
+ "default-posting-pipeline", "reply_goes_to_list": "no_munging", "reply_to_address":
+ "", "request_address": "test-1-request@example.com", "send_welcome_message":
+ true, "subject_prefix": "[Test-1] ", "subscription_policy": "confirm", "volume":
+ 1}'}
+ headers:
+ content-length: ['1828']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'display_name=Test+Numero+Uno&description=A+very+meaningful+description.'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'PATCH'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/config
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/config
+ response:
+ body: {string: !!python/unicode '{"acceptable_aliases": [], "admin_immed_notify":
+ true, "admin_notify_mchanges": false, "administrivia": true, "advertised":
+ false, "allow_list_posts": true, "anonymous_list": false, "archive_policy":
+ "public", "autorespond_owner": "none", "autorespond_postings": "none", "autorespond_requests":
+ "none", "autoresponse_grace_period": "90d", "autoresponse_owner_text": "",
+ "autoresponse_postings_text": "", "autoresponse_request_text": "", "bounces_address":
+ "test-1-bounces@example.com", "collapse_alternatives": true, "convert_html_to_plaintext":
+ false, "created_at": "2005-08-01T07:49:23", "default_member_action": "defer",
+ "default_nonmember_action": "hold", "description": "A very meaningful description.",
+ "digest_last_sent_at": null, "digest_send_periodic": true, "digest_size_threshold":
+ 30.0, "digest_volume_frequency": "monthly", "digests_enabled": true, "display_name":
+ "Test Numero Uno", "dmarc_mitigate_action": "no_mitigation", "dmarc_mitigate_unconditionally":
+ false, "dmarc_moderation_notice": "", "dmarc_wrapped_message_text": "", "filter_content":
+ false, "first_strip_reply_to": false, "fqdn_listname": "test-1@example.com",
+ "http_etag": "\"498db45cc6310075559ec503668fe78300660306\"", "include_rfc2369_headers":
+ true, "info": "", "join_address": "test-1-join@example.com", "last_post_at":
+ null, "leave_address": "test-1-leave@example.com", "list_name": "test-1",
+ "mail_host": "example.com", "moderator_password": null, "next_digest_number":
+ 1, "no_reply_address": "noreply@example.com", "owner_address": "test-1-owner@example.com",
+ "post_id": 1, "posting_address": "test-1@example.com", "posting_pipeline":
+ "default-posting-pipeline", "reply_goes_to_list": "no_munging", "reply_to_address":
+ "", "request_address": "test-1-request@example.com", "send_welcome_message":
+ true, "subject_prefix": "[Test-1] ", "subscription_policy": "confirm", "volume":
+ 1}'}
+ headers:
+ content-length: ['1867']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/system/preferences
+ response:
+ body: {string: !!python/unicode '{"acknowledge_posts": false, "delivery_mode":
+ "regular", "delivery_status": "enabled", "hide_address": true, "http_etag":
+ "\"2bf3b0a394f164ec02c6bdc0147db6323c2261de\"", "preferred_language": "en",
+ "receive_list_copy": true, "receive_own_postings": true, "self_link": "http://localhost:9001/3.1/system/preferences"}'}
+ headers:
+ content-length: ['315']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:22 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-2.example.com/member/anna@example.com
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/anna@example.com",
+ "delivery_mode": "regular", "email": "anna@example.com", "http_etag": "\"a2f87859154c808a8911db829df672878daabf0d\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000340",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000340",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"}'}
+ headers:
+ content-length: ['444']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members/00000000000000000000000000000340/preferences
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"87f2006c6f2726e82bacf527ac7f7300a0f2a0bf\"",
+ "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000340/preferences"}'}
+ headers:
+ content-length: ['156']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'delivery_status=by_user'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'PATCH'
+ uri: http://localhost:9001/3.1/members/00000000000000000000000000000340/preferences
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-2.example.com/member/anna@example.com
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/anna@example.com",
+ "delivery_mode": "regular", "email": "anna@example.com", "http_etag": "\"a2f87859154c808a8911db829df672878daabf0d\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000340",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000340",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"}'}
+ headers:
+ content-length: ['444']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members/00000000000000000000000000000340/preferences
+ response:
+ body: {string: !!python/unicode '{"delivery_status": "by_user", "http_etag": "\"e9ae5aca448b59e7e006530aa483b46fd0a07bdd\"",
+ "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000340/preferences"}'}
+ headers:
+ content-length: ['186']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/system/pipelines
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"ff8a7af97caf24e6ca24c5baed447ff532bd1b4f\"",
+ "pipelines": ["default-owner-pipeline", "default-posting-pipeline", "virgin"]}'}
+ headers:
+ content-length: ['140']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/system/chains
+ response:
+ body: {string: !!python/unicode '{"chains": ["accept", "default-owner-chain",
+ "default-posting-chain", "discard", "header-match", "hold", "moderation",
+ "reject"], "http_etag": "\"48472ee39093b9bf8cc151ba77aca22926feda66\""}'}
+ headers:
+ content-length: ['190']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/roster/owner
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/roster/moderator
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscriber=foo%40example.com&role=owner&list_id=test-1.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ location: ['http://localhost:9001/3.1/members/00000000000000000000000000000342']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/roster/owner
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/foo@example.com",
+ "delivery_mode": "regular", "email": "foo@example.com", "http_etag": "\"f0f2d1729e0ec12cc957dcb1f2ba3e520f21bb67\"",
+ "list_id": "test-1.example.com", "member_id": "00000000000000000000000000000342",
+ "moderation_action": "accept", "role": "owner", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000342",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047e"}],
+ "http_etag": "\"2fecf282b01325c7b95d131f1aaeb9a1b0f959b9\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['577']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/roster/member
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/bill@example.com",
+ "delivery_mode": "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"}],
+ "http_etag": "\"9a0085970b8b55d4af14264b825b98891a3a7ce1\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['549']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscriber=bar%40example.com&role=moderator&list_id=test-1.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ location: ['http://localhost:9001/3.1/members/00000000000000000000000000000343']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/roster/moderator
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/bar@example.com",
+ "delivery_mode": "regular", "email": "bar@example.com", "http_etag": "\"518a1edc92bec3434bdbb49cdce3fab8204d5532\"",
+ "list_id": "test-1.example.com", "member_id": "00000000000000000000000000000343",
+ "moderation_action": "accept", "role": "moderator", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000343",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047f"}],
+ "http_etag": "\"8854c5df1d7447cfdab3d5cbd0db3cc6f80ddf71\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['581']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/roster/member
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/bill@example.com",
+ "delivery_mode": "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"}],
+ "http_etag": "\"9a0085970b8b55d4af14264b825b98891a3a7ce1\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['549']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscriber=bar%40example.com&pre_confirmed=True&pre_verified=True&display_name=Bar&list_id=test-1.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ location: ['http://localhost:9001/3.1/members/00000000000000000000000000000344']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members/00000000000000000000000000000344
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/bar@example.com",
+ "delivery_mode": "regular", "email": "bar@example.com", "http_etag": "\"f2e893024bf515ce2b66cde4a19568823a0189cc\"",
+ "list_id": "test-1.example.com", "member_id": "00000000000000000000000000000344",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000344",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047f"}'}
+ headers:
+ content-length: ['442']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode '{"entries": [{"address": "http://localhost:9001/3.1/addresses/foo@example.com",
+ "delivery_mode": "regular", "email": "foo@example.com", "http_etag": "\"f0f2d1729e0ec12cc957dcb1f2ba3e520f21bb67\"",
+ "list_id": "test-1.example.com", "member_id": "00000000000000000000000000000342",
+ "moderation_action": "accept", "role": "owner", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000342",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047e"},
+ {"address": "http://localhost:9001/3.1/addresses/bar@example.com", "delivery_mode":
+ "regular", "email": "bar@example.com", "http_etag": "\"518a1edc92bec3434bdbb49cdce3fab8204d5532\"",
+ "list_id": "test-1.example.com", "member_id": "00000000000000000000000000000343",
+ "moderation_action": "accept", "role": "moderator", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000343",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047f"},
+ {"address": "http://localhost:9001/3.1/addresses/bar@example.com", "delivery_mode":
+ "regular", "email": "bar@example.com", "http_etag": "\"f2e893024bf515ce2b66cde4a19568823a0189cc\"",
+ "list_id": "test-1.example.com", "member_id": "00000000000000000000000000000344",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000344",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047f"},
+ {"address": "http://localhost:9001/3.1/addresses/bill@example.com", "delivery_mode":
+ "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"},
+ {"address": "http://localhost:9001/3.1/addresses/anna@example.com", "delivery_mode":
+ "regular", "email": "anna@example.com", "http_etag": "\"a2f87859154c808a8911db829df672878daabf0d\"",
+ "list_id": "test-2.example.com", "member_id": "00000000000000000000000000000340",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/00000000000000000000000000000340",
+ "user": "http://localhost:9001/3.1/users/00000000000000000000000000000479"}],
+ "http_etag": "\"ad1deacbc1c6c4be2c95bceece451ef9e0c52387\"", "start": 0, "total_size":
+ 5}'}
+ headers:
+ content-length: ['2391']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/owner/foo@example.com
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/roster/owner
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'fqdn_listname=confirm-first%40example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ location: ['http://localhost:9001/3.1/lists/confirm-first.example.com']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first.example.com
+ response:
+ body: {string: !!python/unicode '{"display_name": "Confirm-first", "fqdn_listname":
+ "confirm-first@example.com", "http_etag": "\"c45f8c0a7609b62ca5c7cfda30c2e3d39f11cca6\"",
+ "list_id": "confirm-first.example.com", "list_name": "confirm-first", "mail_host":
+ "example.com", "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/confirm-first.example.com",
+ "volume": 1}'}
+ headers:
+ content-length: ['344']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/config
+ response:
+ body: {string: !!python/unicode '{"acceptable_aliases": [], "admin_immed_notify":
+ true, "admin_notify_mchanges": false, "administrivia": true, "advertised":
+ true, "allow_list_posts": true, "anonymous_list": false, "archive_policy":
+ "public", "autorespond_owner": "none", "autorespond_postings": "none", "autorespond_requests":
+ "none", "autoresponse_grace_period": "90d", "autoresponse_owner_text": "",
+ "autoresponse_postings_text": "", "autoresponse_request_text": "", "bounces_address":
+ "confirm-first-bounces@example.com", "collapse_alternatives": true, "convert_html_to_plaintext":
+ false, "created_at": "2005-08-01T07:49:23", "default_member_action": "defer",
+ "default_nonmember_action": "hold", "description": "", "digest_last_sent_at":
+ null, "digest_send_periodic": true, "digest_size_threshold": 30.0, "digest_volume_frequency":
+ "monthly", "digests_enabled": true, "display_name": "Confirm-first", "dmarc_mitigate_action":
+ "no_mitigation", "dmarc_mitigate_unconditionally": false, "dmarc_moderation_notice":
+ "", "dmarc_wrapped_message_text": "", "filter_content": false, "first_strip_reply_to":
+ false, "fqdn_listname": "confirm-first@example.com", "http_etag": "\"91ae097703ed5d6c5f16f16bf8347a8bc1f66f96\"",
+ "include_rfc2369_headers": true, "info": "", "join_address": "confirm-first-join@example.com",
+ "last_post_at": null, "leave_address": "confirm-first-leave@example.com",
+ "list_name": "confirm-first", "mail_host": "example.com", "moderator_password":
+ null, "next_digest_number": 1, "no_reply_address": "noreply@example.com",
+ "owner_address": "confirm-first-owner@example.com", "post_id": 1, "posting_address":
+ "confirm-first@example.com", "posting_pipeline": "default-posting-pipeline",
+ "reply_goes_to_list": "no_munging", "reply_to_address": "", "request_address":
+ "confirm-first-request@example.com", "send_welcome_message": true, "subject_prefix":
+ "[Confirm-first] ", "subscription_policy": "confirm", "volume": 1}'}
+ headers:
+ content-length: ['1897']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscription_policy=moderate'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'PATCH'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/config
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first.example.com
+ response:
+ body: {string: !!python/unicode '{"display_name": "Confirm-first", "fqdn_listname":
+ "confirm-first@example.com", "http_etag": "\"c45f8c0a7609b62ca5c7cfda30c2e3d39f11cca6\"",
+ "list_id": "confirm-first.example.com", "list_name": "confirm-first", "mail_host":
+ "example.com", "member_count": 0, "self_link": "http://localhost:9001/3.1/lists/confirm-first.example.com",
+ "volume": 1}'}
+ headers:
+ content-length: ['344']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/config
+ response:
+ body: {string: !!python/unicode '{"acceptable_aliases": [], "admin_immed_notify":
+ true, "admin_notify_mchanges": false, "administrivia": true, "advertised":
+ true, "allow_list_posts": true, "anonymous_list": false, "archive_policy":
+ "public", "autorespond_owner": "none", "autorespond_postings": "none", "autorespond_requests":
+ "none", "autoresponse_grace_period": "90d", "autoresponse_owner_text": "",
+ "autoresponse_postings_text": "", "autoresponse_request_text": "", "bounces_address":
+ "confirm-first-bounces@example.com", "collapse_alternatives": true, "convert_html_to_plaintext":
+ false, "created_at": "2005-08-01T07:49:23", "default_member_action": "defer",
+ "default_nonmember_action": "hold", "description": "", "digest_last_sent_at":
+ null, "digest_send_periodic": true, "digest_size_threshold": 30.0, "digest_volume_frequency":
+ "monthly", "digests_enabled": true, "display_name": "Confirm-first", "dmarc_mitigate_action":
+ "no_mitigation", "dmarc_mitigate_unconditionally": false, "dmarc_moderation_notice":
+ "", "dmarc_wrapped_message_text": "", "filter_content": false, "first_strip_reply_to":
+ false, "fqdn_listname": "confirm-first@example.com", "http_etag": "\"497dd87a429913344143941fcabbc597591b647e\"",
+ "include_rfc2369_headers": true, "info": "", "join_address": "confirm-first-join@example.com",
+ "last_post_at": null, "leave_address": "confirm-first-leave@example.com",
+ "list_name": "confirm-first", "mail_host": "example.com", "moderator_password":
+ null, "next_digest_number": 1, "no_reply_address": "noreply@example.com",
+ "owner_address": "confirm-first-owner@example.com", "post_id": 1, "posting_address":
+ "confirm-first@example.com", "posting_pipeline": "default-posting-pipeline",
+ "reply_goes_to_list": "no_munging", "reply_to_address": "", "request_address":
+ "confirm-first-request@example.com", "send_welcome_message": true, "subject_prefix":
+ "[Confirm-first] ", "subscription_policy": "moderate", "volume": 1}'}
+ headers:
+ content-length: ['1898']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/requests
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscriber=groucho%40example.com&pre_confirmed=True&pre_verified=True&display_name=None&list_id=confirm-first.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"16703b46c6b82226a19d9a1c36ec4d52993bb351\"",
+ "token": "0000000000000000000000000000000000000649", "token_owner": "moderator"}'}
+ headers:
+ content-length: ['142']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:23 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 202, message: Accepted}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/requests
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "None", "email":
+ "groucho@example.com", "http_etag": "\"d4d20c4396b45dc7e0f7a5a4a143922c78cd8287\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000649",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"}],
+ "http_etag": "\"8cbfa9bc57e8d6b435c717ddffedefd0bbceca7c\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['398']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/requests
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "None", "email":
+ "groucho@example.com", "http_etag": "\"d4d20c4396b45dc7e0f7a5a4a143922c78cd8287\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000649",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"}],
+ "http_etag": "\"8cbfa9bc57e8d6b435c717ddffedefd0bbceca7c\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['398']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'subscriber=harpo%40example.com&pre_confirmed=True&pre_verified=True&display_name=None&list_id=confirm-first.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"bc8475dbe8435011af6350dd6f3dd632232bc24d\"",
+ "token": "0000000000000000000000000000000000000650", "token_owner": "moderator"}'}
+ headers:
+ content-length: ['142']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 202, message: Accepted}
+- request:
+ body: !!python/unicode 'subscriber=zeppo%40example.com&pre_confirmed=True&pre_verified=True&display_name=None&list_id=confirm-first.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/members
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"bdbb340c8f10c044355159209e2172834cc1f237\"",
+ "token": "0000000000000000000000000000000000000651", "token_owner": "moderator"}'}
+ headers:
+ content-length: ['142']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 202, message: Accepted}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/requests
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "None", "email":
+ "groucho@example.com", "http_etag": "\"d4d20c4396b45dc7e0f7a5a4a143922c78cd8287\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000649",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"},
+ {"display_name": "None", "email": "harpo@example.com", "http_etag": "\"588cf8fd7dbe9cd7df26156ca5b5377e3fa66998\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000650",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"},
+ {"display_name": "None", "email": "zeppo@example.com", "http_etag": "\"d54db4427ac4e5886eb4bcaf1693940a58dfd76c\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000651",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"}],
+ "http_etag": "\"9228b740e212ce4e29e0c52ec654dd6a4027009e\"", "start": 0, "total_size":
+ 3}'}
+ headers:
+ content-length: ['984']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'action=accept'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists/confirm-first.example.com/requests/0000000000000000000000000000000000000649
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/requests
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "None", "email":
+ "harpo@example.com", "http_etag": "\"588cf8fd7dbe9cd7df26156ca5b5377e3fa66998\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000650",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"},
+ {"display_name": "None", "email": "zeppo@example.com", "http_etag": "\"d54db4427ac4e5886eb4bcaf1693940a58dfd76c\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000651",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"}],
+ "http_etag": "\"9510abf3887fe68b3f5b72441552dfd6b35ba809\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['689']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/requests
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "None", "email":
+ "harpo@example.com", "http_etag": "\"588cf8fd7dbe9cd7df26156ca5b5377e3fa66998\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000650",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"},
+ {"display_name": "None", "email": "zeppo@example.com", "http_etag": "\"d54db4427ac4e5886eb4bcaf1693940a58dfd76c\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000651",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"}],
+ "http_etag": "\"9510abf3887fe68b3f5b72441552dfd6b35ba809\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['689']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/requests
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "None", "email":
+ "harpo@example.com", "http_etag": "\"588cf8fd7dbe9cd7df26156ca5b5377e3fa66998\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000650",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"},
+ {"display_name": "None", "email": "zeppo@example.com", "http_etag": "\"d54db4427ac4e5886eb4bcaf1693940a58dfd76c\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000651",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"}],
+ "http_etag": "\"9510abf3887fe68b3f5b72441552dfd6b35ba809\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['689']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'action=reject'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists/confirm-first.example.com/requests/0000000000000000000000000000000000000650
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/requests
+ response:
+ body: {string: !!python/unicode '{"entries": [{"display_name": "None", "email":
+ "zeppo@example.com", "http_etag": "\"d54db4427ac4e5886eb4bcaf1693940a58dfd76c\"",
+ "list_id": "confirm-first.example.com", "token": "0000000000000000000000000000000000000651",
+ "token_owner": "moderator", "type": "subscription", "when": "2005-08-01T07:49:23"}],
+ "http_etag": "\"67d6626e8675d0e5dbf751bbc82bdda9563f4d23\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['396']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:28 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'action=discard'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists/confirm-first.example.com/requests/0000000000000000000000000000000000000651
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/confirm-first@example.com/requests
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/queues
+ response:
+ body: {string: !!python/unicode '{"entries": [{"count": 0, "directory": "/home/maxking/Documents/mm3/core/var/queue/archive",
+ "files": [], "http_etag": "\"8509f9f7575e2b39f10303d70170b83d942cf2ee\"",
+ "name": "archive", "self_link": "http://localhost:9001/3.1/queues/archive"},
+ {"count": 0, "directory": "/home/maxking/Documents/mm3/core/var/queue/bad",
+ "files": [], "http_etag": "\"1bc1bf804dd5db6b552b4ab330c8bef429747430\"",
+ "name": "bad", "self_link": "http://localhost:9001/3.1/queues/bad"}, {"count":
+ 0, "directory": "/home/maxking/Documents/mm3/core/var/queue/bounces", "files":
+ [], "http_etag": "\"530a1fe0c2a0a4fafb9b0b1c274ff9876c531a8a\"", "name": "bounces",
+ "self_link": "http://localhost:9001/3.1/queues/bounces"}, {"count": 0, "directory":
+ "/home/maxking/Documents/mm3/core/var/queue/command", "files": [], "http_etag":
+ "\"acad9d2bc30494e9d31d1d7f63b92602ab62bd36\"", "name": "command", "self_link":
+ "http://localhost:9001/3.1/queues/command"}, {"count": 0, "directory": "/home/maxking/Documents/mm3/core/var/queue/digest",
+ "files": [], "http_etag": "\"f195b92715d20d178e35136b16c849d52e7d2908\"",
+ "name": "digest", "self_link": "http://localhost:9001/3.1/queues/digest"},
+ {"count": 0, "directory": "/home/maxking/Documents/mm3/core/var/queue/in",
+ "files": [], "http_etag": "\"8a3a2468b5f526624f1893b85fe30a1a9d10179c\"",
+ "name": "in", "self_link": "http://localhost:9001/3.1/queues/in"}, {"count":
+ 0, "directory": "/home/maxking/Documents/mm3/core/var/queue/nntp", "files":
+ [], "http_etag": "\"9f2221ff691dc85b9778ed39d27c4829c11a01b2\"", "name": "nntp",
+ "self_link": "http://localhost:9001/3.1/queues/nntp"}, {"count": 3, "directory":
+ "/home/maxking/Documents/mm3/core/var/queue/out", "files": ["1497761008.9138193+fd8b401544b079e9cf518940e8ee4ff08c4c1921",
+ "1497761008.923455+0289c12d0567398735a8c92f9ed0cca8ea18cbba", "1497761008.9335907+61aa5136439831b7ff07e8c4918a3a3cc6c586fe"],
+ "http_etag": "\"013aac8dc4f61551883f806f6c316fa723c370c7\"", "name": "out",
+ "self_link": "http://localhost:9001/3.1/queues/out"}, {"count": 0, "directory":
+ "/home/maxking/Documents/mm3/core/var/queue/pipeline", "files": [], "http_etag":
+ "\"6275cf40af81c3f8610de0bf74e52db6452871dc\"", "name": "pipeline", "self_link":
+ "http://localhost:9001/3.1/queues/pipeline"}, {"count": 8, "directory": "/home/maxking/Documents/mm3/core/var/queue/retry",
+ "files": ["1497761000.5213077+fdad52119bb11d37af83feb59c6cecee6df46a47", "1497761000.5315669+286bb7e1cc5bbb8e534b1175df40a3895715b5ca",
+ "1497761000.5417008+d5af797b772955fb6296b31ebadecfc206656cbc", "1497761000.551105+b5db3d4815fbdede6fdacc34918b8a65ae72916a",
+ "1497761000.5610843+974c4d8d682998c5b7c52234a75e1e7b1bc9f15e", "1497761000.571449+906cc2c254bffd81c91fd8590318124c68c7039e",
+ "1497761004.5943239+c691b6a34893582d51d88dca70f104556f3a2c75", "1497761004.6104813+ad73f9b1b2357662ec441afeddfa7360d9e4ba76"],
+ "http_etag": "\"84f03ac4a06199819dc010feda0cc1f8712e7d2a\"", "name": "retry",
+ "self_link": "http://localhost:9001/3.1/queues/retry"}, {"count": 1584, "directory":
+ "/home/maxking/Documents/mm3/core/var/queue/shunt", "files": ["1495480791.5727017+a944c9d883c225b2ed235a011fb8b33b32666d53",
+ "1495480791.5854533+9e9c427e2895126db02c4fc65eb077d88b22a6f6", "1495480791.598509+38e7565df2987dfb74b2a0be31a53d98ce75a21e",
+ "1495480791.6116967+fd7540b6c4960aa25f3aaf125c80925c6d764b07", "1495480791.624832+5806d9188e79476564c46a9a79b70a4011283943",
+ "1495480791.6376092+eb5caaf8adebd666003e1d780e4303bd568b1286", "1495480791.6515718+9b7ef1a754e35eaf238bcbda9dcf593b2e1089f3",
+ "1495480791.6637232+9af1a98c356da86430e5eb28eb6295f17a1f15f5", "1495480791.678168+7174b5ab49595012da301f1452d6cce59d8b14e6",
+ "1495480791.6901982+7526909813001ff9af689209218790fb20a67c0c", "1495480791.708966+86402fc47ad91507b8aa567b43f9d15240697a30",
+ "1495480791.727804+db2cfcae7102d56396c38a59f3c213c4fd52d07a", "1495480791.7409475+af6635d13913bb8c840f286b634f8b4c88cec4f3",
+ "1495480791.7542264+14f352b9d9198704b8becc50e6a94216aa830817", "1495480945.393748+8634d01325b8e33482a981ab38372a85ed71cc21",
+ "1495480945.4068422+f82f223402e60ad6aca70f3f5dd6e420b956e89b", "1495480945.4200387+0eb779079e5205ab77e654b321c219958f7aa52a",
+ "1495480945.4313538+de0c7d722fd386ba5d41d161e1d2dc55ae3ef549", "1495480945.4428613+d65ad4cf7c2f3d47d9c5506615681598710b50b2",
+ "1495480945.4555597+804fe80f47635410bc239726a8e610ba708b2e6c", "1495480945.4688709+6e0c30a5f7f713a0d6ef909139ada2a51c51e25c",
+ "1495480945.4801698+716a3072ec4aa18b2aca70cbad48ecc192156996", "1495480945.492385+da20423a4203333ab9e41f417fbe4a7e2a7516c3",
+ "1495480945.503693+0dcbcfedc76e81abfa5caf2fe25083c5072c041f", "1495480945.5151846+cd50c55efb1a2f1854bdcda3da2736533ce2981c",
+ "1495480945.5270321+267f89c028383e675232c8b9a8e9926e6139e0af", "1495480945.5387208+2d10be1bd70dc847f18304697e357b8cf551b305",
+ "1495480945.550177+90d3622483f4b48abcb4a27b4c8e7e474d3fdf8f", "1495481937.792101+ba9c2d3131c3f3f33b688fabdff4a11e463b963c",
+ "1495481937.8038895+2cb27be8a9a7860496615a11e51969f5cf0f7033", "1495481937.8183813+2478478440292c7f26f604417bd5548a6f98a01b",
+ "1495481937.8303344+5a340c5de5ad8ef510716bdc3368634ef78840aa", "1495481937.842179+a622be4492bbc55715ac38cebb723672f8e01323",
+ "1495481937.853717+e9e86d339aca315019e69b97b8534aa36086320b", "1495481937.8655236+aa02c7ce2390667f5e8d609c600feadef3afd7b3",
+ "1495481937.883323+02595df8709ac768f7685fa22e8be86dc94a97a9", "1495481937.9052248+ebfec01b0759a857d582e914f40297821dd14d0e",
+ "1495481937.918258+0ef4c2e1f3420ef264346e3ec85b5d6debc6b46c", "1495481937.9309113+9093ccd4d6d8877fd3aac58e9cdfa141845c6e7c",
+ "1495481937.9431102+8c84dc84e1b49c15a3040abba66b2448e794276c", "1495481937.9551723+0c3479af20c4d0fb67996935467a4b427ff2d5a7",
+ "1495481937.9666467+be2808f75130e36ceb5d280a27f62120bc7d2329", "1495485652.0594335+b71048c4239c174e4154b76448c219a16e1a39c7",
+ "1495485652.0730445+2c223bcdb6a8e9144ec5adda4d0dcdaa55f26da9", "1495485652.0865064+578c7f2c36c504a7e3a51a762ee0f0cba4c8f0bb",
+ "1495485652.1013+0077622a4662fc2ee71c5d7a73219816ccc9f481", "1495485652.1128547+ae71ce5ed50a00017d3189c41a2caa74df29a66a",
+ "1495485652.1249332+4812cf12bb355e51188a9567857efb72a5c398c6", "1495485652.1395776+5eacd8ad7ac0a5834ee00b2d8350b321f90ffda8",
+ "1495485652.1530125+6eb9eed6729c3149a4db8abebfbf4b1f3d064e97", "1495485652.1728072+ca432ea4ad60b93dec4c54192020156076bf0330",
+ "1495485652.1911995+58af4ad20f881501ea68eb8c90e5299532c3c904", "1495485652.2405827+7421e995a06ca37aafd4ededa06387ae7daa15ae",
+ "1495485652.2531264+b0da95adc651c347e575fd8c10fc123fb7534ac4", "1495485652.2652106+0a311324edbb4665ea0452fa6489b9656abb9f11",
+ "1495485652.280184+ef05af7f6ef11978859948d741a3bfe87a39475f", "1495486123.9388878+db2502abb4501f97baede88b8ded8d509c20222a",
+ "1495486123.958237+6031e1b5dfc3f5c88b0dd8f0fbd8a15f7eec7eac", "1495486123.97841+e315a13f92d4b76926ffe2da1803e60a87d16f32",
+ "1495486123.9951215+a6e33cb48e684e0350ad17b8a8b3fe7316b55ded", "1495486124.0119328+52a63d954811a4282d39831503a4a379436eb45b",
+ "1495486124.0283685+ecd78d8af51c7cd23a268784ada7ebf97bb54bf0", "1495486124.044973+b46714ba60fc700261be786112ec124726bbac00",
+ "1495486124.060903+adab95080aa39708d63f5bd949bbf40483e99674", "1495486124.0781732+2b868a5ae5e7996724a6a7ebaa447bd5ade4ca41",
+ "1495486124.0937157+783f827ee05678fa0170fad365da70a4106ca3f9", "1495486124.1095634+1bea1ac27a37be7bfec78ed2f0ce89e6af23c0e4",
+ "1495486124.121828+34eda166f56344a8bd27c13db3435c7a6bb12ec3", "1495486124.1336398+9550989cda81c639177dd9199086accbbd642476",
+ "1495486124.1457965+4f004f2f2be281d04c3ccc53ae387acac5156bba", "1495486236.1431885+47ab53a8aad58299d6275adf107296b53a852af6",
+ "1495486236.1568933+7900152bd5cb29f66e282fc9cd3d1a7bbb347e76", "1495486236.1686575+c543f1534693529c05cba35433d44ed508c6cf7f",
+ "1495486236.1802497+e68fedcaace6c6ac7780ed5a97c9fc3fc29ed3df", "1495486236.1922228+8ee543d8278bf350127ef6676aa77761b39da20c",
+ "1495486236.2040224+5c04d82d7409e555b7f559a53b35281d6297c0f3", "1495486236.2155025+881c4ce6c081ff0303d1d14ac407358923c91f60",
+ "1495486236.2272475+af3b75edab1d07690a2b99fd8d135a34b5f1017b", "1495486236.2397182+c3e041f5ae4436a7630e6bb6cb4161f0b63949ee",
+ "1495486236.2510571+05a3894a6f63c5b72affeccc847b8dd091c73dd6", "1495486236.263168+102718f64baec74ca84b38c058e4d801fc7d5748",
+ "1495486236.2750776+43a84960271c654d636a732f7f77a304ce5a0815", "1495486236.2866135+1594953e030b34f36c83d25d200edc50deba7b7b",
+ "1495486236.3022742+48b8f3ca0cdb003c60327edb6d665ac4a12d6ea4", "1495486316.0485148+b2c16b7c80d7ca8191c691f4481aec7142289ab1",
+ "1495486316.0619535+b6f3412af0e23e0c1927e48f2434076c735734d9", "1495486316.07512+468adecc94ea2868e475f1b1cad393d29a92fac9",
+ "1495486316.088575+7e8d4ecf1e3cbaa1437abcf0d137d4454e9bbcc9", "1495486316.1006324+908997f56e955b4a6ee06232804376570609ab93",
+ "1495486316.1127627+ee4e5b32925c6759c14c0068c1ab6348e5b4d0f3", "1495486316.1259274+40ec27b6a40819c69e471f57beb66ba78587f204",
+ "1495486316.138245+f1d5744c3b67cd63134bdbac9ae7033fb42523a2", "1495486316.1545515+ca64509edc11e213ce6b21b8619dfebd301ec28c",
+ "1495486316.1665475+56249582f2ab22f62369c35c9cb453e60599fa8e", "1495486316.183079+ac4d5bca64ce275644a17ae51dcc35cd97a889e4",
+ "1495486316.1957588+72dc5b64e475a4773735bfd09c1d43c9fd879e47", "1495486316.20818+24017f72efaa08d61992f63171f52d1d05cebf56",
+ "1495486316.225883+e5192e7f69e3c99f1e2035eb1b33520963054767", "1495486620.3750777+f1790e7851e7aaa05dfd98d7533b9ef721c771d4",
+ "1495486620.40625+f477fb2387af380a80c0d23ed3552a5c817fc903", "1495486620.4335892+ce393edf2bccc233ead46c00b7a3844e7d4ab0f7",
+ "1495486620.4489427+c85924ae4313d998dbe3fd172d01f838b6b63777", "1495486620.4645107+306197accf976d4c37883e205517088e4aaf6b00",
+ "1495486620.493153+630754557cbe753cb448baea176b1088052fc955", "1495486620.5216556+1cb79de3dfdd192392348d2b234deed644abb1a3",
+ "1495486620.5415878+ab3f53beb3fbee2caf775e2589c861fdce87558c", "1495486620.5783916+d329cd54bb4b6bbc33da1385ee2594dc3417c18c",
+ "1495486620.5945518+a134987d185f0467efb59b88165493ac5c6c2c2f", "1495486620.6181822+b253278267110ba8f8555dad62e3c80946458d0e",
+ "1495486620.6482663+6c263751458fda31a507fc4177a93eb64de2b0d2", "1495486620.6654096+799ccb9855d2fe73ff95993c6513f77e4ef068f5",
+ "1495486620.6815853+5a08c7937680b945b3bd670df684ff3a42d72e92", "1495486802.6115792+36c7c901dba65ffa492a53e936bc36fe5da8c2ab",
+ "1495486802.6288702+5b3733fd422a8cb1028641a216ec5e8c402b0c71", "1495486802.6445975+4b2b261087f3d99fca866d03784f9624caecfbce",
+ "1495486802.6601114+92187cdb2f6eb2a6b1ac5f25e7e963492fcde4cd", "1495486802.6760786+1f2b91e13907d586ccac32264dbf35880c78a5f5",
+ "1495486802.6926098+c1b4b1087f0db9de1fe907a8e5b462533374b69e", "1495486802.7088778+88e25df7dbf469b08f811c8c35dd82c8bb8931af",
+ "1495486802.7238557+9c3410575c55d58d77af9d63d58c4c34fed7bc53", "1495486802.736623+5392962625f31d5535638ef13eb32ee043e3498c",
+ "1495486802.7483335+cf02921520ca9c0d496305e0090828930cb00152", "1495486802.7606027+513f7979351b9e0aedaad9f80653a3576b28b366",
+ "1495486802.7729945+940590aaf619d90ff48077f7fdcb8fe816018efd", "1495486802.7849562+7a3cd9feccb87afb2d85c79c3dc621b1963de1b1",
+ "1495486802.797994+56119f3afdb8a90a9593fde2275e0f049e4c686d", "1495487027.1124887+0774aec6177f1e84ec1dec057244b2cd4d1e83e3",
+ "1495487027.1262743+94d236777cb41e490d0a704640fa1ba0f4b45b3d", "1495487027.1396518+65b3d06b867ea593b3acb7f19ee97f88b40bf516",
+ "1495487027.1513972+3042ee1d360ced20804ddd63b6d5b10627fa634e", "1495487027.1632843+60121c1ff46518caa2e78be1604f49eca3a89a02",
+ "1495487027.179972+3c0b006b72632a5bd0165d18772bf640df6a1eaa", "1495487027.1923554+4f7aa69b04a840cd362039af928785a35f009098",
+ "1495487027.204674+21ae0a2f2c3236b977ea0f7d2805a6e348bb5909", "1495487027.218303+88d4b4dc4e3776db199b12eac8c38fbd0ae358ab",
+ "1495487027.2300613+63ccc13bbdbcc827a3ed1255543ea06618318f1f", "1495487027.241684+bdabc315bec0e7415a2d755ee1ffbe1fe22db24b",
+ "1495487027.2537453+854f202b611538e882860607fd233c075189347c", "1495487027.2658882+45c49d64f3355f618c85a200cc50c04ca2c5007a",
+ "1495487027.2822182+5b2745fe5002cea8dc56e45eba3a230886ba805e", "1495487315.8339665+36836d92447ef4b8f2fabf5a190c6f3095b8b487",
+ "1495487315.8502042+220c4488385612105046df473ab9058932c44419", "1495487315.8664963+77512643472eae66934f1082feee4819ece8f42f",
+ "1495487315.8817375+be3c4874e26a0ab6aad480cd08c8d1128af8369c", "1495487315.8974714+e393ce64ec79baa2268cb67cd33235d4a8288bc6",
+ "1495487315.91369+7c0be901ed8452337034d434c31d88ad640a4213", "1495487315.9297454+dfa411356b13a44901b57f393c7bd66e85e5c1a5",
+ "1495487315.95506+c0bdd8bac3d52e6c2c534264fdf7f2eaf77845a0", "1495487315.9780009+eab2e31b0bf4ac6f6c9b86fc844f411ebe037de9",
+ "1495487315.994494+2c3cbaf1039938cc923bca056f7e082f9bfea3f5", "1495487316.0113873+9e4b5596423e529ee453375acf792e426b5ebe00",
+ "1495487316.0246809+784cdd644b618e7bc7a236da4c597fd1f7f102c8", "1495487316.0374067+3b72abd3c2684539e5442c088d8b31ed5e2ba1fb",
+ "1495487316.0544848+c696cb716d8fbd77fb01bd80299255938f0560e3", "1495488216.175593+821453d0069a068c4b117593351fd6891c2900b0",
+ "1495488216.1872995+240fca0392f4df6c42402009c71cb24d40f32213", "1495488216.201138+11459badac4964a38b558309beefc3b645cea4a7",
+ "1495488216.2163332+b1c156043b04e00a04e5a8881c47892476efa3e8", "1495488216.2325242+335b52376f850cc3af5b6e99f3531eb9461ceab5",
+ "1495488216.2462926+ee4bafc5b74baab0d8572982f9d46b1fa418d7b4", "1495488216.260895+21f600e24d4ceb3851d38931457413a9efddf8aa",
+ "1495488216.2776895+80100e0f86fb724d1d0498995807b4ce0b94a72c", "1495488216.2918122+9371207cec22290f1acb40fdf90b1f6cf9052145",
+ "1495488216.304416+0df003c8c959b58a2add230c6cbc649c10319eaf", "1495488216.3171499+30b9bdcec606a61f62cb9be0c7d0061c70d039a3",
+ "1495488216.3321464+b3edf968f2e8afc1368248eb560a1c97476fcda1", "1495488216.348412+cff43df518d928d6040b126a9bd29a670dd31923",
+ "1495488216.361311+2df214c01c15a814529dd5d3b41242a4cbc453e4", "1495490839.6462018+826660d24a51cbfd2f12fb1424e541a626a4d791",
+ "1495490839.6934237+b77afbada8312b642a2c865214371b8be691a559", "1495490839.7075317+bee0371233434d98b29f995aeda918ddf66b3da5",
+ "1495490839.7240117+f6de31d0a7eb15dc0dea23b1accd613d6abe5387", "1495490839.7367988+a408d75aff150e48dc03637c583afb2d0722aae3",
+ "1495490839.7492795+8630531035ae00722f2af1f412409b1d7d341f12", "1495490839.780438+15f5abba7ce234d39e9df590269201f441c1bd74",
+ "1495490839.7935019+e59e4f185a522fda2d50383322dcf2aceab4d951", "1495490839.8068166+8fed6b929a33800829d8f337ab6faf6cc28cd08a",
+ "1495490839.818826+22ff3dc08817c8df2e384d646efc5030be93c2c6", "1495490839.864649+9924a5ba3095a91431e4b41d850d852287e59f59",
+ "1495490839.8774078+6d1390004cf9a31602cc6ce886988f7c5ac51a1e", "1495491739.9660013+fcc692c2fb575e10799613fc3736903e7c1b22ee",
+ "1495491739.9806767+845308c4047a41a7a94b40a6b49bad98555fcbad", "1495491739.992233+c78be864f2bbf21e1385bbe7613f633999e8210c",
+ "1495491740.0043252+57203b0614302be0ad2268ffaf27455407f5063f", "1495491740.0178015+60ed2521ef75d371b989a77f664c8f01894079ed",
+ "1495491740.0314887+5c3cd0c6e37b991e3326df4751ae2bd4bf13382c", "1495491740.0451124+6dbe68cc66bcd5356defbddb9af57c2c21e3f704",
+ "1495491740.0579813+543f78f39025d21e761e324c2727fd8dd0d55824", "1495491740.0721278+2fb229247ce9979221b42fe3fe5828bafe4aec86",
+ "1495491740.0844793+e185e488c9c40dbcf9ece7914d514c0c31494a57", "1495491740.0980632+e75245b88e86914c44b876dc97607bb9249b318c",
+ "1495491740.112222+90411c4798f8f6ab489aa2cdda708581aa5e2ef2", "1495491740.128213+ea9c0a9e82a91ba36763992bc1cc40e05f95a5c8",
+ "1495491740.1404326+2dc7621b8edfd224693e2dac9e978e9f963735c9", "1495491740.152783+3e1381b56e0633dc75552d4c6a680f62abd79e8c",
+ "1495491740.1656792+5f5825824e0788d6d79091fb216ef254f9a67365", "1495491740.1778731+e832323b7fbb2ed0d64019a43b346eb391dbf0fc",
+ "1495491740.1892343+ab9b144b749a9fdefad7978de1863a08ba124239", "1495491740.200704+1e49bb33a11372b3cb4b4dbedc0bbcd8ae608e88",
+ "1495491740.2121944+c466004b0dab8244be6532e7f0192b70428656af", "1495491740.2238789+66e17afc8b4084e877fcfd9ecc67576fe21f4dea",
+ "1495491740.2403495+d7ed2c2181ae6fc6bc0b4de2519974e9662ab326", "1495491740.252244+4e955c09c010da1dac9c77ecc24d47db6290cce8",
+ "1495491740.264221+4dddf5cfd2b537f9b95dae60e9cf24187867df27", "1495491740.2764854+564697735b7c6c04043d5c737c1b2d3a01c40e3d",
+ "1495491740.2883565+9917d009e0c88a3b6b72024da05fca40596ff70f", "1495491740.3001187+a17a3c918d7b169e4a6b70fe8648c56454b589fa",
+ "1495491740.3118362+86281e3f32aae3f4b8067abd83f7be5f30ded5ba", "1495491740.3243237+401679c2c6331f8a08074cb07ee15834f76a7e3f",
+ "1495491740.3360305+9e4b6a7d34238ef0c395264906562007f45fed26", "1495492640.395396+db99e7c3e23c94533d85c774cbb0c747a0fc7a74",
+ "1495492640.4111037+257024b3772eec5111f75e79cedf9548796b3f4c", "1495492640.423362+6748e8769fe73822bfa45897bb329fb7323a0ba1",
+ "1495492640.4353917+2e1213cb4a8e2bc6cee9bc54f576c8437b3cd00f", "1495492640.4478238+ff9dc37f3f9ceb14c3fe97358fcb94297e4bdbd7",
+ "1495492640.4595451+fdfa5f11a06334cba6551630c3ab43b9612411a0", "1495492640.471111+2e9b3f942cb55974ebcc472131d39976deadba40",
+ "1495492640.4828124+731f63acdd65eef2a6cc6e825d1d1c12996227ee", "1495492640.500543+4b9f9f9887c57584eecaceb7b30dfe65c3ed8a01",
+ "1495492640.512862+72b551c2ce3338b16f4b75a778bf12c1430956bb", "1495492640.5252914+dde6eb41a61653c1da6382cb548e5e48a9666c8a",
+ "1495492640.5373297+a86ee4f940b70ebc9fdf5ecd12a4897f93ff9776", "1495492640.5508513+6dfd0b82573f09b4ebe5559b504583e8eba015e6",
+ "1495492640.5670142+1cb2bd758f9576bf358bf4029f3972d866c933cf", "1495493374.197179+ed538032e7e6d25a58f5ea10f18942ea8aed4ca7",
+ "1495493374.2321641+f4deb5a2793360f7e08e38d286808078a2875da8", "1495493540.6863375+3d0d54a6fe0bd67d941259a57c9439fd4be3c4a1",
+ "1495493540.7041817+9734e0809c9006225eb9e87bab1b5a940c1493d5", "1495493540.7161705+759ed43c1ac23ad33ff286160b7013d649af257e",
+ "1495493540.7279613+9d69c522616091a17fdad4c552188e68e2d083c5", "1495493540.7408705+2522719241f79bff643e6d4406b169fb322f80e3",
+ "1495493540.7585444+667e45fbae0ca76bde0f7b7dd90e0e005905063b", "1495493540.7707164+bd3b35c86a0eeee25f75c348392885f68ea8dd9f",
+ "1495493540.7830884+ac87c288253308e14dfe6f6f20be70b32652bec5", "1495493540.796128+4822bbc696b7098100759073e823b4fb88c1ff24",
+ "1495493540.8096993+8a0e8a4dbac61486e5e20169be53e2e942c00e02", "1495493540.8244748+7c888404d7b83ec9899040d87a9081f2e39599ed",
+ "1495493540.8389726+8ba40edca4fa631c2e66957e84cee95d4ac92c62", "1495493540.851766+828b399f8314c5bbc5df36dc71792ec765a4b1c2",
+ "1495493540.8637283+3f6cb972a8305870ec706ed8e608873be0932ff1", "1495493540.880696+1eafffca6b2548db941c6673f0d6c45db0693d1a",
+ "1495493540.8931916+84bd9d00d70c5d675b8f1ec0772ac68bd0a4b270", "1495493540.9050226+17f5b9de4b269348b3fc25fc701199b7afcdd3ed",
+ "1495493540.9177976+3ee857d113f09fa1e4b44a158ad679caa0f51b0b", "1495493540.931668+8ea420789f42f1c0f572fdf9835636cad5dc76d8",
+ "1495493540.9460213+1b716f0bba65523666ebb7064742e1fe3663580a", "1495493540.958436+a1871a4552f285e21c7630abe5d5bce328d38fad",
+ "1495493540.9702463+d29678ab926600e50e9ce2bf9d8efae55096c579", "1495493540.9821694+17481a9728079b1f093eb6f6453426d9ddf30cd2",
+ "1495493540.9942162+cbeb53dd2942ade96eab28418dde36f407de81a3", "1495493541.0058458+9e463044ce1b668795ab63b1db8cdd601a3fbbca",
+ "1495493541.022699+c83b8760a0a75acd0ec0cae8ee837906a7513f13", "1495493541.0372028+422d3f52b6ac7f090b3be585332979cd2a59750e",
+ "1495493541.0496893+9fb1811fe131f6cd8b808e6696f5774f6d0e80f2", "1495493541.0616403+d083a919d7daba659cfc1042251d6a1038ebaae0",
+ "1495493541.0737422+0e96fb5a7c205e7cc582a89040677a3e3403b9f6", "1495493541.0851183+107c828fffa01dd52628f8e5c2a83375e3c2ed5b",
+ "1495493541.0966094+87e1e08a95749c0ac1e17ad083eeb2b4c9bf01ba", "1495493541.1084704+a66e688d50244de6ea4a3017dfa9445a4f025881",
+ "1495493541.1198967+b52c488df016fc01831fb0f1d111c55ea01f9c6a", "1495493541.1310797+de46f9dc2c1fd8d09d0273e0e61f43327544ae2c",
+ "1495493541.1430466+80b61eaf5dca6f03fc078b228b83fa753e40f73d", "1495493541.1560605+a8d4e98f114b9499851974efe7a2edd16ba52b82",
+ "1495493541.167627+6b23be159e9a8e06a72391a4e931ea27ac37183c", "1495493541.185359+1917d923eee3b4467c4e0735db5c57fd6342d4d8",
+ "1495493541.2008245+702376aaf9b6d4a9ec43b411cf59d55e1cfd2172", "1495494441.3016326+3c671df416f8f5e37f8f392ebf08f5e385648d9b",
+ "1495494441.3179414+cf0d3401cc3f36be3d319d3e25a3270fea70bdd5", "1495494441.3336833+08de52ea47935fc462f0124eeec01947e69fe63a",
+ "1495494441.3482568+178398c974b8cc3c9f57cbd22ff86dd1af43b281", "1495494441.3608792+bea82e4835f6ad2940d25a5e071bb3a9bc02485f",
+ "1495494441.3768203+e358686b5452ff813728d70832aab16a5c7df807", "1495494441.3921056+9d29678a08ae5e4e91baca16cb7b37cd35d7b6b2",
+ "1495494441.4038162+b7ad2d3b87df465b7f7d63a63b8d742c2a648cf7", "1495494441.415611+27765663960983197105477f46a8e3664414cbf3",
+ "1495494441.4275382+e5599eb4dd2d0eb60ade748adeac922a56225f2b", "1495494441.4394724+796fe796857be95a2eef2134db6b5817e23baedf",
+ "1495494441.4510438+90b8e51e09ada66b82b18a0d6bf5bb0a4d83d619", "1495494441.4624653+6166c27bae9a00b8db5ddfde7757b8bfd880b4f5",
+ "1495494441.4740927+3673c33f0e65a14ff09227d8a0d3ea2a7285d036", "1495494441.4877074+0e30e5c335ebe2373c6637ec1c93b0bed89a0bb6",
+ "1495494441.4996185+5894453fad49fc2b48f5f9a26b1bf6e6aa4c4940", "1495494441.5114872+55021c6958dc87fdfad3c6f9cceb6efcb6cb7a37",
+ "1495494441.5233693+76e01e418213e519aebe4bf6feb4623088b82ca6", "1495494441.5348217+4140b066fce0ee4ae20676fe61d7d4618d379969",
+ "1495494441.546488+b236fea67b8619f7f60845a43ff4718ac45aff73", "1495494441.5586286+f00fef6e903df6c8979468deca1cbe7de6d5ff82",
+ "1495494441.5708456+1519c266fa0c0b45d48e10426b8c27d669d69f22", "1495494441.5824635+1dd6271924f9fddcedbecc00be8e3a5ac9fd9064",
+ "1495494441.5949845+02442671288e413ed970e72a9bf97b228d4d0de0", "1495494441.6112607+70779e671e02e9cc720c3594c29c745833c2b5b3",
+ "1495494441.6238103+59f96ac63bf78d48685dce691900ab48c9c16857", "1495494441.6369708+cf3fdd77ad59b1ade20268f31498e0968c16c422",
+ "1495494441.6506503+d9e52462ce8d5375735cd65d6b2053c6849abdb7", "1495674855.6924467+47a5da6ae4e8672d1333e6d0375cb3127cd08418",
+ "1495674855.706259+ef5f994b1b150ce5861df9c4e925f8137e3d24c5", "1495674855.7181268+8194c8af0d7f26c8a65e167cec51dc628988f885",
+ "1495674855.7300086+1b7761406a7f08d9551c7db46fe1d6be342b5753", "1495674855.7416792+7b11b770f659010703557f9675a0c48ae17f5592",
+ "1495674855.761497+44ec736a28646e9bc67b50f1f69bf40e6e9e8158", "1495674855.7743413+8ac4a5a3179bb32145806dc3f2b036b357f8cee7",
+ "1495674855.7880719+383fde39ce498ad08169e5dc232160966cf48ffb", "1495674855.801543+22ced0dbd09c0f2220f0b5aa8d74f652f3532e1d",
+ "1495674855.813205+61ca092a808618a23b758f5a3fe4553887b6162d", "1495674855.8319342+fd8c24eee59452965bbc7c46cc5d20e13755bb87",
+ "1495674855.84904+cc36d104be3ea138339e6dbaa42a112243673994", "1495674855.8612394+7c0c2f1a06563dbfe2d26ba4597a7ed9f6008444",
+ "1495674855.875077+5493700d920f7a500b833f39fb780d13e8cae0da", "1495674855.8872297+4dab589467e60b4ea8631398716977b802360f78",
+ "1495674855.8989966+810f5fec325e45f6a7df1839293255151a8e7432", "1495674855.9107466+131fa440c6c1d6e6242d44c6fd953e1d47c1e039",
+ "1495674855.9228134+0a2f1a15e4ebbde42b03bf012d394476f543b052", "1495674855.934459+ec1cb8255979e89242f673b6cb5cb4e461012483",
+ "1495674855.9458468+2995b0a0d575e29601881231d558330a0b8af11f", "1495674855.9578073+4bd034898801ff8f3d756673e2d5bf8e95fbcdc7",
+ "1495674855.969457+ded7434682cc3f1b9e2f851028c9b5bce40cff6c", "1495674855.9809191+d3933085904b1bbed6461972ed2e51b3264348bd",
+ "1495674855.9934423+fd631ebc5d2266807698529f13761fbc228f7182", "1495674856.005399+a52432b86e00bed81ec2563700720807274795e0",
+ "1495674856.0183516+d1259a0d81b58deba78197eafee1e8274c44d578", "1495674856.0327857+db13cf2fecd8aa3ee106ccd0c8de74a33ebacbfa",
+ "1495674856.047231+4992fea27ae2436ef015809d5829d4ab9ab1f8fd", "1495674856.0617504+60a73e943a3c6e592d0992556dfbe6a26d96db85",
+ "1495674856.0732896+ba1b7bb37a2be1ecd8d17badc870fe45d3255d3e", "1495674856.0849028+ae485eaa9fe2d7c49006f16b7f63ae94df5bc9d9",
+ "1495674856.0964782+fe7a82383c785901dd167b5b7433644ac24c93ba", "1495674856.108105+698fa1b6e16f0a6a94263dc6d5fe54d9875da0f6",
+ "1495674856.1209896+1627d2b3253546166548b8afd2b0f73e51a1e3d8", "1495674856.132562+09aaf4b7c9df93fb21b640227b71dd4fe42ac29e",
+ "1495674856.1440399+041078ecc119ca7ac12c0e2f00b0c30a55ff7bc7", "1495674856.1629984+1e46f583723ab5431d5cd614f811f2b84ca502e3",
+ "1495674856.1751292+86b59adf87ac5f1aaee2553ff33b33bc9446028d", "1495674856.187097+ba15537e81fe2f399dc7be13469acb9b0785cefc",
+ "1495674856.2030487+7bb046c44cbbaea8784e8d3fdd65acf215732cfd", "1495674856.2152503+8210105ff05c819c5add7c710883d943ab78494e",
+ "1495674856.22716+7878f85479d554a2f516d949a610d73e1c838c2f", "1495674856.2393286+d0f4f4242055a3a02a23443b43069a8a2a602726",
+ "1495674856.2507334+8e04cf72a5196f8824ef40426f9b30886fff107d", "1495674856.2657394+71d1549740ceb0778c7306876dd87f196f9d694b",
+ "1495674856.279932+3c8f9ed07c10913e8e2be153341287ccf984616a", "1495674856.2941275+77b61f9f69caf86a3c6e58afbe32ef14a68f6b44",
+ "1495674856.3081143+e63f22588e18b81f298793b08f95138e4bed259f", "1495674856.3214462+c4c8dcf10c2f761c26b57435c9c7c0ecddbb5ea2",
+ "1495674856.3347385+5531fa516c602275f790bf1670bcc90b3bc67049", "1495674856.3475678+3d831a0b6559053f3e0e750895d0a1f647c18607",
+ "1495674856.3734326+75270299d63efd4fafd5269521e3c8ba559455bd", "1495674856.3920884+f13071217f715890293576887a253c2c0d64bba9",
+ "1495674856.4040222+7b7095ac7e7e4f24105ad5cce071387b35224e29", "1495674856.4181154+f249c7f72c8a05b7eef53f59ea0c45c5a16e8d44",
+ "1495674856.4330783+b0550efae4a781a12e023dbc045d74c408724a81", "1495739775.535429+24da1078afcbe48918e01bf02269d1b3df3ef02c",
+ "1495739775.5488017+efa82a77b858ea9f3dfa132b3368d6c70614e549", "1495739775.5609753+84d645cb1e6b5813d0d7e6c35d3c4ee3bdb151d4",
+ "1495739775.5761106+a53558a37732143fe1f984ee43179519a86eb298", "1495739775.5923033+ab4d335012f2a8ab5b352277155d12f3f7160ad5",
+ "1495739775.6076663+187f52f77649fee172fdb6e3d2d64a51fad2df42", "1495739775.622556+c436c7dd4ed897c7e4f93c1a5a99bb3c48bc7179",
+ "1495739775.6375275+29f4a5a08d0a7378e39b478178f0070b1bbb9404", "1495740496.7955377+136ccf538d1bebadc4c39756aafec5302bd3fdad",
+ "1495740496.8183503+606b68b3e2831f2336b076556650252425483cb4", "1495740496.8302312+7f14e114089c0f68d0bd3316c5000f0dcbaf4c9d",
+ "1495740496.8423297+33140fd67523eaaedc447ca775afa5ac9469ab58", "1495740496.8539937+dfdded175b6bf60c79a6dc35948e6049f16ef60d",
+ "1495740496.8666196+a71a808715e2930d27ef578d1a069655c042b6fd", "1495740496.879031+73ebd540d856c46f5f173aa6c638d4b3744874ba",
+ "1495740496.8905528+005ebd0d98e68ec72218640378f977bdd282c122", "1495740496.9043128+79e6f12307e7a9989cd3f7c9ba6b8e9d3cae0836",
+ "1495740496.9203079+c66012ec48f7521f8cab03c5838ca37f9c1ed3a9", "1495740496.941408+7a1e24331ea1e010c4f7d3c2509af468716cad84",
+ "1495740496.9552171+a6fedf9952f3d457fa5e135a0e2c367a29eaeac3", "1495740496.9669297+e8350ae190e903bcf544319b3896d241d185e1d4",
+ "1495740496.97865+a3533f858deb16a4b866fcad0d7435445f5d828c", "1495740496.9906743+493e3845e4a7f2ca0befca134a0a9776c3bf537c",
+ "1495740497.0022886+abce97004b6b512050630688208a325d840c3e90", "1495740497.0135694+14cbe78e8f5e658f644cf77a1067fc1ef5484235",
+ "1495740497.026292+3a27c5625dabf3d980b014bc026a5f943f055096", "1495740497.0374637+4191944f97b57ab36708e51ca875e63b695aecce",
+ "1495740497.0491533+a8851e893d1b5eda4917869e920a6b76484b8e9c", "1495740497.061142+04d23c23aca9ad342e3d9d36d408c43854307a72",
+ "1495740497.072407+d4f06c235071e12e8815b233be57720bc6c5878f", "1495740497.0840354+5d120133cc1658075e3e1f2d1ca6b2de737673ed",
+ "1495740497.095675+37a5cb63e0c5a6a367363e8052b4291ac27f50a2", "1495740497.1075425+1c772d93b2c25a9d485f91511b858fbe01eb4227",
+ "1495740497.11909+1f378df0c022f25e41acbb9b3e8771450523cce5", "1495740497.13107+ab805df1246bf9a37b5ec40743e3252203752dc3",
+ "1495740497.1430416+f577fd326c5a4c7d4b9569e21748c917122dfd8d", "1495740497.1546886+291b09060ee210bca5a1b6673b3363385231d102",
+ "1495740497.16596+9add89aa520ba0fdc05f999c5b87359c98bdb937", "1495740497.1868117+3e53f7817af2f7935eac3a726a7a8647b1856156",
+ "1495740497.202261+92677b1dac7739a76ab841440b7ee28970cf48da", "1495740497.2176862+29297a139b9d9d181239c4c61e6e27efbec9ebbb",
+ "1495740497.2334847+bd166eccc70c6839b6a09a64a5a6f1ac44c6ee04", "1495740497.2451189+113db0ff64ff182b477576191834d8b17d10d90c",
+ "1495740497.2564628+46a9369c26dca4db1c3b016f2897fbf24546517a", "1495740497.2679427+99bec5637ee777b61e727f629027caacc645fd58",
+ "1495740497.278986+08955159e72887f6ba528855b63744f709d4607c", "1495740497.2904732+79aa103c0022ec4ed11e85368e6c9503ef179650",
+ "1495740497.3017917+efeef52e1cd533158aa6f30a9c60c2be6bb2a642", "1495740497.3174734+53d4bb8e71f051f40af712fb43917976339956b7",
+ "1495740497.3293+4900a0c5011fe0227a915069f30e907af7d7473a", "1495740497.341692+4ae1348b413032fab26f934b6c0f924fc5d7346f",
+ "1495740497.3575704+d0e853362dac3aba24c59eb772438d5555233427", "1495740497.3697147+1a374c1af83fd049e93a1f943ee92ed7fb74bab0",
+ "1495740497.3851619+a2967b7be8e211732501733bbf73ae30c970ee51", "1495740497.3969162+813d10c7b998787506e83b15a91d4db59953dfe5",
+ "1495740497.4130712+4b3d341bfc531d1c870a94208ff810f33ef2d439", "1495740497.4247227+b51384f7d2520d88c573cbabf64237858f473c09",
+ "1495740497.4376109+4aeea764c78e5d1efbeece24b9839b4673bf8cd3", "1495740497.449863+bc1fbe425949a30ffd6e7f554dfbad597f142901",
+ "1495740497.4615378+594afd8373c0f5fb949ce1ef8732101ab3e15af8", "1495740497.4728615+53fd961c8b7a7df34995abaee23e3ede88a0fb03",
+ "1495740497.4861333+716127e242b64c98c9389236b998ed5266193e43", "1495740497.4977937+fb2552f26ae0977dddd19bd920e155273cc722aa",
+ "1495740497.50924+e878868422955df9b811061863596e5d82b0b291", "1495743935.6026828+525f033d95f16035c2e1fa7c779ebbe241f6f2b8",
+ "1495743935.618595+dc6f2f82b9a46a693ccd2e5ab277704d3b3adb84", "1495743935.6330798+de56374fc07bc84344065616284806b44959782a",
+ "1495743935.6457238+681da17cef033300a7be16d2fd9a149239b19217", "1495743935.6578703+1727d5ab1e0c875e3be2c1b8e16348b2f9d0d552",
+ "1495743935.6699138+f06989186a264a3161991221ff60f3a6b884f783", "1495743935.6819432+e6f1c117ec3417cbd83685807c8615289c54132d",
+ "1495743935.6940265+2aeeaea4366e802c2bfe8f1385c1fdb3dfec4727", "1495743935.7085037+e94472f861e5293ca0f96c6fe0e7e9f27f1a34ac",
+ "1495743935.7223997+1ae1a5e08f6d73f6ffa566ca75158012fb71d192", "1495743935.7378862+e1c04265a39d38db207e1857c083fea2c072bebd",
+ "1495743935.7504923+a3c7fde5e58dbd7e8f951b8022afd6f1bfc62b53", "1495743935.7756305+1feba70198e25dd395dfcb4922ae2ddef637b5e1",
+ "1495743935.7878487+36b426150769279381dd2606dd9f822bf00bff9d", "1495744469.3265042+58c6d7f8c415d64c8ab866822341c0a81c3bce10",
+ "1495744469.339887+e97376313482fccb053ee6e16a75112a7d5d8a31", "1495744469.3565745+24e93237033b7d2a66e2da023c4c49a9716c0ac4",
+ "1495744469.3695297+9da0b59fe2d81596e499a67fb59f2921db36ca0e", "1495744469.3822157+1eb5385e35d400818925057f388d37bf998d3865",
+ "1495744469.3952377+18d2b83a1bb1eb7490fe7959b853c4789a1241fe", "1495744469.4074428+59b7ce637a115143969b295bb35c53d1abf00a62",
+ "1495744469.4196227+66257a61e24c3322a962596bb775642bbd35343a", "1495744469.437446+cee6ed4a2b06312da280b5b1b9196892518d25cc",
+ "1495744469.4504328+937846390c200300474498d4962a33a996536172", "1495744469.4638772+0635a1e115a4dfe8d654e9a6eb08e6caeb28db58",
+ "1495744469.4767394+0c700b0404489a40e2b1535bb72c5a4211b2e328", "1495744469.509183+e197706e61baf16344a7646d731e647439593d90",
+ "1495744469.5213583+494a3f5e82c263e189cb9f619dd4411fe73d199a", "1495744469.53334+2ff77230f287f7f15e8813c7722ae72ef4a0ef03",
+ "1495744469.5450768+6868ff594f100b426ac571494e894fec1a83faba", "1495744469.5567997+97a130b11c52f28016953c9d2549636f1ac6f719",
+ "1495744469.5693939+2209739663a4fb430d1330bb11f91a388ff48d96", "1495744469.5828772+d88c7da335187b6d3b233b4ec9ca9021695a1e88",
+ "1495744469.5954347+768120d26a3eefc1e94fac6b1c69e68e153758ea", "1495744469.608646+34eeb227d42fa5a773d80e0668be6dcf272df1f2",
+ "1495744469.62669+93ae529a7c405eccbd2126bc016c284d47952b1a", "1495744469.6393335+860ee0f902011c1fc9071736c7caff56b93b3bfd",
+ "1495744469.6511805+4450a014fd1a0c855ade5722898b4748ad373376", "1495744469.6658263+d824adc04e0640e959eb5d52069407c6b040e588",
+ "1495744469.6848516+64b5d0302ae93cd0a4bbea66fd6320a2e30a0406", "1495744469.7004223+36f4f5f5614c7d24cfb47adbf83d05af8fbd6c15",
+ "1495744469.7171535+bbfdce71c7cd75953954b1db851a60c3bb7d47bc", "1495744536.364667+c0acab25d6173bef476f106986d15664e0a6774f",
+ "1495744536.3803892+66ebf1b8da0990095294892bb710e6d7f3b9fd0d", "1495744536.394532+7286b5f4b402741212cf22f01a7290690466cd34",
+ "1495744536.4070845+e08773a100a06e599f598bad5c605ea98c245df7", "1495744536.424178+947ab623dcc4b805f073fa4fa8719072279de913",
+ "1495744536.4374065+bc97e8240b79787b45c729bba1ea7de2c5a7077f", "1495744536.4544935+520f11bdd7954dca22dfaf6c5f24e1a3d13da269",
+ "1495744536.4706542+2dfd07329af1a6c1e79ffe610c5db1286794da57", "1495744536.4902174+2ecee025216edac6ee8da055c6ab819527d7b7ea",
+ "1495744536.5109756+9af2d7bec56aa9bcdb93b7df895c0b6c86347bba", "1495744536.5276701+33c0cfb3e849dc4a071f51b386870b87eab14361",
+ "1495744536.5450108+ae583b046ef5ad7519fa97964b90ce4f4c67aa2b", "1495744536.562094+0dafcfd0611b830802dc878e7eddecda0b05bba0",
+ "1495744536.5787857+007d95861824beeb9a4cc69e2e3f194c26317911", "1495745506.686046+e6df6bda8092977676dfd546ef869230120b0b0e",
+ "1495745506.7018502+351270237b56febc14b08e9a818d20c9aa188582", "1495745506.7141485+ea60b029533465db6d668f377f68f7e389ce2b48",
+ "1495745506.7313185+b6ff96c67a04dd712ab70e1b521fbde9660a4cb5", "1495745506.7460022+63fd813b91a0722feddaf01abbc587b3df84af3d",
+ "1495745506.7577562+a6af6801d03c2f75c02f17abb5d9253d32d51b0e", "1495745506.7732794+cfb58124e096903e07e750aec49f957c0f96e463",
+ "1495745506.7852733+f776343966cc17be89a49796451c783f17e74885", "1495745506.7991357+d746ff9234018a507d96b4bb12041dd117605565",
+ "1495745506.8158839+b6918628bdbd0f280f53733dd0e619bd7384daec", "1495745506.8285563+29dd3be40810cdd5b13c68ab8183e3990ce7c0e7",
+ "1495745506.8408785+3853af6fef9093f7474687c042cf5432c923245e", "1495745506.853648+72df9bb9d328280bce52f5d8f04404c9b64f5b02",
+ "1495745506.8657336+01b63f78117bbba1cca8adc0e3145486cc91147e", "1495746946.1498752+d107bf83417e284bd902c22930e6ee60d2ffe91b",
+ "1495746946.1787968+8bd5b9d7eedfed1ae552c4aae354fa6306e9b1cc", "1495746946.2052007+40fc6008b602e27b25f5bb39e6b6cc5a24248fb1",
+ "1495746946.233806+31e6482b73ff4bcdad851ad337e89163c03e25e7", "1495746946.2665744+0d0d2299cbc69d337423b7e9b0d95655c9e6cbb8",
+ "1495746946.287065+fe85006c0d814e9dcc9d4dcf94311abd513a0723", "1495746946.3089495+7d8dbad23015fbc75e861963e777dd6d806c2c92",
+ "1495746946.32472+d7dde9464ca9ab5de80eabe1830c2bc686d2c261", "1495746946.3415623+a6894f3a18565ceeddd067653de80e822a8eb391",
+ "1495746946.3572247+3d3b67f1e8a463259053b5d9ad4e100b1049d454", "1495746946.376616+bf724a04211b5973a2fb3ab8657700e59901c842",
+ "1495746946.392326+7196c0d05cd6fd22690bc25f7257892c2da4b781", "1495746946.4079008+2afc0a8e0446b5f96daba59bfd1b91c34c02d31d",
+ "1495746946.4228258+1d80afbc69423fbe9357ac8d4112957a0b48aff2", "1495746946.437962+505c89a7ec0a8be48816b104979b8fa3665070de",
+ "1495746946.4530885+6b2d42a0a5c6177c6a4231a6051354b2fc6eb8af", "1495746946.4671698+eeba494518d5b3c968b77256a875a5a91628f21a",
+ "1495746946.4794254+cce3d45b8be2010693ef007c2fb53a3938391d60", "1495746946.4956625+d10de1c8fdd58044b1d04ac20b6d128670a162ed",
+ "1495746946.5076463+949c1e0c00442ca5c72f69c740841c6625f211cf", "1495746946.5206733+7dd8858a66489da2dc9bea1f6b9ebd9990e5bdd4",
+ "1495746946.5327768+662622ebc8dc28abbf654987de442de7736c0eef", "1495746946.5491793+7d1440c6f3553aa522f5cf9a004dec5fe30df228",
+ "1495746946.5657513+1626b73f4addd8566b50513c61337897b178b369", "1495746946.5791569+923a3efc95570cbd284dee04aeb5b5c6f8b75bb6",
+ "1495746946.605486+1ce0b4787f9567177d31dfa910d0410d40d5b2c8", "1495746946.618529+f95f4b41fb4526d64631dbf2add7dba833eab389",
+ "1495746946.6309037+477ae532c8bdfd6b6afc8ed2edbfc15712615fd1", "1495747091.9425578+1ddb1d53e40eba770c6a3d78a0fded143ff87f02",
+ "1495747091.9560013+1daeb41a63b94f69776d6b93b3d2fbab1a059b25", "1495747091.967684+2cb700bc7a14a3131683942f848f8e6e4f82f21e",
+ "1495747091.9793334+22ce1cd40d769ef59501373dc0fcf6976207678d", "1495747091.9911718+141c765e3ada389b6629c89f6840370acac35cf0",
+ "1495747092.0028203+d9d11a75d0420f66cc18b4cc12ef7d80084bf409", "1495747092.0144863+a59c803bcf96e2ccda0707da9f8378660935cb55",
+ "1495747092.0263326+9752cd41a971a3f09a3768e4c74bf89e26ba1a9d", "1495747092.0399308+59213672888a8f4756610b6ed8f25449128ba9e2",
+ "1495747092.053214+5e108c1a6f1b5aaccf19e7bc9446d023417cd3b6", "1495747092.0654185+7fe6181278f136d36bc3cd55d6f65f5e610900df",
+ "1495747092.0777006+a90779f060437e549fe7f951068415a51a232173", "1495747092.0892818+47c25d77927252d6fd93c61389d9e3e508f79398",
+ "1495747092.1011422+a4a872f2a95e20cc87ba5f09f8978d70dc8210fd", "1495747273.3839595+426da8a2fa69b635ffde2aa32a3d8869a8b06544",
+ "1495747273.3990567+f29af60888f93968dd8d421bc1341bb1ab3f4b3f", "1495747273.4192746+7883acf70d1280d7ae5bee06f6dc2a94c141f904",
+ "1495747273.4369807+93770fb9876269d12a4adcb2bec8006c5c256181", "1495747273.463427+5bb50a007fb2ba7e901c76212623ef8b30542e02",
+ "1495747273.4805481+4e8887242314438cc09c29e83870faffff11343a", "1495747273.4971542+c878790883182b101e04d32347c6654d27ba24c2",
+ "1495747273.5100076+1086632376cf1c9f42d313fd3c0482c8fd1c5648", "1495747273.528004+763f32d647741f9650068ace56f312c95b758843",
+ "1495747273.5432942+f2e7ed9abdac8bfacfc1045181724d5e14c576aa", "1495747273.5583982+e8fb581d1a33f278d440ffd0dd72787f466b9ca0",
+ "1495747273.5761392+d51a4ffd4abe30fc61be47b93e037326bf55a85a", "1495747273.590531+23aad69b15ffa9797e8109d838790b57acba615e",
+ "1495747273.607259+5c755a7f071bcbc397b24810da920c26784e380c", "1495747273.6232927+7890769789f45d65a88de84052a73d5078e585ab",
+ "1495747273.6407323+3fc80e3f3cb3a0426ad4d37805a3478f93f9b205", "1495747273.6618876+2c42c344f9917b28e4694efa9789d815d9473c85",
+ "1495747273.6787562+f7cd7284d86665c70b8e3fac5c2b51e8516547bd", "1495747273.6948295+fa217fd36e91e61aa42fc3b28024548990d75556",
+ "1495747273.7111142+b3c24c7a301006f093d5c7332e101bf89186ab18", "1495747273.7273643+2a9030b539e6f0e7de89f7056a30bffb82d1518a",
+ "1495747273.7429636+56b56f5539ebd2c23fd3ad41d11900b0c2cc13d5", "1495747273.7590163+5e9e8f78eef581b975cce73d90ae3191ad160903",
+ "1495747273.7747295+958d0e90d35937eee5e0a270c9e5b4950aa7480d", "1495747273.787188+18fda7897e9a67e208b42d1e322e3d0383ee4efc",
+ "1495747273.7992735+93a7069cc12b93d0b35bb7eeae4e9396afe5b18a", "1495747273.811539+3756464653edd30c11e230dedd1c44b5775dcb39",
+ "1495747273.823913+e22a5c2a3c79a6794c3ffe57580c80e9e4ffd188", "1495747273.8364892+0b5863803216c3dde2d3e01bc2f2c250a646edf3",
+ "1495747273.8485234+916660c5692fa746d2475ab4f9cd34bb321a2daa", "1495747273.8608136+c2b55ae09a7f2e4dc1c0f7a89624c199ce2125de",
+ "1495747273.8762505+72a93e625b53f330a3bd45d00664f9aab694c00b", "1495747273.8930943+68b78da51205b6195ac0f69a1f2a5d946496cb2b",
+ "1495747273.9122589+caa1e51e20d85ea058870dc181adb1218a9920cf", "1495747273.933067+459c95acd666a807408e5f6442932c99fdc87ab7",
+ "1495747273.9500165+2ff2a58ac84f4603df381bb3a73082744497b664", "1495747273.9675078+4de6e2d60cfdd3c571e27fc3490f832470f4b4d8",
+ "1495747273.9841752+67d5c405bc17c1d8db2ebe218b67920ff9d1b066", "1495747274.00006+aeca46df5f2915aa31da66239b42a6630cfd3607",
+ "1495747274.020699+ff16bced5174be5588bf74e44e222e763ff74302", "1495747274.0362036+f2d8f466ebb0001164c56cc43033b2d5f026f735",
+ "1495747274.0520988+6299592930d3d6da5498118811cfbf11fd099783", "1495747318.7411635+e227afe52fcaaa11b309c0b59e8124ab7606977d",
+ "1495747318.761249+eebf927aaa45e5480b1f1e1f5466b58d74e19f53", "1495747318.777101+df1f68f58042544163e3ab6ad89192549baa569b",
+ "1495747318.7937384+765498cf117bbb6d3dcfc22b2238b38a69ed51ba", "1495747318.8100827+6306ceeb4170a33db79dd80c7c27c46107a1bd80",
+ "1495747318.8261976+2ce526b3dae009b84f95ab30610cc4f92408afd9", "1495747318.838958+af3612315cda30d5083c1b8f4e2a630f844d1532",
+ "1495747318.8565996+51278d2fcc08aacdcac5f24b8ff6b173887aa52e", "1495747318.871574+fe261478b5e1bb7316bb98958c0795011f537083",
+ "1495747318.8860536+fee000e25aac515a0f4c82ca6410d80b24aa00ad", "1495747318.8990283+8964645ec4f2e8db61af8d139fc7920b4fcd7ed4",
+ "1495747318.915009+ff7d7ed0af67abbc1f6ee2c45eeeadfe1f1de5c1", "1495747318.9306657+47ebdf52692da4d3d75ea1c77d2daee65b3dd1e4",
+ "1495747318.9468188+1772f3df230010016d3f64c932a41deb2b65001a", "1495748003.4721074+426e7ddf1e6180e062ab15e8d44e3149644522b7",
+ "1495748003.4895697+61966f99b37bb3638475b6748836776f0bb34b16", "1495748003.5015206+0262c3ec094c4e8d785a288c7773b74f1e96ad10",
+ "1495748003.515108+0cf98d61f6c936f64f58772111c34dc8efc610e8", "1495748003.529915+06443e293803428881750b55c611a0ff6a9df9e7",
+ "1495748003.5418572+d6d58211bd1cef99b8a0276fdc9ffcec69c9af02", "1495748003.5548828+4183039945b26598195f19fdb7f35f198b67d8f1",
+ "1495748003.566938+8cb8078969027fda5cd46696871eeaa17a1e1c64", "1495748003.5843928+8915d2c18c4544c3b60fa3a063dabbec5d318df0",
+ "1495748003.5969894+824c112d7b53dbf07485ed32e85d22f19ef2cdf2", "1495748003.6091468+cd9e781910877f735c41be378cd5c72d94f5e2b2",
+ "1495748003.627757+774a1f128b002a428852a9e91d7861e89cc6ce11", "1495748003.6403322+ecf7dc2d86f3096ba743c310ce4c8fc5b6ebdc18",
+ "1495748003.652586+098b3b21d4454bd2672df4fb04781367acec7f97", "1495748003.6655343+6ad99533bf73a292fba8410f5b89cf374a64e848",
+ "1495748003.6774354+4990f418209fa0dc1e2ec6968068093caf609758", "1495748003.6934264+1c2aee62d0b852d70c601a7ee26de726eefc03ae",
+ "1495748003.7106507+6c01e7b670bb4a0e759da96aa421499a2913d174", "1495748003.7236784+a467a33db873f9b969d93c5275d40f2a2b127aad",
+ "1495748003.735746+f01a25c13074bb108fb5fbfa10f15a8a21f43ee1", "1495748003.7478185+0d824236e9df9c0eadafd4420182e06fbad1fdf6",
+ "1495748003.7596917+4414ea02befd9ab369d7de50bcf5fdb5ce7ae5eb", "1495748003.771622+5ff958e7504f4a199183412ce84db4c16eaa05d4",
+ "1495748003.7831326+a8ad07edbd414fd9e812ed09b72c12b4859b8411", "1495748003.7952435+64b4499bcd06909887fa4f5a514078840c3ea459",
+ "1495748003.8072124+58a789aa016f6027c5982301fde4560c2952f615", "1495748003.8193011+9b39a2ec05fc8b993b8cbcf81404e34a17197bed",
+ "1495748003.8310554+1147528fc0b9a125c5bef0d673e9c5ecd70b83e8", "1495748053.76364+9fdf56f41d9be7bbb869be2f2bf10254c7b08030",
+ "1495748053.7789562+6562af5813da41743df30e0ad8fcfc5d315f11cb", "1495748053.7944875+d020a75cdbc34cf9b14c5d27a466999994725942",
+ "1495748053.8064585+76d80fdcb276ef4d55fef6ed403650dd4488630f", "1495748053.8185425+e13c1e99ab2d2aecee9cb791a7f404f4498ef4c9",
+ "1495748053.8306909+65aadb7a6e22aa562590106d1c63f69c2ce777ae", "1495748053.842738+034f2be4df63ce4d33b313663a99c06c45b73575",
+ "1495748053.8554342+74b2b8558dc5ef5ed1ffe9946abaec717d2852ea", "1495748053.8714364+abf330302db67ffac1520218dd5837ce54380099",
+ "1495748053.8854105+9930c0094c45a2b73198cebcaffdb9844ac18cd7", "1495748053.901379+333d29cc65208e32b0f593fb6041720a471afb74",
+ "1495748053.9139428+d6cfa17908e3c9b60984447fc9940500c64cffb7", "1495748053.9273517+5e64341e889d646e1dedcb50f5d1b8e1c5a8c432",
+ "1495748053.9406261+26d211858b3434f24641bb3f5b70e71c3c6b3fe6", "1495748782.2606707+8103e9bce28206401b517727f224faef3b50d707",
+ "1495748782.2823737+d496c911d20ee089b947e3eb31012e1ebf8edf8d", "1495748782.2985225+f6a33941d8375ae919a4078fe9414965502e06da",
+ "1495748782.3144372+168669e1b77647aa7a7685d7b3b3e9614483751e", "1495748782.3304014+89e7af25d47182d5ea59a9fe197757259537e276",
+ "1495748782.3461878+fb215c681002d3aa475717550d9ebda2fe91a842", "1495748782.3617558+e2ca1c76103eb61611466a5d22929bf126506339",
+ "1495748782.3775387+a3f7b25f8f281c2c5e9a95d18948c154c69d8301", "1495748782.3949795+e47d33590b5ae9dec481c3a9bbacf2bbd80b91ba",
+ "1495748782.4134078+39987cc2a0524b836de20893f0938979c121ae58", "1495748782.4250925+619db28c636981d602d818404d7b0920ddd2a0aa",
+ "1495748782.437442+6f20266e5a196cabfff0eb98db74d8e365385990", "1495748782.4491248+1decc90862243b2d7d64ec9e4a4bab8270c30e80",
+ "1495748782.46081+3f42804cb2cd9373d65ef87fdd953cad8d90d515", "1495748782.4727793+1904a13ef1d5154d18769d2116c2b3c607e933f6",
+ "1495748782.484525+bbd736e58be97e5809756cd7800c568b76c85629", "1495748782.5004318+80917a67eb75fabc1460e649243c5477962fe4c3",
+ "1495748782.5166924+8c70e9ba1782f7f81904721a9fc254e15432a002", "1495748782.532378+77e5af2e4a9f2be60744062cfa67154a03e653e6",
+ "1495748782.5482535+de52c3c2d721485a9707c9f935c9f861a62c8026", "1495748782.5645008+b78dbac88791378d65940f8214407b9bf78faebc",
+ "1495748782.5802495+dd7bb7f57d0cc3df1cf745aa67ca81f293572870", "1495748782.5959733+4c1663a109868a6a986dd68597528b8cb0e97fca",
+ "1495748782.6121488+5d99ee94cf2059f8e16a173901ffda2402452059", "1495748782.6270366+df97660f6f7bc929dc0ddb633c71b8054f1f1117",
+ "1495748782.6433632+185346bd3c599a55bcdea3adb644d36b1c83a80b", "1495748782.6629846+424957d486f0441bb4c0922326237f61d358afae",
+ "1495748782.6844964+388927a35b65c74b0dfde752f491d2e59076c6c6", "1495749682.809845+f59cbd7bf8020203e72e76a8147bbdc2b9435256",
+ "1495749682.8236942+8a9d9a4face2be98495cd6858bacf6de6d643aa9", "1495749682.8358464+0835844429bfb000f4f2e7e9df2fa03ec658f6ec",
+ "1495749682.8475792+77caddf0a92852c046c4923b4c428ac61f072034", "1495749682.8637087+4da895acb6f9483f0812a2260847e69098ae1ae3",
+ "1495749682.8775053+d8a1eb2e9b7e417d738a5aa696d9f9b4525b017c", "1495749682.8916035+79257db65e6491a36d5ce16f69b09c4afd6b79e9",
+ "1495749682.9084516+e05cff8382a6932505e31c4fb094c7c94793f39a", "1495749682.9207177+b2351ce468a66de3f57f47ba8ff848baa97e5b68",
+ "1495749682.9336116+f362d77dc2cfa04900dfc4f1fad29dcfeb80754d", "1495749682.9454198+59a3f55d2b534baf92609f7c85c25782aed1ddf5",
+ "1495749682.9570966+3a4beea60db8206144a6758524ae6f992251f29f", "1495749682.9738207+ee9158dbeb5e7ac0b64ba748f885cb9681bc50ff",
+ "1495749682.9871798+9cf218fa713969aeea2fdf0b730ba05918810a76", "1495749682.9994478+d612f352692476d05dce98a5a113c06252669325",
+ "1495749683.0118592+d4177761f0999381b9922bc107cb8c2d095f7b75", "1495749683.0237894+48a7d07b377002de2930111f4287d3fe3e6fd0af",
+ "1495749683.0398777+4e62b4206b93069cc7dc98a2d4b318092492c130", "1495749683.052638+ed595e161600af3b8610437c8b21253bbdee4958",
+ "1495749683.0708816+5df1a256029b2b6f47910bf8cbdb711866371628", "1495749683.087412+638a1fd4c77e37be5a81c990026fb3869ec0ce7d",
+ "1495749683.0995147+336194d88e907189ab668aedd443c2cc05a467b7", "1495749683.117391+a2c89e287bc1b8e03c2291da0289012bb5801715",
+ "1495749683.1335511+73d24fbc73ac878ac6ede6106d31de76a757c324", "1495749683.1470203+5a13edc1c2fd26be2f30cc904e07dfd722f859e6",
+ "1495749683.1623988+e382387a8149f130430b87cb68f2fc61e19a6e45", "1495749683.1752+017d18c8898d43620bcaa9a98d75f3e68368c2c0",
+ "1495749683.1874151+daf5a91483238426da6968d8ae9db03a20577dba", "1495749683.1990952+c0ae0ecf5fdc5e48f134792196242ee616f1d4d6",
+ "1495749683.2113256+120b6544a47f2401bd3b06996de6b4f8d2bdd97c", "1495749683.2460399+f966b18cf8a69211e8fa2fb9474cc90c43a32e64",
+ "1495749683.2578797+06aa69bf1cbc727b1d146df052fab94e892ed890", "1495749683.271152+ba7ff3a588b270c737cdfde030de509960cf3eb6",
+ "1495749683.2851567+d14ab7d6774559c497dede3e1a68776fab676be8", "1495749683.3004463+e32a0197c2c59fa77b0f05bc2bb34bde435a0d80",
+ "1495749683.3163528+a86cfb720802d264bbb5653a6f426b5a60eeb3cc", "1495749683.3280518+282f88b1c5ab2cfdf61e36850d3e3d05bc4e77fe",
+ "1495749683.340098+9c0cb6571fe8a83e58061b925bda170723dc892c", "1495749683.3525841+8ce4beab0d896ad91d193dfed47814339e8a49a8",
+ "1495749683.3642488+cf175f56da0f49efdb9bea0301e507472c37a60b", "1495749683.3857763+907b811ecd654cddf64290fb57d3cb55fc032cd2",
+ "1495749683.3971136+554131be207ff364e52814b6aa74f5678c2d5094", "1495749683.40867+c9c01e255d0672e775a73873fc60560896d0216b",
+ "1495749683.420529+03fc854b5a3aed636c8db83f97a82d8a3b812c32", "1495749683.4317567+7360c43200083cdbb65ded741fbe9e5ecb6c9edb",
+ "1495749683.4431875+484a41fecdb757ed8f9ff13cbc91294944979f6a", "1495749683.4550683+bce7f4fef00564e48b4303f9edd60a46e0dff32e",
+ "1495749683.4668155+005970b2eac591ae6f9e6f8a52c0c4cf73fe3ed9", "1495749683.4861357+d3a73bd7cdad1ffe135652af4a8658e51d2d4ec7",
+ "1495749683.49915+d2a48d58d157f3b82b53f9e3e6822da8c0af800b", "1495749683.5121858+f7a53fd62a9e6ba9111d48c6b87190a76c9c914c",
+ "1495749683.5256689+63aac40ed10fd4bf3f6dd1f96a9d9b195b2d5b26", "1495749683.5371761+4711afb2c32cef0c02f37060dd0fac50e3576567",
+ "1495749683.5489874+3f35712d00719371fb064607448fec2b5af07065", "1495749683.5658312+a6b7fbf2564369b7587dac61a7aafe1151c006f7",
+ "1495749683.5804107+7e5703f211635bb87e98ff056de5b99aeff38248", "1495750669.4518595+a9016069fbbb636f372175611567e0486fa50527",
+ "1495750669.4669516+e15c43ce33611f5ae54a2467dec2b3a197bf7e43", "1495750669.4787374+a4abea39afdad077c4e23e61728629cc1286650f",
+ "1495750669.4946864+94c2d383d4a0e4975375df394557f99fe5c7c2b5", "1495750669.507065+2f39fb820002fd5c1b7772d987289c590f16fc63",
+ "1495750669.5302217+c76aefdb9f0aeee10e77f20442895cf27a85ae4f", "1495750669.5466576+65bc5fa4139f6d2e4b2a0e5adf171fc5135b5b66",
+ "1495750669.5590587+a554189f023c4c85842845ac84aef4b261b3049f", "1495750669.581304+b9bcbc7628e5846b58722d59491d8a2ffdb0520a",
+ "1495750669.593083+c9cc8defafab7298e2c03c6ea7e9142083e2e04f", "1495750669.6056995+24c14c426106d236c9b6eef48cceb0680e6c985e",
+ "1495750669.6190403+0512298c357eb6486cfd92a7b7ec2ef61b8d6e30", "1495750669.6359165+5b6e8eecaefb2d8013809336b8c24ccb9a77e158",
+ "1495750669.650129+63282c514e4ca56c4e76202998c2b7c0af74e4ab", "1495750669.6679003+8b27a4915e107fd3e1b6b99514e54aeb2a9f0354",
+ "1495750669.6827657+417ecaecc94c54c873b8a0bbd3a166c262d07890", "1495750669.6970208+5b909c01fd2072d81a9d3d3d6cf204cc0d8f41b3",
+ "1495750669.7117763+363e4c88368bd501cf41381ad20d9d9259e2cb40", "1495750669.7236109+f5ecf46ad35f91292b18b09468fce4eb68b663b0",
+ "1495750669.7367065+ed7fe2e5c5989ff17386562bcc303e0f4c1e119f", "1495750669.7506874+f37bb31549a5046dc0c7b9d1926fd198deecf209",
+ "1495750669.763998+d61b1c155bb740aa57a7a9199073cc1ff48255fd", "1495750669.7759128+09c856f16cf91bce408b72eee3db3077b2981c5e",
+ "1495750669.7887712+4c1ff555f59d61eefb62df8a074a27ef08489da4", "1495750669.800536+c0c0f8316bab93c026f12751118902634c35d495",
+ "1495750669.811861+c4d8c5151446812e51b510d17307ca16b8b9df07", "1495750669.8238068+77a57b4fe0dd0bb746668ddae52d4ad4de0001a2",
+ "1495750669.8353608+47e8c54e9f92b3e6168aa7fc85310781142a8c63", "1495751022.7491403+96498e3ce881bba40f5b98e573b87ae91a53bdee",
+ "1495751022.763783+a0a1ef4ead0788f6b93f04070c8ed7e116b6d9ce", "1495751022.775786+ca69caf2bd3391d35f05e7a9cd8aca121a4bd002",
+ "1495751022.7995236+7ae13a79573ccd7764b32ea88d9a717c9f84e3fd", "1495751022.8162608+1710d92dece4ce1cebf74ef69c81283279db2fc1",
+ "1495751022.8318691+b9a8e93ab0724c1b7a1705c21f376bf5c6f2ddd6", "1495751022.8456411+579d7d097718062e3051720ad9f71d3bb58c6ad8",
+ "1495751022.8579538+ed9e0bfba7552764acce310035ca0dfd436a1f88", "1495751022.8738666+834fd8be0c3f830c3c960dba87b3910d07499e63",
+ "1495751022.8855247+3197e7662290286c4752bcf8cf109d6f2008c93d", "1495751022.901031+774058b6fb303d82e62821aa135e8bc3f0f7c72d",
+ "1495751022.9189508+4112ec2ee66388e750213328f5b4d8b9d4d76d33", "1495751022.9336967+7db35f08a0a205cb645b6c2cffd5018f5df283e6",
+ "1495751022.9498239+587993868dcb435fc4784b1952161bcfe21bf1f9", "1495751022.96269+53b38c457c7c79c1631dd3e80f79599eebad8b2b",
+ "1495751022.9820588+32a726f0ac80066579b6fec8d3bfd73ec251ec16", "1495751022.9988725+fccb6e5a36dd6f15f7068a8583716a4aee28dc41",
+ "1495751023.0119903+4c86fcae6b329314ad66b05953595212e02dd808", "1495751023.0307033+bf3953dae90da3593136bebf99db6d8215ba7a1f",
+ "1495751023.0454676+a9218a50cb1c15a8f1c9e41ae81598c76cfd0ff7", "1495751023.0582337+aa00751921fe40dbd32f8c52bbd9a97d4ed029c4",
+ "1495751023.070343+015f6cbd9a8f9cf5ca56519306607424e04def38", "1495751023.0823102+3aea4fec3b4d957e7e299512e3c5142f4eb1afd0",
+ "1495751023.093724+2b1a90c0f3d9f391027de19896d5b50e57599a41", "1495751023.1053832+fe2bb90ead3bbde29a1b995bfe5d415612af7eeb",
+ "1495751023.1170387+a472ff0bf80de007bd5db51c2e5eccf43835268a", "1495751023.1289117+1d345a35ecfb6c2fb7e752e6985c63e072447bf7",
+ "1495751023.1407413+ad0b142a95fbd75d38107a744a05f79255ecf661", "1495751520.064801+d9c4435b46ce3e87d0d61bc6c74618d358e3c040",
+ "1495751520.0835414+c9b71a0337ae8d6773fec751c500fa314b6082c2", "1495751520.0979238+e95ef7be41e5236a2fc99c237172a30f5768ec34",
+ "1495751520.1111166+a835c664bb66b9161367577a2dbe39ea9f52edb7", "1495751520.1233535+dee6fcde1d44caca479a0f3c5dd5ee7b9cbe5622",
+ "1495751520.1353757+3fed10d3b3ca45b36ed8e5fa971244c8dab55981", "1495751520.1492527+f423bf6bf21f5e46e20dec7fd6012d170f81d5d3",
+ "1495751520.164813+110d5578a3f5fccab89d6a0aa022df65b854df4b", "1495751520.1818795+d9606daa8b66a1ba9af5fba44bb852c0be1b233f",
+ "1495751520.1975281+2e3da68fe7b2ddb1149ab0fcd1bc961190481d07", "1495751520.2127495+68cfb88ee783fafa9093b042cb5bbd1eab784b80",
+ "1495751520.2295365+44f1772a07b7e06068223c75a8397d4685dc18c9", "1495751520.2498586+f9147e47a796af744816b074271a5d4ea0eaa937",
+ "1495751520.270749+f8512bc932236969b5c5e391b6f5415723361267", "1495752420.3066895+1bff703375ce6bc14d8db816d4e98583eed77613",
+ "1495752420.3201394+3c6f794d7efc53d1f8f799c9bf7ea0f34b128dfe", "1495752420.332204+459285dda04cd140324a60edce12f700cc993248",
+ "1495752420.3443851+d93d788b888e33617d1ae4f7f30b5d3ff72e2e1d", "1495752420.3576252+eb5258701e9ea77b8f6501845be315a4eb123d33",
+ "1495752420.3720286+b1b051ad487a5ca2d012141169b685fbc9b44af6", "1495752420.3864832+1cfec3b80e351d109143f1bf4658ef9190fed78d",
+ "1495752420.3990502+4c082aa4e51058b87b835bc233cf645caa8cc2e1", "1495752420.4179528+3d75c89f33749101ff626729a9d752bd2d656875",
+ "1495752420.4300447+dabbc5e064bc96e36dc0c6bdfecbedfe97e4274b", "1495752420.4421961+8c37a12907e9633274678bdb4e7127f5b55603f8",
+ "1495752420.4579103+eb1ab9ad2aac66b60cc80fd213b6dd4b246f5c7c", "1495752420.4704187+7f9b910fd8e0243f2d02766e0d7082deaf422044",
+ "1495752420.4822369+d70701d6b44eceac8a938192772303b814cbf3ad", "1495752420.4947379+d2a8bb95b2b911c3569ab8e475c4305279196f9b",
+ "1495752420.5061302+ae2f1ae3ae97d973034bd45227aab880d9f833f5", "1495752420.517855+6bf1334dec4388889ded09c73c5b5d5192a20bf8",
+ "1495752420.5373597+365978fb3dc1b29f14887758bce2842d9ff2d1ac", "1495752420.5500116+b456d78f5da21ffad16a53333f5e2c99ae38b80c",
+ "1495752420.5808702+98bc5a9aa0ecb0bd9fb40cd6ddf644b5aab6b859", "1495752420.5977445+401556c28005cf28e67f26fefddfe54520ced6ee",
+ "1495752420.6144602+7f19e41bf93f7a2c0bd5a68a6943d35d79c4f31a", "1495752420.6310313+05cf156b5f83a338ad4fb48064d065ba1eae8178",
+ "1495752420.6451948+5d984824ea0e6ef7b00230f3b49e933a1a45e997", "1495752420.6570454+773eff02493ded56f5a4f1ba2be554f6bf5ddbb7",
+ "1495752420.6755664+cec2a9949dbc0ed7765e9cdd658eaefd4111bba8", "1495752420.6909144+f8e2adbddc85174bf68ff4a146d9457bf3c111b0",
+ "1495752420.7023275+bdf8bd324fd5d8383ce73b8c573782e9fabb4a35", "1495752420.7140396+4c35b8d92282e6053033cb848c090d0dc039e554",
+ "1495752420.7268114+f36b49eeb1b98e98aafc2dfe5bbae99b5df5c64c", "1495752420.7399113+36b1630d8571da9c1d158a4348167c771f0359b5",
+ "1495752420.7518115+e01001fc971153a8471dfecf17fd370430c99ea1", "1495752420.7647092+4656682f1c95e6e273fee64532ddf384ca351712",
+ "1495752420.7789938+74a1796a2956d836c663ab249bd95d483f0e05af", "1495752420.793465+eb512edc97d7abdaaf8b705270f3199d5b4ce0e2",
+ "1495752420.8071566+f8a0f1b108d739476a0dd800043459d6b559fe7a", "1495752420.8188038+bfd77623b3f7ffe8cb81b6586a43b570deda6bc4",
+ "1495752420.8314588+5a73190057ef3b0a5465e13ab196c5ec56303b53", "1495752420.8457642+bf69cc7f91d7e4e81e26eb13aacd8adcbdb4e948",
+ "1495752420.8655167+d3485ccb9d16ad19648842ba271675d554d60f05", "1495752420.8797324+a56bfceca4e1b56ed664290237c3b7ed2b881c17",
+ "1495752420.9011328+9e5d7b88c88faee170996db2fb2ca3ff3aa5bf32", "1495752420.9191294+868f64377c8a7b23312c857b67bbff99728f3128",
+ "1495752420.9314353+1ff4fc288b5d7d1dcdd15c707fd68df98c738d6f", "1495752420.9435358+71d1f4d3e8000cece8b604af56d235e9ec220de1",
+ "1495752420.9554434+a85100367f7d80240eb901f6efc5f3a43407911c", "1495752420.9672184+baed8f0ce3e11a090d80dbe1aeeb16f7a8204e6a",
+ "1495752420.9805617+ab0fd1c1825b80bfa82ddfd1eee2fb636c26e188", "1495752420.9973333+35604b9cc778fdbb094f290a78d88485e6e454e3",
+ "1495752421.009059+42984079225aafab478087eb78cab412125febd1", "1495752421.0213325+4a65ac1df95f045ea298b0e317b67e55a2b9bea2",
+ "1495752421.0377302+12d3ce2a3d109ad4c82ecf6a3ee906fd8a929723", "1495752421.0655978+e6d4541c31bdffc56278fc28af851e369724076f",
+ "1495752421.0802758+df9c81291e104126273047cf9a17511c40724025", "1495752421.0968146+1e0ba4ac0f0da0c29ae4ecc19518a72258b19e4f",
+ "1495752421.110257+045a9b04cdeaa818029bc3274ddb197121cd4dca", "1495752421.125354+d44c7cbdf61fdcaf15b26c650081163dff5ab7eb",
+ "1495752421.1373148+520da8bbdc671f4a5a940f1ddc789e10641faa19", "1495752421.154374+cbbdca079dbfc5b49ac0d6cad3757e197c43b286",
+ "1495752421.1668231+c0ce77e96dc04c358b9b2c4b79466447b0c9f375", "1495752421.182234+4f8da6e5fefc1eab5f2949bf872c7fe92611e51f",
+ "1495752421.1954749+60753c756919f5194a47599a38d9b21ec725dd78", "1495752421.2077436+13ed61856c163b0e37860e49cf9138908fcc1b59",
+ "1495752421.2194645+94b6ba912aebd91976e976647aaa7fac77004680", "1495752421.2337124+a0bbc85f346e7bc989353756df5c6939e716356c",
+ "1495752421.2454858+6680d656065656f0883c0810565c02ecacd83ed6", "1495752421.260053+60f397917aeab390062a3bb8ea1fd23449e5f9b3",
+ "1495752421.2737303+c081ff10f3480b76fd22a0ed53c91b8d08089572", "1495752421.285883+45d5729aaca67cf9a5cd4344655a4eca0e268c44",
+ "1495752421.3005736+a6c333a0031fff0e44393303dd1d58e7e3c113a1", "1495753321.3282838+fac2190fc53d668acca879162eb8c3bcff8d7da6",
+ "1495753321.342388+f59480c010518f72c8de9501b06f30aa6e828fbb", "1495753321.3591177+5b3492ba98ec585800f89ae1d5c01fc605a7d954",
+ "1495753321.3728666+6f3bf7a39e756e01dce205d36b06ef25ed3fe9bf", "1495753321.3863616+4f8882ab60ac771e61ce4555f4469aac239e4e62",
+ "1495753321.4075975+0f3063d03a8d71b22cdb167b7617c592ebaf77c2", "1495753321.4201257+dfd927d0da61aad77afffc5d2a66bbb510e86d51",
+ "1495753321.432815+ca09d511844e79d00c3553490d50c316005201fd", "1495753321.4472203+d17f85f03306b7be090050844cdf658cb67c067c",
+ "1495753321.459649+9d420a69e9076ed9c2f934ed26495c2b3d000771", "1495753321.4723628+ed7be67cb7c0a7eee74da68f68e967b4b717a4d4",
+ "1495753321.4879565+1cddfae8202c283643a5f2a71d310178167ea3a0", "1495753321.5068424+9cf1be586bc94350b41852f9116217aacab581b5",
+ "1495753321.5225062+d98700caade0d71f05eb4eaeeda221a8b870ef66", "1495753321.5416708+c83b42642e46928406b5ae674072189ea9536b8f",
+ "1495753321.560185+eacc4d268bc75c045badca5385f74769d0752de7", "1495753321.5751896+104857b08a0f960ba9a7a9f203ee3c498411468e",
+ "1495753321.5896833+c93223c58a977134faf288c2cdf8009a0a82534d", "1495753321.6034563+c32679350c9b86f20402f0b6e862678bf8cec93d",
+ "1495753321.6159325+5e6059b885d9d3be22bb6f4b23ad5e63681637e1", "1495753321.629835+df7864f3031cc28246693b743cb9bf0d313a73d9",
+ "1495753321.6417198+35c741c25d550d451b951892f1dce8b1f3b11fbd", "1495753321.655199+98463224517e23c5bc60bc48a64f452f2a56f676",
+ "1495753321.669634+df1ade48b5d700036f3d298f2444629ec4d3ffb9", "1495753321.683718+17578162fd3c1edf3e47d02476d14b0ecf1b1c09",
+ "1495753321.695625+2b19a151e63526b001dafbb9061a829f570729c1", "1495753321.708304+8f28ad05f06f6147b5e875968c983e30bf93a469",
+ "1495753321.7242506+19c36feeaa4ee3b9b117ddad2399a8feb32acc47", "1495754221.838669+60c1dd4a421cb82964583dadd163065b5cd473d6",
+ "1495754221.8508515+8a09c24f14119f3edf29d14221f653b6c22d6357", "1495754221.8684545+b2d6c794011e7e88301c7d013f257b626a2591bd",
+ "1495754221.8806474+06076777babac4af3dd2658eb3c1918b3709c2b7", "1495754221.8943262+0aa1fd35aa2c1d8d6b3beb7c1170b5c0d6236203",
+ "1495754221.9163396+8ff1ca5ac510cea203181ec4ac8e20078512dafc", "1495754221.9283414+3affac0754726e0afd3b3203c8d618a5b90b3509",
+ "1495754221.9404535+18f6915de3004a0b01e19447176da6692ceea1e3", "1495754221.9529188+2c9ccb1195f0f14061bc81f4edaf1fc635b2541c",
+ "1495754221.964611+974ebf6b851c552fcee2c35b4e5296f5c1af4082", "1495754221.9759426+e21f82c9e488a47351ede56643a4db1664142d21",
+ "1495754221.9878795+22b02b6a15e2ca52231b349bcb705f65e3fd4241", "1495754221.9994552+321c703065de360e6abc6600d6272b9fc58d3189",
+ "1495754222.0110369+0ffeecefb31560dc859f9cbcd7b4014472cbecc4", "1495789452.3831604+6dad56a41ff5f3b6f9bbc416c1b5401bc0a4c407",
+ "1495789452.402247+f1c7662ae2b6d3029b3c8cf83f934eeaf316a2b3", "1495789555.6400282+ae5fb77f71c6b9180a0f3e1f9057d7cf9a665690",
+ "1495789555.6606793+dd745241c53a209805fc81d8b22a6430cb19cf0a", "1495789779.7264163+5f8fc2a145abd0788dd100b0995943fc1fce5481",
+ "1495789779.7410777+b4c78903e0da828baeb01f84e2a8639f50db820c", "1495789811.6131487+9416f6362a794b4ac8567cf7ec1a5e3441c3e821",
+ "1495789811.630111+63580018cbd3bacc693dc9b51da776bc32bfef4c", "1495789811.6454713+62d99bfac3e9333f1072e25f808a6eb4816ac59c",
+ "1495789811.6609762+d234dd1fdf3ab4d3e29c2898d60d8ada82a97654", "1495789811.67656+432a8ae048aea2f24290d1025f1a1574762b054c",
+ "1495789811.6921914+eccb03441cfd52e8bb42d1a6296772e2342311b5", "1495789811.7077823+900313e5c0e0587397ba48c402b186addee260ee",
+ "1495789811.7235386+aa2ea1dbdbdec1e8970e49cea2fa58a7edc8a467", "1495789811.740963+cddbb3f8a4d441bace79eb69f0a64c5bbeed1de8",
+ "1495789811.7628255+20c692a8b71651461a728050adf70eb8859c1587", "1495789811.784547+4b43d9ccc6283557ccc39cd36c83038576b65d7e",
+ "1495789811.7999177+21dcd7d7b9696006a509acd34c1acb3caabd62e3", "1495789811.8169756+0762fe26a9fd8d69e7cfa81134e1e189a36a5003",
+ "1495789811.8301387+485c41f405a0c51b42481bf1d74732074ea4acf5", "1495789811.8451965+9dda760d82c4c731bc20bdb827e03c0a28fe39d6",
+ "1495789811.8620617+977b287903b269df526555f27bf335c564173ad9", "1495789826.9772007+505907a85bf55e97fdfd6f64a804c92c78ac81ae",
+ "1495789826.9977891+8381b720146abc7ede22b09ddedce540e998e480", "1495789902.126444+f34841594d1e4e406a5e8c66adb5125664b4129b",
+ "1495789902.140567+92e1d47b60cf1a038e9d36bf4de110c8e85ffa53", "1495790802.202679+c68c54b276927edb9782f17c4e9160b37a445b67",
+ "1495790802.2159505+9d001f57c79008d0c57b70bca07ed848e07c5ccc", "1495790802.2279747+8660f4437dd48a61a6733813aee757b017ff01df",
+ "1495790802.2395535+ad74e7e52b98b854946de1486ad27953086bfb2f", "1495790802.2511697+cbc0a0c15f1a47de26e93e2c2b0d79fbf6a6ca8f",
+ "1495790802.2630672+c0009fa48617175ddde6c9eaaf3e73fda8c38cc7", "1495790802.2762504+d92c6ad181c94f400204a568c54ce2c5ce8f3e2b",
+ "1495790802.2876177+e392dd67bafc8f5151200db46debd244831d8bc0", "1495790802.3022423+1c102fe6dcce2e132d96f76978699c2f9a53d791",
+ "1495790802.3169153+5bc1b7c1f68ea9886015f5db97d76bd58c6bffec", "1495790802.3367207+05d3aff7e2d9c4d240c5c1bb3720da3026fcf057",
+ "1495790802.3516364+32bb3d064b01034623e4e576258f5ae0acc1b84e", "1495790802.3646958+a78a17c76bc144f57d0f1c05b6deef8b24bbc86d",
+ "1495790802.379113+1ef0303fb011c95d065df0c024fb0a9ba75433fd", "1495790802.3905153+630a9ff48f9740f3075ea042e3c6b8bb5d76937a",
+ "1495790802.4068997+f0aaa81b11e2f39c873ee87edfb420b6253c9ceb", "1495790802.4196942+18b4e221ecf0f781d7b8bf23d69dfd8fea7d90c8",
+ "1495790802.4317248+a5d92a14234a67fb6413ff096edb54f9aaa12cd8", "1495790802.4515095+9f5f1c01f4005e47e2bb10fb5a11189e309d65b4",
+ "1495790802.4675653+5c29da4694b0b63141bf9a14dfecd04cc57a385f", "1495790802.4798563+68655254c796e8aee55b385d4995df45448824f0",
+ "1495790802.50048+ef7bfd1184e0a728d3def6e7b83177c9726b2feb", "1495790802.512934+6d7c901d6638b62ccaa15353ca83806adfd6dcaf",
+ "1495790802.5279396+de902bbaee92024a996ccfb86a965d601b4fccea", "1495790802.5450163+31f15c5418f378cdd70fede6543518c2ac6ef326",
+ "1495790802.5609016+e2b7fe3d9c1f0f6ffbaee4eb409a70333947c756", "1495790802.5748882+36225ff73a9b3b9fa716925f1ad8778d66f9440d",
+ "1495790802.586915+783b645806638442b005799175bece2bd1e5f02d", "1495790802.5990057+8d456048526157981a833fbdcdeb77c53fc7969b",
+ "1495790802.610562+2da1a059dedcb2fd6a1e6055d4acdad4105f9b72", "1495790802.6237872+32d59f176eb71ad926fb9d983fe5728c860e6801",
+ "1495790802.635599+4f542ba7a7af356625f8653c8d97c1fa7c6cedae", "1495790802.6471288+e6ec344a81535bdd91baeccc1f65bde37b12d816",
+ "1495790802.6627517+2ffe2f7ed95e74c571f2fba02176a04254da06ea", "1495790802.6773362+5e4011005ff1929b87e1115f89a046f9c5fd2b5e",
+ "1495790802.6952453+13aa840def9ae5234fb88523ed0538ebd27df209", "1495790802.7154775+527913df3066a0a93af4bd241a4f894bd6a3be6d",
+ "1495790802.7380223+dc4dcdffba84df85dcc5893bc82fee16e47a9374", "1495790802.7537863+5a52b1cab2ec39d96a4f28dd7cb389fc2805b638",
+ "1495790802.7711527+6faa26780fc6135965f4cfbf069f80daf2bb9cc6", "1495790802.7883422+2049ed4d7af9ae9746100b9b8e6714bda7f4ec3a",
+ "1495790802.8066173+c2eeeb149b95d993a62f56672dcf1966eb924798", "1495792602.8546536+9f12f68cdae91767522a33aecb8102a9b5f66b9e",
+ "1495792602.866044+1a83194f9e5ed5a7db6e4e3e4f587636e3fab674", "1495792602.8774686+8cfc96e24691d92dea1c7597e944671b0533098d",
+ "1495792602.8893375+731c56306bbb04c19119f60d8553e122c4d473cf", "1495792602.9010625+0406dd43f1ca7de793d2179f658a33e9a66d52f1",
+ "1495792602.9173436+461d1e9e0fe63a6fc318121bc17edab46d2e88ad", "1495792602.9291875+bf520a3ab2b3fdf624560029853be513d130d1d1",
+ "1495792602.9415007+e3ae602aab85eff9c0f5f2fd22f1cc6043ef8be1", "1495792602.9537535+addcdcf4a617719d5a74e04dd28127fc9aa83157",
+ "1495792602.965891+7271ce7302e612b402dccbb7b5aec7c429a4d8b2", "1495792602.9770634+48e54a58d73565f4cd316703bbf0382a846fb478",
+ "1495792602.9971628+c076e3c69f7b42eda0532293747fcec0ca7988d3", "1495792603.0095594+5b2765773b1a2423cda58c54fc4940ab83b52377",
+ "1495792603.0219095+883ec5b31a6579ee40434c95db1a80fa6cbf5cc3", "1495811297.48684+015eea02690ef5a83e06169c8419adae4ee7251a",
+ "1495811297.5097258+91a9e3e77b9607b41686d78c4ac99ad78afa0906", "1495811297.5327387+4ef741893ee8ddd73e386232ea6f93855f9ececd",
+ "1495811297.5475485+6cc093bb6b5fef4770db3f3e8a226cb8070527e1", "1495811297.5654945+5b620659106c36ff2808c59612a477e3e2ccd7f1",
+ "1495811297.583554+eef1e7e17239f4ec03a4f72a8966a92424661945", "1495811297.5998092+607f73f89b75480d83d6bcb37025673773dbf681",
+ "1495811297.6166751+a0a3866677a8c5efd8c3832f6888c91012709f0f", "1495811297.6357644+56c7a43ab9822491b1d263c01027e7338df13dc8",
+ "1495811297.6551392+ca00c38ef3321b62dc4b6db9a724958b0fb8a234", "1495811297.6724234+ae4d1e3f69e5e084e0522db1bee57e92b7ed42ac",
+ "1495811297.687952+661454742d301e2a93264806ec172e2d5414238c", "1495811297.708158+9ab33096608b50b09c55bd1e329d9749758d6879",
+ "1495811297.724058+0db4a674b03a17c54b121962fb4540dd1bcaf7c7", "1495811297.7400424+53ac023045eb9b9efcdabf661be7994dc5953a5d",
+ "1495811297.7547512+5f8f8a882b21429a5c41504a5099ee769e4d7e5d", "1495811297.7781713+88d6269ba289f4085d43c26301ee494c1878b8ba",
+ "1495811297.8012338+2c03fd8c2802a3242828d4308ced1dcba329c1fc", "1495811297.815399+dc152355a9c10c9a4db6dd3eee2748d85a02b953",
+ "1495811297.8325038+b7117e886da9a5f7d5022ec08eb776812d3ed195", "1495811297.8485081+0fa3cbdba44b54876fb8d4e153f1efe6bc1dd805",
+ "1495811297.8615742+3282db138be3cf453f1cf6397372372117edee4a", "1495811297.8750384+a4088b9b867e43a6b0f50faa4cc7c2fb455584b0",
+ "1495811297.8915973+96c852e1997623c027fd21e36d303f873df45322", "1495811297.9058218+4e453f560fd92c2c7110846f123f019aa9f12ae2",
+ "1495811297.9231439+b50af1423aecfdc28562b8e26bedb2dadc939231", "1495811297.9397743+481e8de1c8bb61f1edebdcd3c617a1cf1bfad36f",
+ "1495811297.9556968+f6f7427e1d45490e3decf66046e0917c20f7fadf", "1495811297.9686198+5a95ac15a7db7dd817531ca9dff46ab82b7137f4",
+ "1495811297.9828386+b2dead916eb52c131a02a84ca47ecc63f0ede98a", "1495811297.996158+e6f5db4270c10647fb972fc053594ea9e83dc651",
+ "1495811298.016748+ad08245c9dc94b9bf9d1873c956a8afac5855b12", "1495811298.0407176+ddbfe14d12ffd100a160fca6a4b4d3173ff4e049",
+ "1495811298.0540154+bd442940c099dea673409a93c00c6506f08eb465", "1495811298.0684073+38934561583698f1bf4f674eaf215dcfee2fa677",
+ "1495811298.0863764+23734f3daf2a5266c95aa2d9901586eda80943b6", "1495811298.104018+8086531fa8d5178169e202558c8062ef57ade56e",
+ "1495811298.1199293+bcccd2238f1913393acf0733e34d9972f16b751e", "1495811298.134258+bee55071d86892873bb0a65d17654e1be9cbf5c0",
+ "1495811298.1540616+f76a64367020a04da4cfcdabd19b20784e186e24", "1495811298.1685693+51115898cea35f5afff4a47d04fb7ef5bf4fea4d",
+ "1495811298.1874597+96d0272789dd82c58f9aeaf95fc38d6c3b8661cc", "1495811298.20421+7ed74ac6ab3185fdc21c2921b69a24afc920ad2d",
+ "1495811298.221717+674de277ac99bd69dc7d92641f86785d04e79d6b", "1495811298.2425327+7235c579c418fb942136bcf9c72abc9b56f28de4",
+ "1495811298.2626553+52e48b1eeede005657dacd6a4c1f72970fa80e83", "1495811298.2824476+6447a1afda17b040cbc456871386acc51b6e4ac4",
+ "1495811298.3115294+e35bf5d6c086228e94c4389f69d968fdfaad5df9", "1495811298.3376052+dd466b99488bcc97131a4eb3eb4a8b3acd534828",
+ "1495811298.3537874+73ed6d8b7783e529a5bf1326b77ceeeecfb378fb", "1495811298.3714864+bebbe5a0583176430fb1ba04703795945b89c8a6",
+ "1495811298.3853528+cb0f20f28e32928c12127207c317849065467a1e", "1495811298.3998516+4144c49978ccb067f37f38da6bf65ff615b43a23",
+ "1495811298.4133892+d7db61b6407efc650923239c9807b9558398da68", "1495811298.4261894+6fba7dc585205e6060eb04d4e0fc21dfd617769d",
+ "1495811298.4402242+59c80faad9ff0d2327e4c7437600bf001d199a1c", "1495811298.4583123+54c7368d1f049cd3dbb42debdc2d657dce9af41c",
+ "1495811298.47352+ec1e2510b34da402a2efdae0c9ba8be8ca82c714", "1495811298.4892187+c864ecaf8dafe15182046a3ca6488aa91ff23c03",
+ "1495811298.5084312+28bee1c56dfb75a83b0cff26566f8bb87f650d75", "1495811298.5233393+591bc2c5ae96f9e32d1c8053eb738112346c2d0b",
+ "1495811298.539819+3c49674043f155d8cca4d4601fd1ab49be7ee672", "1495811298.5564613+3beb6c37a2090394d45528ae94cf957e19a9dc70",
+ "1495811298.5690305+26f85a568fd35dcb253b90428d6836014eb7714c", "1495811298.58582+d85276f73a55e8ce6153c5c0322724e530f181bf",
+ "1495811298.5989718+8e92d5d839c76ca58aebeff12ded418871f876eb", "1495811298.6174212+d270c6015460d7cd766e2b978016dfcdeb5f9e5d",
+ "1495811298.6377182+1e12b733544b8876a85d925c1218a257bccb553b", "1495811298.655175+df21092d3b060cb69e7d8e09f8f06d1b42dec41f",
+ "1495811298.6806843+0f73ddb257eee9656879dae3c06f9adc8b91c07c", "1495811298.6959534+1fd8ce2a0582800ee476d8a21a9aa33dd32b5e3a",
+ "1495811298.7231352+ed7090e647875a1b363a18cca84c8e131dd2b598", "1495931634.804929+2b7cabc0c8b1f7a3771320690cdb6c551e47ac7c",
+ "1495931634.8236609+d4a913d1a8cb9dc9d445acd32179f4e4f40f807f", "1495931634.8359585+ffa59f883a0700c668e7f2344b5addb8314a5216",
+ "1495931634.8483367+93f277de0ea71c8a2d4f94bb7479459c3243d9f1", "1495931634.8606777+0ce94225d0e0040b9ab9acd89a564ccddfcfe00f",
+ "1495931634.872712+73aa7a6f7b29a3dd7537b1bb5ba0679962b32305", "1495931634.8886843+ea9e5b251a72e9e277515e03f48e53020d2f7653",
+ "1495931634.9008784+fdefd39b0964fcddc6e4ff222ce58c0804750078", "1495931634.9141703+52e5f7f875a3c32aa68c64d9d3d0e47f33d52ff1",
+ "1495931634.9266531+61c02fd2cf1c129d2ba99239d8269dde63ed1fc1", "1495931634.9387932+aa36835bed470482013003b9ac22543293a43eb0",
+ "1495931634.956519+6d510dabdc937d2cf637555ec909ccd6673d1885", "1495931634.9741352+dd4ab1330b4ef1753f078c71240ecaef536b1b4e",
+ "1495931634.9907863+be8a33b5ccd0640cc642c112f27341bdc7e0f8de", "1495931635.0039217+27bcd4e5ff0a35ddd1161c366c4eba9d55f759b0",
+ "1495931635.0235958+d413949132c518679fbc48508742ad82fcc47dc3", "1495931635.0381324+f0ad42b887d7018bea2e73f4f605b25d6d9cc4e2",
+ "1495931635.0560894+97aa37a77ec7bb6cb78d1892a69cddf18c5e2b1b", "1495931635.0716546+875816f23ce0c3671ee3ee7ca4f1456cf276f8b4",
+ "1495931635.0858927+0ffdd42dffb139867ba589f578ace7a6a4c4787e", "1495931635.1090765+f42f68f62dc690c9a06c478fedea74c631b2c488",
+ "1495931635.1218696+f62091099b18f089fbbe6bbb3edc33dbcb6e78ef", "1495931635.1432319+9f53816b5fbe144968ae4a6c4e986a1fc75521eb",
+ "1495931635.1585124+9159af1a1f41b0feef1bf5470ba72749b6917e56", "1495931635.1739051+a43ccb9e36c17b62774b2d5dadc0c6864868f519",
+ "1495931635.189145+58479556ddfe7409d7d7cc582231ab56214d785e", "1495931635.2098806+10739ece0c229a01cd8ac65c80077b20cb617c39",
+ "1495931635.2324839+b34e2006ff53cd6ef8159e97eb67ad3661f71aae", "1495931635.251482+74b46fa84734a9b79eee54275e4cbb7cab639ccb",
+ "1495931635.2678955+1e226da87133400f94cc545b34bc71fb6bbe9c18", "1495931635.283701+51b447a8a22d96f6760f6516bc1ae57f8bd0c9c1",
+ "1495931635.29844+94d6137389a65a70cf80a392228a99cb689a8308", "1495931635.316741+509907b8788b495df10ed6e06b0ebf714ff4ddee",
+ "1495931635.330863+b4c3280b60bcf609f469470dfe18bd816979c15a", "1495931635.346286+ffd19510b52224166f9c7e1fdc418cf9149b90c7",
+ "1495931635.3600903+bed5512762029cd8f7df8552352c2289c78dd59f", "1495931635.3722737+b2820db7dca45f0fe730ad140145f95f24e66623",
+ "1495931635.3866394+568e120c02940679b45b83306bfb217b1fdb5e0a", "1495931635.3987238+b065566c2bda1bc7c097b324ddfa96daf908fb4c",
+ "1495931635.4138749+bca1833b36cefecc8f05e4518021e479d82867f3", "1495931635.4474814+45dbc1773bc9bf138004f60c69f1e31db82573ef",
+ "1495931635.4628494+2de738cc247191c1d432a8c48fb5b30e63db6f98", "1495931635.4800565+f9204ffee18bcb60a5ec75bf1cd17dc148937b79",
+ "1495931635.5067809+1a096723098e989fd6fe9de85a4efac3f655be90", "1495931635.5340025+5e6230a939841f4cd5f10ee9d85465a7cf5943a3",
+ "1495931635.5592904+21bcd4d3b45c093a2c74f9d4da8bdd85c6c4c9c3", "1495931635.5777166+1844afb2eb6f1e4e8cc674783d2db8478e2c4312",
+ "1495931635.5947318+84ce7bc0c73cd8631fd1bd416dbe177543007376", "1495931635.6115947+b8dfa9c05de7705f6af658320d7d90a528d8a8af",
+ "1495931635.6268022+3915fb47eae520f74f3864c6a15a1f09888cd373", "1495931635.6439302+a2221ef190c841c7bb321ad03d18424efccd9be0",
+ "1495931635.6614876+c77075da5636e8a352faba293f998d5ba752a4a5", "1495931635.6750178+34bd332f941a9179ff28f8c868f3274599c84f9e",
+ "1495931635.6906307+758d7e33a45775b754b24b8487ee70a627e24b0a", "1495931635.7040555+215247e793480ddfe338d3aa595e9a19a23528e7",
+ "1495931635.7189298+ca1ab4b23a6f1c4117ce9e48f96748b845e1f4c9", "1495931635.7341068+6fdb5023048983a7e96e9d508708637dc901c86f",
+ "1495931635.7485619+e7fa12d39e7b770ac1d1cc78a0ba88f7a59f2041", "1495931635.7626274+43191409ae8d8000407430f28660e8262f78e40d",
+ "1495931635.781535+327fa93173f6b09548e9fe26c54b375b12b115ab", "1495931635.7994955+98a09fc34f36c08f405dcaf9132e54458d4df00b",
+ "1495931635.813529+f906dd32929ba1fb9e75b040501fd27c17105d71", "1495931635.827753+bf05b097c300d831f0682f8dbbd781791cdcf379",
+ "1495931635.8398583+c64909c2f8e05d781649be317874c908083dec66", "1495931635.8552148+8274cd9b5952a73dd51f7eca8bfdc041e4484e27",
+ "1495931635.8706117+f58bc08f1c02f97efb8933e709906d0698fb7b63", "1495931635.8826008+c54757669258e1eb9be190bf7fb90dff4ecad2a9",
+ "1495931635.8957467+ee32b1f8e6dae8bede0bde95177f51d0b5b95768", "1495931635.9075198+30b7b7f06bae948f127e68e9d35ca570ac173d87",
+ "1495931635.9229138+86ff31f17431b4bce5a687fcdd6a6c48d6e432d0", "1495931635.935402+cf3fbfc3f5ce876bdc734d28b1c8547c41cd6533",
+ "1495931635.9479485+a33ad04a4f124084d564b16ec197dd42b37f2a3f", "1495931692.8829062+e5e52bf12e03de835607ad7a9bed9dd96a47e57d",
+ "1495931692.9002745+e7670601ce80234907c410a6ba46ee2d8c725ac0", "1495931692.9164608+62854a7972348e695286e1e73cb051aa36013ae4",
+ "1495931692.9319088+5d29ea81be7927fedfe0e16416075200db58a21d", "1495931692.9475303+8e3a5a26df56fdf7a11cb525cecd8aa7a4c2efb9",
+ "1495931692.9633186+64619fd568fd8efd3626b14ce4c00e6e2115f18c", "1495931692.983699+6e7a58d9bfb0745c5208fefde2302d6347572151",
+ "1495931692.9986746+7779a6f57ee02d8a4fe5d8a4b670e5f1a8f0bda1", "1495931693.01143+22c00f0745a6dc5d192e0f6ce995b8a2dbd76878",
+ "1495931693.0274637+eaa719f5a2d2dd79c6deb8facfcab08a1f252c7c", "1495931693.0391107+746f655915e82188cb27be83a3ba1772002f280e",
+ "1495931693.053793+b637c6a7b09d51867a0e78c3be4154c9e3b5058a", "1495931693.0660326+a3919698e67510b58f9063d480fc138927dea2f9",
+ "1495931693.0799074+0b377873d5cac3b91d9d2b4031b056fa915adef3", "1495932593.184007+f1fc0b14fe730ee7d6b247856cfd2856e28873a7",
+ "1495932593.2075489+5266bea5ce5321c5f98b21d1ee2f2bb0931246b0", "1495932593.2221308+df25f9ffab373b2020a61a78b5202b0a748aca52",
+ "1495932593.2382355+97ea5b631081b7a2cdfef16eba2a3fad58ae13f7", "1495932593.254551+8b9cfa56f63af3b548bf93a7f630726a8cad5f71",
+ "1495932593.277205+9bd6e08bf1d26bbedf6512f27587c82aba60d04d", "1495932593.2957435+43af2361d48201920a4bab19702658086a07dd2d",
+ "1495932593.318718+99f75ba89bddb9050c7a2e2eb48ea090e0279257", "1495932593.3356197+d553265cf87b0430055b3e2d7cbd57eaac443a36",
+ "1495932593.3550742+39ea85f5a26b0f4aa838c84bba0b2a8c38150087", "1495932593.3711092+216bc51ad6e944fb7bc62627c73b0f72906ef9be",
+ "1495932593.3891737+4a71d58629919752b8ff01bd1b113437d23c3151", "1495932593.4104786+fe4ecee603411a5c0839201acbe088d46e60c401",
+ "1495932593.425029+ce1e0fc3cbfdff2ceb3ab24b2d42dd95253e2823", "1495932593.4453+dc4430be3ff9732865561cc7de88b0c951c46368",
+ "1495932593.4597392+e940d0321083dd78413b79c00886c19c73ed5888", "1495932593.4768653+8cfd8991cf1ca10f4cd4ece914aae30d5f18452f",
+ "1495932593.4933062+915e53a5d4d52a578365dfc61dd9b07fb4d1fe02", "1495932593.5083334+5010fd8dcae1cdbec0b116e752dfe10a7def19d3",
+ "1495932593.5378401+8b1ad588ef138f828743a1b22c229d95d20ef2ac", "1495932593.555597+df2fab79f7c763a5808fddbc3b530915960e8a60",
+ "1495932593.5753117+9960e264eccb48b212211f1e0e141e021fe4e099", "1495932593.5923028+ab92bd2f7f34a9cf6cf76f0d998a1f3499e4688c",
+ "1495932593.6056976+5c12e3d1ca8f142998b99c708c0963b4b6cdb227", "1495932593.6218324+7d937a5ea8375f41ebd01ffe1662641a026da9c2",
+ "1495932593.637176+04d797b00acabbe708fe687872bcc323ed8d39a7", "1495932593.6567018+7ef169e8b6b553f9f1fea78772cff0ac7ff6a0b2",
+ "1495932593.6736722+36b65b5e52428db87fed47383e573754e13b4246", "1495933493.7202241+ec9947f99a29c0d71ed0456b600b3563c19469f4",
+ "1495933493.7342389+6e4184819e10c9df524fad6842656196639f85e3", "1495933493.7470815+79498dd3c59f0445d912960dbf3d4f2d50d8d064",
+ "1495933493.7704437+cbc2b4865914b7a138649ec0fbc18d4e9c4f2a19", "1495933493.7827506+37aebf4558918d358f0ea389db69a96dbf34c481",
+ "1495933493.7958252+bb8ac4b2abfed3c845cb32da734c628999fef388", "1495933493.808018+e112dcd08c2bc9126c4ce04cc8b858f3dcaa46ab",
+ "1495933493.8195198+5c7dfb24ea95ea338e0d8f7206b721b3b5efe163", "1495933493.8314118+74df646780a970ee8ae432f7a7a352fa2901480c",
+ "1495933493.8505838+43c94af933698c4d2c3e2ca8e2bf809362debc51", "1495933493.8634043+f04ff1e057d0e47b83a83bd5a07dd1334662839a",
+ "1495933493.8766227+4bfe20e6457eeaf10ffabb7839af75c2e073fb3a", "1495933493.8892508+cfdc56fae8490ff2896633ae09706c446e8c1b9e",
+ "1495933493.9020915+2812ff74a6b63f7e356acf044bbe8cee0d9e88a3", "1495933493.9149294+28b305aa9027a9ca92fb9ab76b3c15f3efc56a49",
+ "1495933493.9272194+57692f7fe3022ddd44caa0f612d0dcc879749ea2", "1495933493.9401526+e0b4956ef75a5dd9701c22ed3a2d7ed2230c2be4",
+ "1495933493.954081+45856f8652dee8a9cfb3f21ac80986d0cc3482fa", "1495933493.9685826+fbfb33e264c62cd96d33097edb45b1f7812e2245",
+ "1495933493.9860475+92bcc49a11757a00766ce4b2d3369d53d3646f09", "1495933493.9996169+fc621c1161b8e4126153521035a8e1fc95359d5d",
+ "1495933494.0291345+ea2f81c2e93be732a40a6b52f41783dff7bdbffe", "1495933494.0418844+d681ede8b82ab3b882ff6d5126eae6190d94eba6",
+ "1495933494.0536091+97cb814c66c9d64ad6f347a43812c0b1a5f4eeca", "1495933494.073634+ced86e320dd7a620b844479b17e697d680fcbc12",
+ "1495933494.0866368+4f9c4a80037a31bcd0ddd7c22a9eccb0ae38df8d", "1495933494.1005878+20a4cdbf121856baac2acbb3258bf318ec00dee1",
+ "1495933494.114825+b67fb6bf777daa54f1937023f121a027416a8be4", "1495933494.1282213+be4949a36ab53a8480f0736d179c0a100c173252",
+ "1495933494.1400504+52ddbd25b5647fa55b2d21c1dc941699a1441168", "1495933494.1521404+f519a87db0463bbe742c8b5646d84d8dac431197",
+ "1495933494.16507+d00a97d8b441fe85dbaef8fb724dab5ab6833332", "1495933494.1787748+ecc79d9b9dc2f49002d0c6bdfe70853d092a4a1c",
+ "1495933494.191304+83151bc237c2e1131c95c4c53722ed592e09d240", "1495933494.2109883+b37210f19332b5c916a1226543801f32991e8127",
+ "1495933494.2277699+7c1a98a7afd42754c4a845c749e74e75b2866cb5", "1495933494.2394936+6e3d7dbbd3d2ced328b8ace4f2ad7beb3c8f299f",
+ "1495933494.2517333+0f3162493de000be679e6cfc79eb692ddc171f6e", "1495933494.2668924+bc6155a11e3d3e807670632350b1eb12e51a33b7",
+ "1495933494.2811291+68a0785f8c3072ed15fc6738209f27ef5279bba0", "1495933494.298407+2c3d6dac58827f686c1987b6e2750dc016e18650",
+ "1495933494.3113127+053bd644c176444f52cbe27d921cbaaa16188424", "1495933494.3241284+b37bf7b223b9d907382887fca913e5ab20830feb",
+ "1495933494.3364239+1ed6ff1647908cefc2246209d1ef3411a6a34901", "1495933494.351101+530fb9dd69b4c4b6f2a048b32d9633f68c33c4cf",
+ "1495933494.3632233+09cd282e58c2c1d3b071a93424a4288d298fbba6", "1495933494.3757298+392c1412d7c79a9a7c44c59fecd34c8196c69953",
+ "1495933494.3910155+a8e58198d57ddfe27efbe54dacfd419bfc592fad", "1495933494.4040499+655e91713a57b07f753796726dd512dc63b2aee7",
+ "1495933494.4207323+e669054b82f99609120b1ce5bca60688337e4d0b", "1495933494.4334247+cb7191f214325f03f01cdabaa75777107a7f5285",
+ "1495933494.4463727+bf23dfb4e529eb98f960d071b1834aa94cf6d44a", "1495933494.4582727+791b13cadb88ea7454c4f75171ddb5c663a9f882",
+ "1495933494.470741+c1e01b568452f86fe44e3551bb7c52215418ffdd", "1495933494.4825323+1940e7f63c6467c3f27e506536fa308a456ab7a0",
+ "1495933494.4951115+cbdae03f7ec0b88f9305240c29e00e669f2bb730", "1495933494.5128756+2c648c57cb7ce1e493cf3e6b5a8d5ca25f2133d0",
+ "1495933494.5270047+c6c4b5bb9d69fceafd640a3bc5a2c308441165fe", "1495933494.5393283+121f5aa50031a184fef2041d40169a1351645d4c",
+ "1495933494.5521102+d7cb6cc91a8a87ef172b485a183266f3d2a6a059", "1495933494.5652096+033182bbd3e90b91b71bd77edda9b5a50427134b",
+ "1495933494.5791545+553cfd0336030ac5256d1f2bf79a1c77367bc99b", "1495933494.593876+6a33c9ba876576401def451cceece4efd217f56c",
+ "1495933494.6058147+8d5e41bcad11b4f007a02023b71af1b8ad0a7bef", "1495933494.6195636+81ba832c030014b24cd0f1f05ffd1413bf3ae293",
+ "1495933494.6312237+d988bf89b18fb873f44dc63b32e7aa33219d1a5c", "1495933494.6434224+e3032c19fac271a1c6754126dee1f3bd3018c745",
+ "1495933494.6553428+37e7747e1fae90bc8a1a54cef6b0b9a2ccb4b006", "1495933494.6679754+c412e6496db80e14a9352a70a210a92c8ae99572",
+ "1495933494.6822176+a78983298c349f530f3f4582834d3c4433d21bec", "1495934494.0493326+8aa683c06c172077ef0624db69f0c9401fb09255",
+ "1495934494.0796294+bb312715c9cf177a04cfac1133fc6c768fcbeac4", "1495934494.096108+55d03677ba1b803bff5b3ccb8d69e5c32b8675b1",
+ "1495934494.1121194+464e02e0c306e47ddef1fc16cf40c09304a6cf26", "1495934494.1330893+9be7480185e16b19f9388dd1be7c69bf4768c726",
+ "1495934494.1566868+802507c71250d2f16f306cf5be8f412e130b39f4", "1495934565.7165809+42d24a35b28972b1d106104bd9fdb9699c1bf5f8",
+ "1495934565.738796+a999718778e38685314319c3773181aa5e1a4975", "1495934565.7699635+fbeb78a95fa864012dfe70733996949b820e1d93",
+ "1495934565.8086047+943eced2ee473d70b2ec7dff030e491fbc896372", "1495934565.844241+2e610aa5eef70a9803d0045674f4e21da06c68f9",
+ "1495934565.8614056+6663575f9c1a0380e3dbc2f00fa88ef98f4d4858", "1495934839.6361778+fa466bdfdd7ab5b3abe8dfd7bbeb0f9f3de18de4",
+ "1495934839.6678379+b2c264afe82cedbc54a6bd831206e75657bc320e", "1495934839.6937165+c80450bce69de80cdd04c0d69e171c2ce93e9bfd",
+ "1495934839.717305+d3f2aa48d3e98fbf3c0fbb9c692f70eaa0665666", "1495934839.7399666+2fb74405dd367b41b718baa099d9363051926637",
+ "1495934839.7629461+f870970c2703405729527cf352def453e702a8c9", "1495934923.6909978+90180739e60c2e716f13c7e6a6743ed22f3e92ca",
+ "1495934923.7115705+811fc0215b48989b5234a861239e27733be663b8", "1495934923.725368+a4103b604204c50fb419b75b6cd23e79d2e04fd7",
+ "1495934923.7377214+e9c7f11dfef1754fb99cb4789277b35d9a5d6616", "1495934923.7595959+3311a31622a7a45723d83f80d31886f3d9d334fd",
+ "1495934923.7723465+69eca81403b16067cd052f777b884ee877abb867", "1495935073.906472+4a0c15775a2e4b6cdeea2033e325db1802499842",
+ "1495935073.9228556+6cd289be1699a5fd2a6c3e572bee75ae0c59c073", "1495935073.9349313+6267e05c9138a4a6c1063dff4a0586ac31ec3b67",
+ "1495935073.9500453+3c32f3dd1b327fe52f0ec3dc007aafbfba93edd2", "1495935073.9675815+6e096a42e693acdd3c4b84c70913e91498d11497",
+ "1495935073.986259+9d73c4f5934e017977ca1409022b6a5b66c3bcb5", "1495935429.3287752+ef37e1c9a8cce8f6737f9c357886599ce350069d",
+ "1495935429.347224+f8f897629a5bf3780b090386d95f8f0a27e1636b", "1495935429.3618639+cfb84e12ac65873d6280a8768280010e09bca2fc",
+ "1495935429.3810222+87bc73a9f2faa94bdf02880949b71c5da3ad7783", "1495935429.3961163+44a3fcf656e5b0257a99817cc75d665608814e07",
+ "1495935429.4135933+5c1eaf3917f3d447c5561bbbb32000f7bdf41842", "1495936239.2056575+3ae88cca588c264e450f37cc4e3e597b66bd49fb",
+ "1495936239.2295682+b978430cc945134108ed47b80613f4a9e55f20ea", "1495936239.243981+eda1f2905083da4c99b983528278b7e5cf147da8",
+ "1495936239.2568133+3cc05c83b18424e58fe01c2fab30f8c7887f29cd", "1495936239.2729535+44a39996ef0575b48d4676e4b28877768c5362c0",
+ "1495936239.290502+b5a863939deca187b5b8e9b794e2d8e182c26834", "1495936631.450593+0973e69281ca4821d70f64d75156aff005ea6e88",
+ "1495936631.4647856+dfcef9ff7b877a544e21d2e692309926effa36df", "1495936631.4821649+df6ae177d00ebd18ca96de819a8018adf7f71809",
+ "1495936631.4986184+c42dcf655b45fc9c43c01c2dc52096f1f9fc7685", "1495936631.519037+e2e1927f3fc6461012b82c3e479b0c1fb5927d6a",
+ "1495936631.5596495+bc513dd8831ea16aaa2f9c986a3360d62fffe02a", "1495936878.1311274+cfccec0b0da708e9f75bebe1c7e1460f195328be",
+ "1495936878.1516256+e045eb332b37b0ecf54790b1e88431c3d7fcede9", "1495936878.1778078+d122e63700d7f3a9e45e2a5a7c6f990b673ef2b9",
+ "1495936878.1962483+a6a51c76b0d5a26e723bd7b7b0d3215f420290f4", "1495936878.2137408+36147d11adddfbef023170b31592bc535063baf7",
+ "1495936878.2338953+3eb62ec339a0b0b46908884f4a037fd302224398", "1495936878.2503276+b73ea5e42461006b27f7f0515b713c00b6b10860",
+ "1495936878.2711027+8340177823d708b911af1a2a17b4bbfaf9138740", "1495936878.2890177+9aa4666debf252fb231466a44f672a72144ce3bb",
+ "1495936878.3074446+0bfaff272ad848e01019cce2c905ea02419816e9", "1495936878.3276567+00b59c76b031fb69db9a302cbd7803d09e4a7d3c",
+ "1495936878.347441+133800eb24f06d1c23b73de62e87965b7f4107e6", "1495936878.3628685+8d0fac2070714389c5d4342d8601c82f39881a1b",
+ "1495936878.3782315+51ce995dce9fb7d6ec2f327936df2c5d7d61549e", "1495937059.7556765+2a0cfaf1ad4cd587a9f4a92678bb4aaf980d7d1d",
+ "1495937059.7715607+f10c481d30b2542d36bd5f02b14bd991ca74fe2f", "1495937059.7863116+5f75f6b08e009761da6e9c7f8e962d1434e49d36",
+ "1495937059.8006358+dde91c8149208cca234e84734585fab11b5a4903", "1495937059.8130093+4ec3f5a17417f78fd74ef1987ea1666598aeb7f1",
+ "1495937059.8301294+ebdae60354aa60315dc61ec789f75590ec6dd2bc", "1495937059.8487966+fa4af059c071138ad3dedc2d8cbe5c6a34c3cc59",
+ "1495937059.8700457+29514b4c4f57ce59a083756bc9b702423bbb266d", "1495937059.8919086+ab70783e517f81752198c834ec8e1add5479e48d",
+ "1495937059.905934+5cbad5b744e287b597fc574983d222243c47e5ed", "1495937059.9209027+5e5aee8839ed9e12d839b667861878d5c26c123f",
+ "1495937059.9352944+200dc56090ed79f899cf7407c2869ef479c3e9c6", "1495937059.9474142+88022795f0fd93ccb38c89200e1e1f04603a42e7",
+ "1495937059.959519+e81b0e8f27874de7b86f87f32832796a045ae97b", "1495937235.7110739+da47fa66be11545b8a8c323b617fa34f7194086c",
+ "1495937235.7291505+cf496cf34afe86fd849160bb053203eeb29c9a8d", "1495937235.7461295+3c90093b19800eff66483eef8397c591a347369d",
+ "1495937235.760261+460a0fd4782844448b73fc7dd445c770bd4ef2a4", "1495937235.7723446+657081682d799c0ca35448cef96baa39b613b20c",
+ "1495937235.7906625+66c77bc759c4deebf6929f82e0749ba2520599c7", "1495937235.8040707+7b537ffbf0f35470bd890f6db652b8a714598d4f",
+ "1495937235.8236663+4e8649f04ea997cff2ddc725736baa98d4be54c0", "1495937235.8512058+bd635f6c8883cce8180b8a62a3a4af600af0a7c1",
+ "1495937235.8679535+9b74b819ad8e90c11ffb8626d32f7bb31dfe4d8b", "1495937235.882029+049e5547bcc9ba8781a290524256bcb36c16dabd",
+ "1495937235.8949482+0bea72ea4de39b5affae287e6fe953a8ce271e9e", "1495937235.9091651+f0059ebabb1e1c0c8256280184a793121373d860",
+ "1495937235.9232411+efc7d79e864decb200bbf1779cddf4264b231915", "1495937311.553424+783c972a9e839e0b1ef37460af3e872df2005f57",
+ "1495937311.5729568+8d97d5da15bec504ea8ba4f9577daef2a2bba9be", "1495937311.5853827+06c5e9364f6aebbeb43d8903a125306951fae4fa",
+ "1495937311.5998878+b4374ec15ade5f0d9120bc6e68c702343941896b", "1495937311.6157465+afee22bf8ae4ab672353ed5265d9673e6ca7e742",
+ "1495937311.6319015+a00f7332b680bc0355b842cf487d84ece72d524e", "1495937311.6441174+4bc8722d34aac502093055d9db05e3ae2552e4ef",
+ "1495937311.6641767+4751625ee98a1c790a08a5587a9f2123af6c8954", "1495937311.6865635+23cf8b57aec6e5f7d63b450130bcafb1fb1ba84e",
+ "1495937311.6989458+7025a8a101dfdeb051e00e475e9223b8613f25d1", "1495937311.7119875+9eed14ffd6a4f51fc937142debc44bf0fa6c6164",
+ "1495937311.7320225+49955e8b51b56964a25685bdf04529345ac1595f", "1495937311.7478454+1574b14fe412ba17b9809a3b66f740c55e4309e2",
+ "1495937311.765794+2c51b44ba76b9094f9b90887a4a0b18c74588913", "1495937375.451767+70d17463b2354b1cc7e3952bf7b986a0243f0f53",
+ "1495937375.4710574+014a22dcd096e1ce2ce6775f1b95f9fe17b39f6d", "1495937375.4834585+ea57a5774816e3c677d1adaadbf50d01727381ca",
+ "1495937375.4966388+4cea3859c71244b279e918bbd10987e1e10bcbe5", "1495937375.5112286+b65b085c302c885dd8f69e772b1ed31e84d13307",
+ "1495937375.5254216+961f61a040486fe381d3343f0f61ad728e953231", "1495937375.5401986+5e4b3c17750fa5f4ef68eb5ff88aa8334950cbbb",
+ "1495937375.5530186+ae19e982b52403603b72ac8595760c414f29023d", "1495937375.5677586+633b1d2c334785ec46bef91acca2c460c9599d29",
+ "1495937375.5797858+5d5f412c37316efc9c5a935da01d3718c75a4b6a", "1495937375.5910604+27b86ecb2f2cadb3b2af4f5489c2692ab6b99e06",
+ "1495937375.6027756+7761763da3bc91494976a02cbefe44057d1e9712", "1495937375.6142364+725b62304a032a2a73eec2e261e8e9d29a272a6e",
+ "1495937375.62567+9d441a94e197d39de062081314a9f85cc0fc1cc7", "1495938275.6851044+4eaf3e4e5cc052a8983e09912dce4e7ad2641119",
+ "1495938275.6999283+359a9d26969afc9a6dee374f6254ee7c8b424c90", "1495938275.7184968+e66f11e085add94215952702c5ea82024adf1948",
+ "1495938275.732946+31f6d621cc64a9cc5fdb9d2d999738daa912d640", "1495938275.7458124+ea5ee512d9e808311d5ed0c8e52f1c87f3562a93",
+ "1495938275.7626867+2180a54c7cfc09c813a7cb03fd7ccdf59777e837", "1495938275.780764+9a2775edbc779495859035d83c4c1b4beeaadf26",
+ "1495938275.7969909+8b8bd9a0efc19944f3089e0fae7979ab83f419f6", "1495938275.8127003+01bf972df87f7e4cfa3f0ae5b7f30a81b4fca74d",
+ "1495938275.8327796+14c95a9db4287f4b7396ede7f2f7aeca525d9b70", "1495938275.8475044+50ec59d617b299437d91eb2dbb3cbece9b281853",
+ "1495938275.864108+99cb03fcd9580c1eef5de34c3922d8529e619f18", "1495938275.88282+b9b1f5f1a70182e919d1737733ae829430734fbe",
+ "1495938275.8974636+922d20344ba0ea837cffe2894a7377aef271d2d9", "1495938275.918574+a7a4b289c251a99a17cc1b2c0dc1deaed7d0434b",
+ "1495938275.934086+389570cd70f022fe1da653906d243be1a7c579c3", "1495938275.9498599+866662e9160fc2180801025f03c43967c850b2f6",
+ "1495938275.968158+e407cbab4a9a1eec64c8124a7eabaf6599f3dd1b", "1495938275.9829512+52faa8b06fca38cb10d5abbef8d226b23257965e",
+ "1495938275.9991956+a52e2915860051c4b3f8d37f8caee89804c303f5", "1495938276.015193+c1039a1bef991d7a0809aff66ada680227637fda",
+ "1495938276.0267553+c71de0c1b27361a80b948f82da157b86f5defca2", "1495938276.0467856+86e2c6d4974fe1ca66bb8451a07e9294a46f7df0",
+ "1495938276.058769+05685277a766b2d07c1a30948a75662e38d6fd39", "1495938276.0781581+ce23892d5ab5f5652749f4a5f81f7ad17fb41986",
+ "1495938276.0911183+ef61eb7368b6307a873703922142b7571c034b3c", "1495938276.103398+5a55e34f62e782952cc40e1dedc68f97915a980c",
+ "1495938276.1161137+db6188f5cf10e9c8e1f0949ffcbad6b6a5652c62", "1495939176.2170727+69d51414709b9568e55e760147d8d9a47b717716",
+ "1495939176.2328355+3936e2ab15005908c47527495af023d630302061", "1495939176.2485013+45b21df90eb506e5f429d25f35ae4a54c3f5eed5",
+ "1495939176.266793+ed5983ac42ecf7e49260e738ca4ea1d41879a2de", "1495939176.2794309+04e20b2a892bf71db20b7a9f5d54fd2ddfcdeb89",
+ "1495939176.2954674+b80627dedbe17164ebdbc6ff5d67df9fed317b1c", "1495939176.312415+5e0dcca349dc711243488cab440d194f46631d80",
+ "1495939176.3291276+3bd10b6eb5db722846b2980d968adcff054b7c4c", "1495939176.342173+4aafe808f4fab945579779bd37ffece7b375a9dc",
+ "1495939176.3581204+3cd5e51e517e0adb770f46b796e01eeeeb326dbd", "1495939176.374645+34cba03ad73241b5f0262edd88b977537d24758c",
+ "1495939176.389597+0a726dad34ab68b94ffe038f15df37b57f2785f0", "1495939176.4046397+7e20544360e1a59b0bf7eac0f9a2049f2fc5db96",
+ "1495939176.416288+548b1592bbad10f657c56ce749a07ebfb1007e0b", "1495939176.4332807+93ce5df63b2269f81b9ae9a89bab3ecd09cc7d80",
+ "1495939176.4450097+d0a6e2ed588c79852234a186f0433b913a6f6d8b", "1495939176.4574661+c4d340757a566473bd2191e99456a40e1a4901a1",
+ "1495939176.4791372+70cc4a2adddc7183f32ad16ab9039c42e4cdb5bb", "1495939176.4912205+d1aca8986b01a4fc09d38f6b2059224bc43cadbd",
+ "1495939176.504315+f5399dbc7ffa7d0735e6b54f6500a7c62523a602", "1495939176.5157564+6a3ad7efd8bc58444d51ef52f07777418a49cab7",
+ "1495939176.527553+9c792aae4bf5b1636dd281d74f0a05be263451de", "1495939176.5407357+3177ce3fd7e938067b737e3bcf40cbe010ec2ae6",
+ "1495939176.5523202+428819bd8abcbd12f5581f541b465c94efa430c7", "1495939176.5636802+c097e6b01d8446f6433e820d104621a90ce5392c",
+ "1495939176.5752034+6674d59e58ad88911e6b1765bd163cbd5aeccf75", "1495939176.5872386+d082506df1578069544839f79f349531ddd356cd",
+ "1495939176.598891+adbb220ac3f916d98ac3f1c6a7a56e702f3e4e4b", "1495939584.8324928+1a40a094d2237a8ae7499f694d5955e32a5d1b16",
+ "1495939584.8459415+0513e6e58b4cfea603a86fa49d1724a0b01fafdc", "1495939874.658145+982be9c9930a2a90dea22eb8f026fcc1c1a569e2",
+ "1495939874.6707106+f74b2efa10170210400880d1619d2a40ff15c2e9", "1495939874.68596+c41204ad8ffb136d0a2e93e50dd36c858a26b892",
+ "1495939874.7009284+0ff13b796c0f01621bb70edecf0a17c1e3111fc9", "1495939874.7160943+d9d1f64d916572ec514feffa1f003f26498cd083",
+ "1495939874.7314246+47b413a7e58ade4bcb27f5e89cfadbe92cc9148a", "1495939874.746289+11e8a6ff7b45be2db621e29f306064ae55259582",
+ "1495939874.7616036+6bbba195b3880576b4f95de56dfdae3dd0867827", "1495939874.7828183+3dd259b806f1711b40109bd446e462a34c62a6cc",
+ "1495939874.7997205+b1cb47173aaea62d50b3523b740cd1c5807bd52e", "1495939874.8116827+327e870779111112deb5281a9ca3fd8516b29ff9",
+ "1495939874.826871+743383fcf4b8505ac3353a4b69277bf09eba1ddf", "1495939874.8396008+86eaf9e85b8c24efcc85fda9fea6f98e0a6e7109",
+ "1495939874.8606706+e1e7310415e41f05df32dea8b073c689c6b38a2c", "1495939874.8769567+9cfc82e46435f76dfb62b1101206718a71caaf16",
+ "1495939874.8947096+fed8191b5644db8e84216c0f3cc2b755f87ca5c1", "1495939874.9101322+ac87d922d8d3d586154392a48d06addf18b7ab41",
+ "1495939874.9261708+e14408633caace1f880cc5e09c9042f092acd4f2", "1495939874.9415846+3088806fba1c9be7e97382d3ccd528444e1a95dc",
+ "1495939874.9549668+769500f59e31265900d0c0771a5a6375c6bc951a", "1495939874.9746056+d1fe63bc1ed69d3d59543adf2ae7de550d7b04ba",
+ "1495939874.9867053+ada90bc01aed11306dc3921617bfe582443718d6", "1495939875.0083532+4a76035cc024a50b87858c1845f103301863d711",
+ "1495939875.0228937+e2f857027d899313f9f52f5d296f1ef472148c7b", "1495939875.0350819+a71570db2da5cac4e693ec917db4d1fd57231375",
+ "1495939875.0491176+1143212b53aaf432ed6cd124c83f93be9ed9f177", "1495939875.0614355+d03a4604d76047ee4d3737af380b69540b6cdbc6",
+ "1495939875.0734153+052e3e856c2c49fe60530c8dcfcd0977e61d4e5e", "1495939875.0854971+882029ad2daddbce87a94d02723e07ae78548622",
+ "1495939875.097414+70bb1d16be892b17b5fab6401f50bbe63468f864", "1495939875.109123+8e8a5dfdfe3efb7eaea757e41aa0c2498530e5b9",
+ "1495939875.1211016+fde77d0130d6bd4995bf9e850dda1264e2fdd9e1", "1495939875.1329536+1a9c584e96d8e75de7295763d770a1ed29ddbf60",
+ "1495939875.1446252+e9fc78f9e2b6f158d1d4a74e6b80cb94568569b0", "1495939875.1577203+c370ade8c4fda71cd2e7d23a2f30dfb0eb765595",
+ "1495939875.1694226+979df2615073ceb00eddd72c9eabbeeccc3aef38", "1495939875.1831846+959b842df4e5c161fa09ba3c0e61f57bc937b450",
+ "1495939875.1991496+0c149e383ebb6bb96b4f30c1eb0fc70c4128ddec", "1495939875.2140813+82680f833db4fe7335f74de34a2d60c225cfa0ae",
+ "1495939875.2292857+bfe45bd8438eb3c69c24746c62bb196549aae717", "1495939875.2450485+d5b15339b06d39072c2f890133da2467510e81c5",
+ "1495939875.2599742+70bfff5188ce719e51a40bc50e84ed3fa0e12811", "1495939875.2749243+6597fee1ca9a6be7ebf45d4db88f0e976d48d02f",
+ "1495939875.2908287+ce998c160ee4863373988b3062014de836be1aab", "1495939875.311688+1e0bb339107af0d9f721332d58e40c949fedbf3a",
+ "1495939875.3321452+cd51368754e31059e953b65768f845a38046d9ff", "1495939875.352233+e3c577ee1bbb28a5391930af4ed86710a86a9e10",
+ "1495939875.3813133+5405e82e92e707e7b1f104eebe580d30eb61637d", "1495939875.3987973+b149bcd39505be12d32e80b64f8ce5e998a6f0c8",
+ "1495939875.4148483+32ac5c84f33e081abb60df88f8991996765c786f", "1495939875.428774+e6fd65e372b4404cd570a3675629e568491fab0a",
+ "1495939875.4414196+84d97edd3a607d215130a46850c505d129a02f29", "1495939875.4531353+a5fd6b2eb05d4680d342400c849800d44f49db6f",
+ "1495939875.465708+99bc6ca806902c3e7736c4d0bcbf4f40625ec402", "1495939875.4940512+b6123a67e231594838c7cfb6c4ac83900d0978e9",
+ "1495939875.5123756+b164bdd1021686616194cff1dec3812539f68ff2", "1495939875.52854+b67e589b1d97a0a33e99159fbaee699e3e96a850",
+ "1495939875.541283+da5fa8b55f827f981415953a766435afbd19577a", "1495939875.5560434+5a0b7e2bbee3914b8b660947d40c2d2a93f7580a",
+ "1495939875.5712254+773b5dd6ce5b36cfc13602372c8507e4b50a2b93", "1495939875.588858+01311874eb1fb17e83021e2cc1e2f920f1fc6df1",
+ "1495939875.6009555+a222bdc83f85472bf5999a6e178236cfad3be511", "1495939875.6203845+b4247fd6c1003c46388309bbfa34482ba90aff41",
+ "1495939875.6318126+4a4a4348b90b6c5b8f95aa61dc97f387c8fb4b03", "1495939875.6505818+e2b863b5cc61fed801f45b77663872dba143ba2c",
+ "1495939875.6628535+6b6a5f2df18084975d07078440eb9a86012af9fa", "1495939875.6767607+09359a2d10dab441afc136cbae344e8e3d6949c0",
+ "1495939875.691169+69dde1cfa67d2e4a353611350f6f8e2bb07a5d08", "1495939875.70362+caed55ec62503f0fa7e78c5caa2ddafd1d397d21",
+ "1495939875.7163773+84df92856a3ef8370a4b58a87633683da17b3499", "1495939875.7324104+2f8ee0f6aad70f83124925e49afe96268bac5a47",
+ "1495939875.752018+ceccb8ca70bff01b064d9f019052d672e56e942a", "1495939875.7666883+15fa3029bb46c8ac1d7540738f462e4638ddd4f3",
+ "1495939875.779553+f0c46bd2e7961ee8b252ca07894c6b31f2858fa9", "1495939875.7920117+cee77533c8f1c3c37d57fac566e16eeb4a5a0ed0",
+ "1495939875.8099954+008b017c8e98a5fdd159dea5df402a486fbef133", "1495939875.8312814+33e232eacccc1c8a854c06c5e2ef2a457ba5aa4e",
+ "1495939875.8517003+de1add18861ad6c66304409ea241deb4e9aa1746", "1495939875.8707752+21e37a1ba40379eb936a04dce47865bddd532e58",
+ "1495939875.8959918+4a3b1b91237085336a710e77a01836e6ef87dd08", "1495939875.9150856+206d2c203909e67d2d4ee046fd8e465b4c3858d0",
+ "1495939875.934686+53061fc26bbe000a13943eb73aeec4ecd29f8d88", "1495939875.954755+72c0f8a8178326cc96110169479df3772169edb8",
+ "1495939876.002347+15e19e1235ae7bcd1dd9d3662da496f4a2a63882", "1495939876.0200484+d486ebf0c5ea97b3cb8d25304d70fcc13fe7b9e5",
+ "1495939876.0679355+86649736c1a80cc95ed59ee211f79f5f91ea3d50", "1495939876.116483+85b8b08857ca91fb468fbc411d1cb3427528a75d",
+ "1495939876.1327872+4240fc5be46b7694205a43bbd0a8f55a6978f5bf", "1495939876.150785+9d6621a9d4c0b82fc5d408de841fd868375d5c66",
+ "1495939876.1687725+61d2d3f5c0e32f0f33246ee8832e14481f634320", "1495939876.2108512+a7d2d6c0d32d68ceb50e1417c6da7354df43818d",
+ "1495939876.2290883+074969e55db43d98207cff2e5a21651cfaa5da73", "1495939876.2793512+665642e37ca1cab0ad6adb57c283617482544a4a",
+ "1495939876.2922997+fd7d4bf52340d31e7d2a6b3ea2d06d31a58c11c3", "1495942566.7415304+6571cbb8625748a95d3782918e33f4fd05b31199",
+ "1495942566.7571304+74a51a03a12d753668403569f34f61783f67e2b6", "1495942566.7721949+fb5789fbf50b7d21e44320603fe393ed615bf02c",
+ "1495942566.7868013+10595203f0115a8ccd29eced6307df652598176e", "1495942566.800728+476c7d10c46c652fe2cf87a9b74363ef022cb10b",
+ "1495942566.8129442+b91a4d73e0ea9a78500bd8077990ad1fea24d505", "1495942566.8275177+c35e47540c56a2573edd6c83973c5de5bf2a22fb",
+ "1495942566.8418508+216f000fb4198853ab9d8b1bf791df0b0a40691f", "1495942566.8601313+4cca0c4cd8d8b683a8cb3462c808a207a21cdc7b",
+ "1495942566.8727627+760889309b0f7f8ce10ed219b621b90001817b2e", "1495942566.8946927+42f54053b23920714e21a0af4f207cb6fd8df0a7",
+ "1495942566.9112344+f1bb233c14d5299f24db6f025df187e663532112", "1495942566.928124+ab7011d90f456d3e777c4153581ff82c3bf8e441",
+ "1495942566.9413984+1f0e4a3a6f8bc87500b6a49e6c4d0ca83f48f2c0", "1495942566.9571157+6e51e35b659c9751e1271b9acce63a8794ec9b6d",
+ "1495942566.9722939+48985be0ce1efa0bcfea6af97e212c8c5c03b6f8", "1495942566.9859147+793f8b39f61e098b38ce78210ca36a9832d709a7",
+ "1495942567.00417+6fb56b098cd671e5a43af48a6a74d887b56e3aa3", "1495942567.0162728+8ac749a553449ed512bf39cb83c4875896850fb9",
+ "1495942567.0310283+b8e1cbea9f4b6d258469f8a8575239eeab3574fc", "1495942567.0506935+1721e4df64fef1b5fa148a466c5aaf9ba08d50b9",
+ "1495942567.0673594+30c769a06ad4b1803229f542385919f65cce5107", "1495942567.0800128+afc8edf993bf11cd5413ff6ec738c81162e30814",
+ "1495942567.0937843+601b357a75e060d4dbd9664df268e960ad6c4540", "1495942567.1138093+04b99921090808a423b879a0aa3a0331f30acfa9",
+ "1495942567.128391+a3c3af1a889ffabe49d92db304e336eaea6f2e02", "1495942567.1428246+4f10e5a725c076e2c4de707295253498fc986569",
+ "1495942567.1569648+b4a0273dd04a0ad799f011d79f62a8158ad671be", "1495942567.172005+ec3aed51f5a14f28ba88a9753f7e3cb87aab459c",
+ "1495942567.18567+f3ee48f522890341e5e4d59df16942a0253c0376", "1495942567.2046013+f8477ff41b1b7dff45291098872ea29074106d65",
+ "1495942567.2274826+f4bf5860f79686fab6ef9ec026baff6617a98d86", "1495942567.246338+00c51fe1cdb743032e1180c15b0bc35e47be2ac8",
+ "1495942567.2660427+0d29d9e5312105cc6e706887b9acf65edd2b49cc", "1495942567.2834795+bbdca5cf52c52295e7fc3fae3cac2cce87fe92e5",
+ "1495942567.3021548+2521c6b01e5a12c03a60c740972627ed8762f96a", "1495942567.3231614+17cbee26695e2b37d4d237e8465ec97d3cd6c79e",
+ "1495942567.3382182+7d9e7b4afe2ed12897ca963dc26d12076691be3e", "1495942567.3558097+32b6cb3aa37256e2f631b0b6f64fe2788f3b821c",
+ "1495942567.3684149+1cbcd6a2993e1d107d9506c8a147aacfd042f3e7", "1495942567.3842912+346af1ba7923e9a85da975d1311b11661cd57707",
+ "1495942567.3975136+cbc994ed0a90b4e59d44e31f9147ff338d029fb9", "1495942567.4101202+8490bbfa3221ef5cb78ee709d2349d9748e86835",
+ "1495942567.42239+114be98c632ed8a164a425c36d264a2f5212fff1", "1495942821.6065452+262a8711d4cbe04b0e91152c2c870e1dacecc4a3",
+ "1495942821.6200426+10015343f37873fb2ac335c758dba667b6e09d3c", "1495942821.632274+0ce2fd1f9930c47fd7203eb064e6413a64972a1c",
+ "1495942821.651151+c4315c84dede4fc93590c49e60a720dcefe60342", "1495942821.667747+dc86634a5b611f0a575a031896218ceb53fd1619",
+ "1495942821.6842747+47bbd80879c59e2cdaeeab59f9935e33881fbafe", "1495942821.6969712+4ca9205cf95e04e95af4e3cf84caaba00f02f62b",
+ "1495942821.709876+2492f4a3e021b63ba19c566fcce2c3f0438355be", "1495942821.7273395+25355239207fadd2e1f5ee312e674c0fd4c0c6e6",
+ "1495942821.7430315+ab2f9bb50e54b4cd38c9a80e23eb03a323e593fc", "1495942821.754943+40ab94ffe605316898f9847da33e5dba014df3b6",
+ "1495942821.7669983+66c7773cd76b9d80aba49d9db20685c9bfae4f8f", "1495942821.7786486+3bb69d2cb18078671335d62e50c7b6d6b8f318d6",
+ "1495942821.7905688+da730792a5c5b9803d30be586da416a135c1412d", "1497760317.8593829+5e6b42e84f3a30b74806a47ba7d9d019650e4a19",
+ "1497760317.8694003+6c898c9f5104d3d3ae9665389381892c9a8e04ce", "1497760317.8957505+68dffb372a6e6e518e56c7c79df4eee9a2abfae5",
+ "1497760317.9078526+814d561b61632ecaf79c4b79b2e7ccc8fa4f3d31", "1497760317.9199383+3080e50b4db5db3b05bfb013ae0fd58b37b71402",
+ "1497760317.9319332+6fbe9a046a0ade466a73d7968d024791e100c8e7", "1497760317.9527853+dd3a06bc6369fb0035ca03db92c23f394197dbcf",
+ "1497760317.9716117+d3292b2bcc9ba5f749a61cb2b2e763071e57afc6", "1497760317.9917667+5fa9a1212c11806a243e023ff97b2e2d8f0660e6",
+ "1497760318.0040622+e52398361121fae19e5896d7178084cdffc0e1bc", "1497760318.0159457+d85d8a6a78d3bf01eb4d8d6452abd97297717749",
+ "1497760318.0275784+b8092e8cf240c8dba9b15b4aeab7168ecd54e1d6", "1497760318.0494797+7ca81a2ffcad0f5d5e29d67647631707753bcfc9",
+ "1497760318.0610042+1573fd1b0f5a1f43ba0acbe4e2ce201e2e84ff88", "1497760953.8782187+bb84a02ca1ab91a5f3b5e5051af64328ddba8f9f",
+ "1497760953.8843946+48796eae34243c2219be3d36310ccf3b05b75ed7", "1497760953.8901818+5a5a93ef256508c4ae66505d3ce75f3fd3efd5cb",
+ "1497760953.8963575+70391890e5f9ae8fcd2160e19befb9451301f5ba", "1497760953.902642+28ef7734762bc5218cde4ec30ed5aed29d72f4d4",
+ "1497760953.9085157+575296a1684427c33bb0337e4ab294629774ffd3", "1497760953.9148762+bd9de7b6e1f76cfdda8170cf8157c3831224e103",
+ "1497760953.920617+2da96746508dcf6049b4e8547f7afaeb37d4966e", "1497760953.926189+64ebef872916184c9accd9b1159d5e97ecc9a74d",
+ "1497760953.9321105+518d815848931399edad84cb5482ae806d01ccf9", "1497760953.9392326+af2799249f1af0f8581af478737549752f09741c",
+ "1497760953.9445915+d9d7258929e9829be106d7f37cebc3dfe6c495b3", "1497760953.9496446+4fac1fdcc4468fb7b1f9997d802ab1108f6dc558",
+ "1497760953.9536164+59e960960bb3089068fe3e9e01e1164448ac66e3"], "http_etag":
+ "\"afa1c0720cb475edd650d54afd23cd7b7da70da5\"", "name": "shunt", "self_link":
+ "http://localhost:9001/3.1/queues/shunt"}, {"count": 1, "directory": "/home/maxking/Documents/mm3/core/var/queue/virgin",
+ "files": ["1497761008.9721775+b00da38d241518ec7f40f63a9bc45943fa1fb312"],
+ "http_etag": "\"839f7d65e27c999ff5b8135807549e39f3ff281e\"", "name": "virgin",
+ "self_link": "http://localhost:9001/3.1/queues/virgin"}], "http_etag": "\"675ff44c6cf9c01d2e8498bf84a62affd6e07135\"",
+ "self_link": "http://localhost:9001/3.1/queues", "start": 0, "total_size":
+ 12}'}
+ headers:
+ content-length: ['103006']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'text=From%3A+nomember%40example.com%0ATo%3A+test-1%40example.com%0ASubject%3A+Something%0AMessage-ID%3A+%3Cmoderated_01%3E%0A%0ASome+text.%0A%0A&list_id=test-1.example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/queues/in
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ location: ['http://localhost:9001/3.1/queues/in/1497761009.0654283+5def81357593550bf60cb32e9a7ad82954b37148']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/queues/in
+ response:
+ body: {string: !!python/unicode '{"count": 1, "directory": "/home/maxking/Documents/mm3/core/var/queue/in",
+ "files": ["1497761009.0654283+5def81357593550bf60cb32e9a7ad82954b37148"],
+ "http_etag": "\"e94ac6924b57b42ec2af640efba301a5a22fa3f3\"", "name": "in",
+ "self_link": "http://localhost:9001/3.1/queues/in"}'}
+ headers:
+ content-length: ['275']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/queues/in
+ response:
+ body: {string: !!python/unicode '{"count": 1, "directory": "/home/maxking/Documents/mm3/core/var/queue/in",
+ "files": ["1497761009.0654283+5def81357593550bf60cb32e9a7ad82954b37148"],
+ "http_etag": "\"e94ac6924b57b42ec2af640efba301a5a22fa3f3\"", "name": "in",
+ "self_link": "http://localhost:9001/3.1/queues/in"}'}
+ headers:
+ content-length: ['275']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/queues/in
+ response:
+ body: {string: !!python/unicode '{"count": 1, "directory": "/home/maxking/Documents/mm3/core/var/queue/in",
+ "files": ["1497761009.0654283+5def81357593550bf60cb32e9a7ad82954b37148"],
+ "http_etag": "\"e94ac6924b57b42ec2af640efba301a5a22fa3f3\"", "name": "in",
+ "self_link": "http://localhost:9001/3.1/queues/in"}'}
+ headers:
+ content-length: ['275']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/queues/in
+ response:
+ body: {string: !!python/unicode '{"count": 1, "directory": "/home/maxking/Documents/mm3/core/var/queue/in",
+ "files": ["1497761009.0654283+5def81357593550bf60cb32e9a7ad82954b37148"],
+ "http_etag": "\"e94ac6924b57b42ec2af640efba301a5a22fa3f3\"", "name": "in",
+ "self_link": "http://localhost:9001/3.1/queues/in"}'}
+ headers:
+ content-length: ['275']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/queues/in
+ response:
+ body: {string: !!python/unicode '{"count": 1, "directory": "/home/maxking/Documents/mm3/core/var/queue/in",
+ "files": ["1497761009.0654283+5def81357593550bf60cb32e9a7ad82954b37148"],
+ "http_etag": "\"e94ac6924b57b42ec2af640efba301a5a22fa3f3\"", "name": "in",
+ "self_link": "http://localhost:9001/3.1/queues/in"}'}
+ headers:
+ content-length: ['275']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/queues/in
+ response:
+ body: {string: !!python/unicode '{"count": 1, "directory": "/home/maxking/Documents/mm3/core/var/queue/in",
+ "files": ["1497761009.0654283+5def81357593550bf60cb32e9a7ad82954b37148"],
+ "http_etag": "\"e94ac6924b57b42ec2af640efba301a5a22fa3f3\"", "name": "in",
+ "self_link": "http://localhost:9001/3.1/queues/in"}'}
+ headers:
+ content-length: ['275']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/queues/in
+ response:
+ body: {string: !!python/unicode '{"count": 1, "directory": "/home/maxking/Documents/mm3/core/var/queue/in",
+ "files": ["1497761009.0654283+5def81357593550bf60cb32e9a7ad82954b37148"],
+ "http_etag": "\"e94ac6924b57b42ec2af640efba301a5a22fa3f3\"", "name": "in",
+ "self_link": "http://localhost:9001/3.1/queues/in"}'}
+ headers:
+ content-length: ['275']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/queues/in
+ response:
+ body: {string: !!python/unicode '{"count": 0, "directory": "/home/maxking/Documents/mm3/core/var/queue/in",
+ "files": [], "http_etag": "\"8a3a2468b5f526624f1893b85fe30a1a9d10179c\"",
+ "name": "in", "self_link": "http://localhost:9001/3.1/queues/in"}'}
+ headers:
+ content-length: ['214']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/held
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:29 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/held
+ response:
+ body: {string: !!python/unicode '{"entries": [{"_parsemsg": false, "envsender":
+ "noreply@example.com", "hold_date": "2005-08-01T07:49:23", "http_etag": "\"17b2be78e5eddcd3c5df685965b43f20229ee2e9\"",
+ "lang": "en", "listid": "test-1.example.com", "message_id": "<moderated_01>",
+ "moderation_action": "hold", "moderation_reasons": ["The message is not from
+ a list member"], "moderation_sender": "nomember@example.com", "msg": "From:
+ nomember@example.com\nTo: test-1@example.com\nSubject: Something\nMessage-ID:
+ <moderated_01>\nDate: Sat, 17 Jun 2017 21:43:29 -0700\nX-Mailman-Rule-Hits:
+ nonmember-moderation\nX-Mailman-Rule-Misses: dmarc-mitigation; approved; emergency;
+ loop; banned-address; member-moderation\nMessage-ID-Hash: KU3PI265JYL67T3OV6XE5CQP3QOXKKHB\nX-Message-ID-Hash:
+ KU3PI265JYL67T3OV6XE5CQP3QOXKKHB\n\nSome text.\n\n", "original_size": 249,
+ "original_subject": "Something", "reason": "The message is not from a list
+ member", "request_id": 1, "rule_hits": ["nonmember-moderation"], "rule_misses":
+ ["dmarc-mitigation", "approved", "emergency", "loop", "banned-address", "member-moderation"],
+ "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/held/1",
+ "sender": "nomember@example.com", "subject": "Something", "version": 3}],
+ "http_etag": "\"9a1d6b3e8b6f08b9ddff61a8dc5039c4698bd727\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['1308']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/held/1
+ response:
+ body: {string: !!python/unicode '{"_parsemsg": false, "envsender": "noreply@example.com",
+ "hold_date": "2005-08-01T07:49:23", "http_etag": "\"17b2be78e5eddcd3c5df685965b43f20229ee2e9\"",
+ "lang": "en", "listid": "test-1.example.com", "message_id": "<moderated_01>",
+ "moderation_action": "hold", "moderation_reasons": ["The message is not from
+ a list member"], "moderation_sender": "nomember@example.com", "msg": "From:
+ nomember@example.com\nTo: test-1@example.com\nSubject: Something\nMessage-ID:
+ <moderated_01>\nDate: Sat, 17 Jun 2017 21:43:29 -0700\nX-Mailman-Rule-Hits:
+ nonmember-moderation\nX-Mailman-Rule-Misses: dmarc-mitigation; approved; emergency;
+ loop; banned-address; member-moderation\nMessage-ID-Hash: KU3PI265JYL67T3OV6XE5CQP3QOXKKHB\nX-Message-ID-Hash:
+ KU3PI265JYL67T3OV6XE5CQP3QOXKKHB\n\nSome text.\n\n", "original_size": 249,
+ "original_subject": "Something", "reason": "The message is not from a list
+ member", "request_id": 1, "rule_hits": ["nonmember-moderation"], "rule_misses":
+ ["dmarc-mitigation", "approved", "emergency", "loop", "banned-address", "member-moderation"],
+ "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/held/1",
+ "sender": "nomember@example.com", "subject": "Something", "version": 3}'}
+ headers:
+ content-length: ['1203']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'action=defer'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/held/1
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/held
+ response:
+ body: {string: !!python/unicode '{"entries": [{"_parsemsg": false, "envsender":
+ "noreply@example.com", "hold_date": "2005-08-01T07:49:23", "http_etag": "\"17b2be78e5eddcd3c5df685965b43f20229ee2e9\"",
+ "lang": "en", "listid": "test-1.example.com", "message_id": "<moderated_01>",
+ "moderation_action": "hold", "moderation_reasons": ["The message is not from
+ a list member"], "moderation_sender": "nomember@example.com", "msg": "From:
+ nomember@example.com\nTo: test-1@example.com\nSubject: Something\nMessage-ID:
+ <moderated_01>\nDate: Sat, 17 Jun 2017 21:43:29 -0700\nX-Mailman-Rule-Hits:
+ nonmember-moderation\nX-Mailman-Rule-Misses: dmarc-mitigation; approved; emergency;
+ loop; banned-address; member-moderation\nMessage-ID-Hash: KU3PI265JYL67T3OV6XE5CQP3QOXKKHB\nX-Message-ID-Hash:
+ KU3PI265JYL67T3OV6XE5CQP3QOXKKHB\n\nSome text.\n\n", "original_size": 249,
+ "original_subject": "Something", "reason": "The message is not from a list
+ member", "request_id": 1, "rule_hits": ["nonmember-moderation"], "rule_misses":
+ ["dmarc-mitigation", "approved", "emergency", "loop", "banned-address", "member-moderation"],
+ "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/held/1",
+ "sender": "nomember@example.com", "subject": "Something", "version": 3}],
+ "http_etag": "\"9a1d6b3e8b6f08b9ddff61a8dc5039c4698bd727\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['1308']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'action=discard'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/held/1
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1@example.com/held
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/member/bill@example.com
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/bill@example.com",
+ "delivery_mode": "regular", "email": "bill@example.com", "http_etag": "\"38c6296dce7384ac4ae4e28bd7dd067741f30700\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"}'}
+ headers:
+ content-length: ['444']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'moderation_action=hold'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'PATCH'
+ uri: http://localhost:9001/3.1/members/0000000000000000000000000000033f
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/member/bill@example.com
+ response:
+ body: {string: !!python/unicode '{"address": "http://localhost:9001/3.1/addresses/bill@example.com",
+ "delivery_mode": "regular", "email": "bill@example.com", "http_etag": "\"5a3628a9037881300fa30a90c307422227d78064\"",
+ "list_id": "test-1.example.com", "member_id": "0000000000000000000000000000033f",
+ "moderation_action": "hold", "role": "member", "self_link": "http://localhost:9001/3.1/members/0000000000000000000000000000033f",
+ "user": "http://localhost:9001/3.1/users/0000000000000000000000000000047a"}'}
+ headers:
+ content-length: ['473']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'email=anna%40example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/bans
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ location: ['http://localhost:9001/3.1/bans/anna@example.com']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans/anna@example.com
+ response:
+ body: {string: !!python/unicode '{"email": "anna@example.com", "http_etag": "\"f1342f7d4e2a74f0011c08e4b9cd09fdfa61bdf2\"",
+ "self_link": "http://localhost:9001/3.1/bans/anna@example.com"}'}
+ headers:
+ content-length: ['154']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans/anna@example.com
+ response:
+ body: {string: !!python/unicode '{"email": "anna@example.com", "http_etag": "\"f1342f7d4e2a74f0011c08e4b9cd09fdfa61bdf2\"",
+ "self_link": "http://localhost:9001/3.1/bans/anna@example.com"}'}
+ headers:
+ content-length: ['154']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'email=bill%40example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/bans
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ location: ['http://localhost:9001/3.1/bans/bill@example.com']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans/bill@example.com
+ response:
+ body: {string: !!python/unicode '{"email": "bill@example.com", "http_etag": "\"6620b2c134912dfa3def6cb9262dcf5acfda162b\"",
+ "self_link": "http://localhost:9001/3.1/bans/bill@example.com"}'}
+ headers:
+ content-length: ['154']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "anna@example.com", "http_etag":
+ "\"f1342f7d4e2a74f0011c08e4b9cd09fdfa61bdf2\"", "self_link": "http://localhost:9001/3.1/bans/anna@example.com"},
+ {"email": "bill@example.com", "http_etag": "\"6620b2c134912dfa3def6cb9262dcf5acfda162b\"",
+ "self_link": "http://localhost:9001/3.1/bans/bill@example.com"}], "http_etag":
+ "\"9b6337a6cff45d9c10520949a639724566fd7f94\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['415']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans?count=1&page=1
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "anna@example.com", "http_etag":
+ "\"f1342f7d4e2a74f0011c08e4b9cd09fdfa61bdf2\"", "self_link": "http://localhost:9001/3.1/bans/anna@example.com"}],
+ "http_etag": "\"5f99d16e5080aa1765e08b170cbf0e27808370a6\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['259']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans?count=1&page=2
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "bill@example.com", "http_etag":
+ "\"6620b2c134912dfa3def6cb9262dcf5acfda162b\"", "self_link": "http://localhost:9001/3.1/bans/bill@example.com"}],
+ "http_etag": "\"4c6471649f58278dfd6257ee46beefeeae119ddf\"", "start": 1, "total_size":
+ 2}'}
+ headers:
+ content-length: ['259']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/bans/anna@example.com
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans/anna@example.com
+ response:
+ body: {string: !!python/unicode 'Email is not banned: anna@example.com'}
+ headers:
+ content-length: ['37']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 404, message: Not Found}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "bill@example.com", "http_etag":
+ "\"6620b2c134912dfa3def6cb9262dcf5acfda162b\"", "self_link": "http://localhost:9001/3.1/bans/bill@example.com"}],
+ "http_etag": "\"d44404c42754a3a877e56c43c16aec84a0bae79a\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['259']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "bill@example.com", "http_etag":
+ "\"6620b2c134912dfa3def6cb9262dcf5acfda162b\"", "self_link": "http://localhost:9001/3.1/bans/bill@example.com"}],
+ "http_etag": "\"d44404c42754a3a877e56c43c16aec84a0bae79a\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['259']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/bans/bill@example.com
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans/bill@example.com
+ response:
+ body: {string: !!python/unicode 'Email is not banned: bill@example.com'}
+ headers:
+ content-length: ['37']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 404, message: Not Found}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/bans
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'email=anna%40example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ location: ['http://localhost:9001/3.1/lists/test-1.example.com/bans/anna@example.com']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans/anna@example.com
+ response:
+ body: {string: !!python/unicode '{"email": "anna@example.com", "http_etag": "\"f281df5e13fbd64e7fc9bc96bdb903b183b035b3\"",
+ "list_id": "test-1.example.com", "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/bans/anna@example.com"}'}
+ headers:
+ content-length: ['212']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'email=bill%40example.com'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ location: ['http://localhost:9001/3.1/lists/test-1.example.com/bans/bill@example.com']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans/bill@example.com
+ response:
+ body: {string: !!python/unicode '{"email": "bill@example.com", "http_etag": "\"e172d4abbacb492faa6dfeb4e1c8cfe433d3cc76\"",
+ "list_id": "test-1.example.com", "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/bans/bill@example.com"}'}
+ headers:
+ content-length: ['212']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "anna@example.com", "http_etag":
+ "\"f281df5e13fbd64e7fc9bc96bdb903b183b035b3\"", "list_id": "test-1.example.com",
+ "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/bans/anna@example.com"},
+ {"email": "bill@example.com", "http_etag": "\"e172d4abbacb492faa6dfeb4e1c8cfe433d3cc76\"",
+ "list_id": "test-1.example.com", "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/bans/bill@example.com"}],
+ "http_etag": "\"7ee94f764975e2402d233e9fb5aeb7025a694a55\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['531']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans?count=1&page=1
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "anna@example.com", "http_etag":
+ "\"f281df5e13fbd64e7fc9bc96bdb903b183b035b3\"", "list_id": "test-1.example.com",
+ "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/bans/anna@example.com"}],
+ "http_etag": "\"de615d2cddc8e479019349451e5b9f97d0fec26e\"", "start": 0, "total_size":
+ 2}'}
+ headers:
+ content-length: ['317']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans?count=1&page=2
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "bill@example.com", "http_etag":
+ "\"e172d4abbacb492faa6dfeb4e1c8cfe433d3cc76\"", "list_id": "test-1.example.com",
+ "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/bans/bill@example.com"}],
+ "http_etag": "\"e21cb5f21519eb4df8688f4a7343403b1b11e4d3\"", "start": 1, "total_size":
+ 2}'}
+ headers:
+ content-length: ['317']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans/anna@example.com
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans/anna@example.com
+ response:
+ body: {string: !!python/unicode 'Email is not banned: anna@example.com'}
+ headers:
+ content-length: ['37']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 404, message: Not Found}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans
+ response:
+ body: {string: !!python/unicode '{"entries": [{"email": "bill@example.com", "http_etag":
+ "\"e172d4abbacb492faa6dfeb4e1c8cfe433d3cc76\"", "list_id": "test-1.example.com",
+ "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/bans/bill@example.com"}],
+ "http_etag": "\"d395d80fd06077cdcd8ca944b04f7d62936a8ee9\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['317']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans/bill@example.com
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/bans
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/archivers
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"3dbbbaad592a043938314db0e5249a1ca71d0dc6\"",
+ "mail-archive": true, "mhonarc": true, "prototype": true}'}
+ headers:
+ content-length: ['119']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'mail-archive=False'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'PATCH'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/archivers
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/archivers
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"9f3e82fa9d7dc70277565c9703a90ad3fbeb9a03\"",
+ "mail-archive": false, "mhonarc": true, "prototype": true}'}
+ headers:
+ content-length: ['120']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'mhonarc=False'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'PATCH'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/archivers
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/archivers
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"f8ecaeeadc4cf5d8900d7c7ed3990e675116ad31\"",
+ "mail-archive": false, "mhonarc": false, "prototype": true}'}
+ headers:
+ content-length: ['121']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'action=discard&pattern=%5Etest%3A+&header=Subject'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ location: ['http://localhost:9001/3.1/lists/test-1.example.com/header-matches/0']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches/0
+ response:
+ body: {string: !!python/unicode '{"action": "discard", "header": "subject", "http_etag":
+ "\"f2270af6050c5791d8518371258f8f7c003925e2\"", "pattern": "^test: ", "position":
+ 0, "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/header-matches/0"}'}
+ headers:
+ content-length: ['224']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches
+ response:
+ body: {string: !!python/unicode '{"entries": [{"action": "discard", "header":
+ "subject", "http_etag": "\"f2270af6050c5791d8518371258f8f7c003925e2\"", "pattern":
+ "^test: ", "position": 0, "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/header-matches/0"}],
+ "http_etag": "\"20f331c3aab98676cdc1887ce783669a121440a3\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['329']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches/0
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: !!python/unicode 'action=discard&pattern=%5Etest%3A+&header=Subject'
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'content-type': [!!python/unicode 'application/x-www-form-urlencoded']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'POST'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:30 GMT']
+ location: ['http://localhost:9001/3.1/lists/test-1.example.com/header-matches/0']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 201, message: Created}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches/0
+ response:
+ body: {string: !!python/unicode '{"action": "discard", "header": "subject", "http_etag":
+ "\"f2270af6050c5791d8518371258f8f7c003925e2\"", "pattern": "^test: ", "position":
+ 0, "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/header-matches/0"}'}
+ headers:
+ content-length: ['224']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches
+ response:
+ body: {string: !!python/unicode '{"entries": [{"action": "discard", "header":
+ "subject", "http_etag": "\"f2270af6050c5791d8518371258f8f7c003925e2\"", "pattern":
+ "^test: ", "position": 0, "self_link": "http://localhost:9001/3.1/lists/test-1.example.com/header-matches/0"}],
+ "http_etag": "\"20f331c3aab98676cdc1887ce783669a121440a3\"", "start": 0, "total_size":
+ 1}'}
+ headers:
+ content-length: ['329']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches/0
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/lists/test-1.example.com/header-matches
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
+ "start": 0, "total_size": 0}'}
+ headers:
+ content-length: ['90']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/system/configuration
+ response:
+ body: {string: !!python/unicode '{"http_etag": "\"a6c4f90da94e597d71a9ce70a0fade7c17425de9\"",
+ "sections": ["antispam", "archiver.mail_archive", "archiver.master", "archiver.mhonarc",
+ "archiver.prototype", "bounces", "database", "devmode", "digests", "dmarc",
+ "language.ar", "language.ast", "language.ca", "language.cs", "language.da",
+ "language.de", "language.el", "language.en", "language.es", "language.et",
+ "language.eu", "language.fi", "language.fr", "language.gl", "language.he",
+ "language.hr", "language.hu", "language.ia", "language.it", "language.ja",
+ "language.ko", "language.lt", "language.nl", "language.no", "language.pl",
+ "language.pt", "language.pt_BR", "language.ro", "language.ru", "language.sk",
+ "language.sl", "language.sr", "language.sv", "language.tr", "language.uk",
+ "language.vi", "language.zh_CN", "language.zh_TW", "logging.archiver", "logging.bounce",
+ "logging.config", "logging.database", "logging.debug", "logging.error", "logging.fromusenet",
+ "logging.http", "logging.locks", "logging.mischief", "logging.root", "logging.runner",
+ "logging.smtp", "logging.subscribe", "logging.vette", "mailman", "mta", "nntp",
+ "passwords", "paths.dev", "paths.fhs", "paths.here", "paths.local", "runner.archive",
+ "runner.bad", "runner.bounces", "runner.command", "runner.digest", "runner.in",
+ "runner.lmtp", "runner.nntp", "runner.out", "runner.pipeline", "runner.rest",
+ "runner.retry", "runner.shunt", "runner.virgin", "shell", "styles", "webservice"],
+ "self_link": "http://localhost:9001/3.1/system/configuration"}'}
+ headers:
+ content-length: ['1495']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/system/configuration/mailman
+ response:
+ body: {string: !!python/unicode '{"cache_life": "7d", "default_language": "en",
+ "email_commands_max_lines": "10", "filtered_messages_are_preservable": "no",
+ "html_to_plain_text_command": "/usr/bin/lynx -dump $filename", "http_etag":
+ "\"21cc055500f21d5c757534dfbddd7d7f95522b2f\"", "layout": "here", "listname_chars":
+ "[-_.0-9a-z]", "noreply_address": "noreply", "pending_request_life": "3d",
+ "post_hook": "", "pre_hook": "", "self_link": "http://localhost:9001/3.1/system/configuration/mailman",
+ "sender_headers": "from from_ reply-to sender", "site_owner": "changeme@example.com"}'}
+ headers:
+ content-length: ['548']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'GET'
+ uri: http://localhost:9001/3.1/users
+ response:
+ body: {string: !!python/unicode '{"entries": [{"created_on": "2005-08-01T07:49:23",
+ "display_name": "Unverified", "http_etag": "\"c1122b8a2734e8e4a8a93f574782939315a5af25\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000477",
+ "user_id": "00000000000000000000000000000477"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Unconfirmed", "http_etag": "\"a3f755e773a108a25f54e68048b6c735bbe1ba77\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000478",
+ "user_id": "00000000000000000000000000000478"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Anna", "http_etag": "\"d75a29d94399449661d955fae2269182c0ecbce8\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000479",
+ "user_id": "00000000000000000000000000000479"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Bill", "http_etag": "\"083120bb35acbf4593cfd55fb1d23cb3e113ac15\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047a",
+ "user_id": "0000000000000000000000000000047a"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Cris", "http_etag": "\"f4f189f89c559b376caccdfe4ba3a16e3a6112e7\"",
+ "is_server_owner": false, "password": "$6$rounds=656000$.q0SmTobhYqCQXAQ$HsRDORbQwHtBH4CKPlP.Y.yiKl5HTwOfvgzfh9CxRKf8TXMEnvhQnzeJAYVW4mzba5jr32xd2o.pgi8yJ.YgM1",
+ "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047b",
+ "user_id": "0000000000000000000000000000047b"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "Sir Ler", "http_etag": "\"50447df82c18d9a1797764a18962585ffff81eca\"",
+ "is_server_owner": false, "password": "$6$rounds=656000$vxCVBA6LZfVsFYGH$qegjTOweTyGZMzwnTJe3KeczIzn2QFGAHQjJBsRHIp0Sb9HKZIU1.lPO7EZ/ptZHCLeBjULzEVTHmOvGhP6d..",
+ "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047d",
+ "user_id": "0000000000000000000000000000047d"}, {"created_on": "2005-08-01T07:49:23",
+ "http_etag": "\"4f46cce5bcca214cc9592b9e10d007995a338215\"", "is_server_owner":
+ false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047e",
+ "user_id": "0000000000000000000000000000047e"}, {"created_on": "2005-08-01T07:49:23",
+ "http_etag": "\"8a9a98d22c6f9cfb4ed71ea844c11cbaa61dd24a\"", "is_server_owner":
+ false, "self_link": "http://localhost:9001/3.1/users/0000000000000000000000000000047f",
+ "user_id": "0000000000000000000000000000047f"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "None", "http_etag": "\"a26dae9f19026e60b1efc8ccd54f1e43c3b9df65\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000480",
+ "user_id": "00000000000000000000000000000480"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "None", "http_etag": "\"3834ab5731a2501848e6eeb882a7d6766fb452ef\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000481",
+ "user_id": "00000000000000000000000000000481"}, {"created_on": "2005-08-01T07:49:23",
+ "display_name": "None", "http_etag": "\"a1f132db62c32486d06f4af33a05f51e312458cf\"",
+ "is_server_owner": false, "self_link": "http://localhost:9001/3.1/users/00000000000000000000000000000482",
+ "user_id": "00000000000000000000000000000482"}], "http_etag": "\"485907decf8e679edda4ee6c78defe47571a0e79\"",
+ "start": 0, "total_size": 11}'}
+ headers:
+ content-length: ['3402']
+ content-type: [application/json; charset=UTF-8]
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 200, message: OK}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/00000000000000000000000000000477
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/00000000000000000000000000000478
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/00000000000000000000000000000479
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047a
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047b
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047d
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047e
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/0000000000000000000000000000047f
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/00000000000000000000000000000480
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/00000000000000000000000000000481
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+- request:
+ body: null
+ headers:
+ accept-encoding: ['gzip, deflate']
+ !!python/unicode 'authorization': [!!python/unicode 'Basic cmVzdGFkbWluOnJlc3RwYXNz']
+ !!python/unicode 'user-agent': [!!python/unicode 'GNU Mailman REST client v3.1.1']
+ method: !!python/unicode 'DELETE'
+ uri: http://localhost:9001/3.1/users/00000000000000000000000000000482
+ response:
+ body: {string: !!python/unicode ''}
+ headers:
+ content-length: ['0']
+ date: ['Sun, 18 Jun 2017 04:43:31 GMT']
+ server: [WSGIServer/0.2 CPython/3.5.3]
+ status: {code: 204, message: No Content}
+version: 1
diff --git a/src/mailmanclient/tests/test_domain.py b/src/mailmanclient/tests/test_domain.py
new file mode 100644
index 0000000..13b897b
--- /dev/null
+++ b/src/mailmanclient/tests/test_domain.py
@@ -0,0 +1,50 @@
+# Copyright (C) 2015-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+
+"""Test domain corner cases."""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+
+import unittest
+import pytest
+
+from mailmanclient import Client
+from six.moves.urllib_error import HTTPError
+
+
+__metaclass__ = type
+__all__ = [
+ 'TestDomains',
+ ]
+
+
+@pytest.mark.vcr()
+class TestDomains(unittest.TestCase):
+ def setUp(self):
+ self._client = Client(
+ 'http://localhost:9001/3.0', 'restadmin', 'restpass')
+
+ def test_no_domain(self):
+ # Trying to get a non-existent domain returns a 404.
+ #
+ # We can't use `with self.assertRaises()` until we drop Python 2.6
+ try:
+ self._client.get_domain('example.org')
+ except HTTPError as error:
+ self.assertEqual(error.code, 404)
+ else:
+ raise AssertionError('Expected HTTPError 404')
diff --git a/src/mailmanclient/tests/test_page.py b/src/mailmanclient/tests/test_page.py
new file mode 100644
index 0000000..f005a27
--- /dev/null
+++ b/src/mailmanclient/tests/test_page.py
@@ -0,0 +1,58 @@
+# Copyright (C) 2016-2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+
+"""Test Page corner cases."""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+import unittest
+
+import pytest
+from mock import Mock
+from six.moves.urllib_parse import urlsplit, parse_qs
+
+from mailmanclient.constants import DEFAULT_PAGE_ITEM_COUNT
+from mailmanclient.restbase.page import Page
+
+__metaclass__ = type
+__all__ = [
+ 'TestPage',
+ ]
+
+
+@pytest.mark.vcr()
+class TestPage(unittest.TestCase):
+
+ def test_url_simple(self):
+ connection = Mock()
+ connection.call.return_value = (None, {'start': 0, 'total_size': 0})
+ page = Page(connection, '/some-path', None)
+ built_qs = parse_qs(urlsplit(page._build_url()).query)
+ self.assertEqual(built_qs, dict(
+ count=[str(DEFAULT_PAGE_ITEM_COUNT)],
+ page=["1"]))
+
+ def test_url_with_qs(self):
+ connection = Mock()
+ connection.call.return_value = (None, {'start': 0, 'total_size': 0})
+ page = Page(connection, '/some-path?with=a&query=string', None)
+ built_qs = parse_qs(urlsplit(page._build_url()).query)
+ self.assertEqual(built_qs, {
+ "with": ["a"],
+ "query": ["string"],
+ "count": [str(DEFAULT_PAGE_ITEM_COUNT)],
+ "page": ["1"],
+ })
diff --git a/src/mailmanclient/tests/test_unicode.py b/src/mailmanclient/tests/test_unicode.py
new file mode 100644
index 0000000..8424822
--- /dev/null
+++ b/src/mailmanclient/tests/test_unicode.py
@@ -0,0 +1,56 @@
+# coding: utf-8
+
+# Copyright (C) 2015 by the Free Software Foundation, Inc.
+#
+# This file is part of mailmanclient.
+#
+# mailmanclient 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, version 3 of the License.
+#
+# mailmanclient 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 mailmanclient. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test unicode data when using REST endpoint."""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+import pytest
+import unittest
+
+from mailmanclient import Client
+from six.moves.urllib_error import HTTPError
+
+
+__metaclass__ = type
+__all__ = [
+ 'TestUnicode',
+ ]
+
+
+@pytest.mark.vcr()
+class TestUnicode(unittest.TestCase):
+ def setUp(self):
+ self._client = Client(
+ 'http://localhost:9001/3.1', 'restadmin', 'restpass')
+ self.email = 'jeremy@example.com'
+ self.unicode_string = u'Jérôme'
+
+ def tearDown(self):
+ try:
+ self._client.get_user(self.email).delete()
+ except HTTPError as error:
+ if error.status_code == 404:
+ pass
+
+ def test_create_user(self):
+ user = self._client.create_user(
+ email=self.email, password='1234',
+ display_name=self.unicode_string)
+ self.assertEqual(user.display_name, self.unicode_string)
diff --git a/template.py b/template.py
new file mode 100644
index 0000000..405e3ba
--- /dev/null
+++ b/template.py
@@ -0,0 +1,23 @@
+# Copyright (C) 2017 The Free Software Foundation, Inc.
+#
+# This file is part of mailman.client.
+#
+# mailman.client 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, version 3 of the License.
+#
+# mailman.client 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 mailman.client. If not, see <http://www.gnu.org/licenses/>.
+
+"""Module contents."""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+__metaclass__ = type
+__all__ = [
+ ]
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..4f7c22f
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,34 @@
+[tox]
+envlist = py{27,34,35,36},lint
+
+[testenv]
+usedevelop = True
+commands = python -m pytest --vcr-record-mode=none
+deps =
+ WebTest
+ contextlib2
+ mock
+ requests
+ pytest
+ pytest-vcr
+
+[testenv:record]
+basepython = python2
+commands = pytest --vcr-record-mode=once
+
+[testenv:lint]
+deps =
+ six
+ flake8 > 3.0
+commands =
+ python -m flake8 {posargs}
+
+[testenv:docs]
+deps =
+ sphinx
+commands =
+ sphinx-build -t html . build/
+
+[flake8]
+show-source = true
+exclude = .git,.tox,dist,*egg,src/mailmanclient/docs