[#8347] drop "poster" dep
diff --git a/Allura/setup.py b/Allura/setup.py
index 6f25a17..47bd1bd 100644
--- a/Allura/setup.py
+++ b/Allura/setup.py
@@ -54,7 +54,7 @@
     packages=find_packages(exclude=['ez_setup']),
     include_package_data=True,
     test_suite='nose.collector',
-    tests_require=['WebTest >= 1.2', 'BeautifulSoup', 'poster', 'nose'],
+    tests_require=['WebTest >= 1.2', 'BeautifulSoup', 'nose'],
     package_data={'allura': ['i18n/*/LC_MESSAGES/*.mo',
                              'templates/**.html',
                              'templates/**.py',
diff --git a/AlluraTest/alluratest/validation.py b/AlluraTest/alluratest/validation.py
index 25d51b6..5076cbe 100644
--- a/AlluraTest/alluratest/validation.py
+++ b/AlluraTest/alluratest/validation.py
@@ -34,9 +34,8 @@
 import webtest
 from webtest import TestApp
 from nose.tools import ok_
-from poster.encode import multipart_encode
-from poster.streaminghttp import register_openers
 from ming.utils import LazyProperty
+import requests
 
 from allura.lib import utils
 
@@ -127,23 +126,25 @@
         html = html_or_response.body
     else:
         html = html_or_response
-    register_openers()
-    params = [("out", "text"), ("content", html)]
-    datagen, headers = multipart_encode(params)
-    request = urllib2.Request("http://html5.validator.nu/", datagen, headers)
     count = 3
     while True:
         try:
-            resp = urllib2.urlopen(request, timeout=3).read()
+            # TODO switch to http://validator.w3.org/nu/?out=text but it has more validation errors for us to fix
+            # Docs: https://github.com/validator/validator/wiki/Service-%C2%BB-Input-%C2%BB-POST-body   and other pages
+            resp = requests.post('http://html5.validator.nu/nu/?out=text',  # could do out=json
+                                 data=html,
+                                 headers={'Content-Type': str('text/html; charset=utf-8')},
+                                 timeout=3)
+            resp = resp.text
             break
-        except:
+        except Exception:
             resp = "Couldn't connect to validation service to check the HTML"
             count -= 1
             if count == 0:
                 sys.stderr.write('WARNING: ' + resp + '\n')
                 break
 
-    resp = resp.replace('“', '"').replace('”', '"').replace('–', '-')
+    resp = resp.replace(u'“', u'"').replace(u'”', u'"').replace(u'–', u'-')
 
     ignored_errors = [
         'Required attributes missing on element "object"',
diff --git a/requirements.in b/requirements.in
index 7c70916..1596d95 100644
--- a/requirements.in
+++ b/requirements.in
@@ -52,7 +52,6 @@
 ipython<6  # Ipython 7 starts to require py3
 mock
 nose
-poster==0.8.1
 pyflakes
 #pylint -- disabled due to [#8346]  (also requires diff versions on py2 vs 3, including transitive deps which gets tricky with pip-compile)
 testfixtures
diff --git a/requirements.txt b/requirements.txt
index 640726b..3ba5fb4 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -58,7 +58,6 @@
 pexpect==4.7.0            # via ipython
 pickleshare==0.7.5        # via ipython
 pillow==6.1.0
-poster==0.8.1
 profanityfilter==2.0.6
 prompt-toolkit==1.0.16    # via ipython
 ptyprocess==0.6.0         # via pexpect