Skip to content

Commit c8999f8

Browse files
committed
Merge pull request certbot#1200 from kuba/bugs/1085
Remove serve_forever2/shutdown2 (reduces probability of certbot#1085).
2 parents 90699d1 + 4cc0610 commit c8999f8

File tree

3 files changed

+10
-89
lines changed

3 files changed

+10
-89
lines changed

acme/acme/standalone.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import functools
55
import logging
66
import os
7-
import socket
87
import sys
98

109
import six
@@ -50,37 +49,11 @@ class ACMEServerMixin: # pylint: disable=old-style-class
5049
server_version = "ACME client standalone challenge solver"
5150
allow_reuse_address = True
5251

53-
def __init__(self):
54-
self._stopped = False
55-
56-
def serve_forever2(self):
57-
"""Serve forever, until other thread calls `shutdown2`."""
58-
logger.debug("Starting server at %s:%d...",
59-
*self.socket.getsockname()[:2])
60-
while not self._stopped:
61-
self.handle_request()
62-
63-
def shutdown2(self):
64-
"""Shutdown server loop from `serve_forever2`."""
65-
self._stopped = True
66-
67-
# dummy request to terminate last server_forever2.handle_request()
68-
sock = socket.socket()
69-
try:
70-
sock.connect(self.socket.getsockname())
71-
except socket.error:
72-
pass # thread is probably already finished
73-
finally:
74-
sock.close()
75-
76-
self.server_close()
77-
7852

7953
class DVSNIServer(TLSServer, ACMEServerMixin):
8054
"""DVSNI Server."""
8155

8256
def __init__(self, server_address, certs):
83-
ACMEServerMixin.__init__(self)
8457
TLSServer.__init__(
8558
self, server_address, socketserver.BaseRequestHandler, certs=certs)
8659

@@ -89,7 +62,6 @@ class SimpleHTTPServer(BaseHTTPServer.HTTPServer, ACMEServerMixin):
8962
"""SimpleHTTP Server."""
9063

9164
def __init__(self, server_address, resources):
92-
ACMEServerMixin.__init__(self)
9365
BaseHTTPServer.HTTPServer.__init__(
9466
self, server_address, SimpleHTTPRequestHandler.partial_init(
9567
simple_http_resources=resources))

acme/acme/standalone_test.py

Lines changed: 6 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"""Tests for acme.standalone."""
22
import os
33
import shutil
4-
import socket
54
import threading
65
import tempfile
76
import time
@@ -29,54 +28,6 @@ def test_bind(self): # pylint: disable=no-self-use
2928
server.server_close() # pylint: disable=no-member
3029

3130

32-
class ACMEServerMixinTest(unittest.TestCase):
33-
"""Tests for acme.standalone.ACMEServerMixin."""
34-
35-
def setUp(self):
36-
from acme.standalone import ACMEServerMixin
37-
38-
class _MockHandler(socketserver.BaseRequestHandler):
39-
# pylint: disable=missing-docstring,no-member,no-init
40-
41-
def handle(self):
42-
self.request.sendall(b"DONE")
43-
44-
class _MockServer(socketserver.TCPServer, ACMEServerMixin):
45-
def __init__(self, *args, **kwargs):
46-
socketserver.TCPServer.__init__(self, *args, **kwargs)
47-
ACMEServerMixin.__init__(self)
48-
49-
self.server = _MockServer(("", 0), _MockHandler)
50-
51-
def _busy_wait(self): # pragma: no cover
52-
# This function is used to avoid race conditions in tests, but
53-
# not all of the functionality is always used, hence "no
54-
# cover"
55-
while True:
56-
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
57-
try:
58-
# pylint: disable=no-member
59-
sock.connect(self.server.socket.getsockname())
60-
except socket.error:
61-
pass
62-
else:
63-
sock.recv(4) # wait until handle_request is actually called
64-
break
65-
finally:
66-
sock.close()
67-
time.sleep(1)
68-
69-
def test_serve_shutdown(self):
70-
thread = threading.Thread(target=self.server.serve_forever2)
71-
thread.start()
72-
self._busy_wait()
73-
self.server.shutdown2()
74-
75-
def test_shutdown2_not_running(self):
76-
self.server.shutdown2()
77-
self.server.shutdown2()
78-
79-
8031
class DVSNIServerTest(unittest.TestCase):
8132
"""Test for acme.standalone.DVSNIServer."""
8233

@@ -89,20 +40,16 @@ def setUp(self):
8940
from acme.standalone import DVSNIServer
9041
self.server = DVSNIServer(("", 0), certs=self.certs)
9142
# pylint: disable=no-member
92-
self.thread = threading.Thread(target=self.server.handle_request)
43+
self.thread = threading.Thread(target=self.server.serve_forever)
9344
self.thread.start()
9445

9546
def tearDown(self):
96-
self.server.shutdown2()
47+
self.server.shutdown() # pylint: disable=no-member
9748
self.thread.join()
9849

99-
def test_init(self):
100-
# pylint: disable=protected-access
101-
self.assertFalse(self.server._stopped)
102-
103-
def test_dvsni(self):
50+
def test_it(self):
10451
host, port = self.server.socket.getsockname()[:2]
105-
cert = crypto_util.probe_sni(b'localhost', host=host, port=port)
52+
cert = crypto_util.probe_sni(b'localhost', host=host, port=port, timeout=1)
10653
self.assertEqual(jose.ComparableX509(cert),
10754
jose.ComparableX509(self.certs[b'localhost'][1]))
10855

@@ -120,11 +67,11 @@ def setUp(self):
12067

12168
# pylint: disable=no-member
12269
self.port = self.server.socket.getsockname()[1]
123-
self.thread = threading.Thread(target=self.server.handle_request)
70+
self.thread = threading.Thread(target=self.server.serve_forever)
12471
self.thread.start()
12572

12673
def tearDown(self):
127-
self.server.shutdown2()
74+
self.server.shutdown() # pylint: disable=no-member
12875
self.thread.join()
12976

13077
def test_index(self):

letsencrypt/plugins/standalone.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ def run(self, port, challenge_type):
7272
except socket.error as error:
7373
raise errors.StandaloneBindError(error, port)
7474

75-
thread = threading.Thread(target=server.serve_forever2)
75+
thread = threading.Thread(
76+
# pylint: disable=no-member
77+
target=server.serve_forever)
7678
thread.start()
7779

7880
# if port == 0, then random free port on OS is taken
@@ -90,7 +92,7 @@ def stop(self, port):
9092
instance = self._instances[port]
9193
logger.debug("Stopping server at %s:%d...",
9294
*instance.server.socket.getsockname()[:2])
93-
instance.server.shutdown2()
95+
instance.server.shutdown()
9496
instance.thread.join()
9597
del self._instances[port]
9698

0 commit comments

Comments
 (0)