Skip to content

Commit 108a82c

Browse files
committed
pytest_httpserver: preliminary ssl support
Initial version of ssl support. This commit adds ssl_context parameter to HTTPServer so werkzeug can create a HTTPS server if it is properly initialized. See the test_ssl.py for more details.
1 parent 977b800 commit 108a82c

13 files changed

Lines changed: 220 additions & 3 deletions

File tree

pytest_httpserver/httpserver.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ class HTTPServer: # pylint: disable=too-many-instance-attributes
262262
of the server.
263263
"""
264264

265-
def __init__(self, host="localhost", port=4000):
265+
def __init__(self, host="localhost", port=4000, ssl_context=None):
266266
"""
267267
Initializes the instance.
268268
@@ -277,6 +277,7 @@ def __init__(self, host="localhost", port=4000):
277277
self.oneshot_handlers = RequestHandlerList()
278278
self.handlers = RequestHandlerList()
279279
self.permanently_failed = False
280+
self.ssl_context = ssl_context
280281

281282
def clear(self):
282283
"""
@@ -328,7 +329,12 @@ def url_for(self, suffix: str):
328329
if not suffix.startswith("/"):
329330
suffix = "/" + suffix
330331

331-
return "http://{}:{}{}".format(self.host, self.port, suffix)
332+
if self.ssl_context is None:
333+
protocol = "http"
334+
else:
335+
protocol = "https"
336+
337+
return "{}://{}:{}{}".format(protocol, self.host, self.port, suffix)
332338

333339
def create_matcher(self, *args, **kwargs) -> RequestMatcher:
334340
"""
@@ -449,7 +455,7 @@ def start(self):
449455
if self.is_running():
450456
raise HTTPServerError("Server is already running")
451457

452-
self.server = make_server(self.host, self.port, self.application)
458+
self.server = make_server(self.host, self.port, self.application, ssl_context=self.ssl_context)
453459
self.server_thread = threading.Thread(target=self.thread_target)
454460
self.server_thread.start()
455461

tests/assets/Makefile

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
3+
all: server.crt
4+
5+
6+
rootCA.key:
7+
openssl genrsa -out rootCA.key 2048
8+
9+
rootCA.crt: rootCA.key rootCA.cnf
10+
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 365 -out rootCA.crt -config rootCA.cnf
11+
12+
server.csr server.key: server.cnf
13+
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.cnf
14+
15+
server.crt: server.csr rootCA.crt rootCA.key v3.ext
16+
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext
17+
18+
clean:
19+
rm -f rootCA.key rootCA.crt server.csr server.key server.crt
20+
21+

tests/assets/README

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
!!! WARNING !!!
3+
4+
This directory contains a certificate and a root CA for testing.
5+
Never use these certs in production as these are (including the private keys)
6+
public on github.

tests/assets/rootCA.cnf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[req]
2+
default_bits = 4096
3+
prompt = no
4+
default_md = sha256
5+
distinguished_name = dn
6+
7+
[dn]
8+
C=US
9+
ST=SomeState
10+
L=SomeCity
11+
O=Test CA
12+
OU=SomeOrganizationUnit
13+
emailAddress=test@example.com
14+
CN = Test CA

tests/assets/rootCA.crt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDrjCCApYCCQD2ykTeoTiG1jANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMC
3+
VVMxEjAQBgNVBAgMCVNvbWVTdGF0ZTERMA8GA1UEBwwIU29tZUNpdHkxEDAOBgNV
4+
BAoMB1Rlc3QgQ0ExHTAbBgNVBAsMFFNvbWVPcmdhbml6YXRpb25Vbml0MR8wHQYJ
5+
KoZIhvcNAQkBFhB0ZXN0QGV4YW1wbGUuY29tMRAwDgYDVQQDDAdUZXN0IENBMB4X
6+
DTE4MDkwMzIwNDE1M1oXDTE5MDkwMzIwNDE1M1owgZgxCzAJBgNVBAYTAlVTMRIw
7+
EAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRAwDgYDVQQKDAdU
8+
ZXN0IENBMR0wGwYDVQQLDBRTb21lT3JnYW5pemF0aW9uVW5pdDEfMB0GCSqGSIb3
9+
DQEJARYQdGVzdEBleGFtcGxlLmNvbTEQMA4GA1UEAwwHVGVzdCBDQTCCASIwDQYJ
10+
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMRF8pdgZuYYNmYTsaSdQ5J+9GNOlnPz
11+
SZnRvUp+tinGXPebR6E/Ib42DhGE/mvBb7ALQbm17xcGpmfH7dk2oic59F93Fwc6
12+
KlZdtIvwM9U+gtQbyNNzMuNBppS7WYrcip+TU8fjr2YYYR0kkf12y39aBgBbyInk
13+
lcqhKu23TObLS9465zEVelYxY2ZW2gNSlC7P+QPt2/z5KzxFFP2k2oP7Do/pgMDC
14+
z9ft8n2vC10/fU9jrGUAmgl5p8NgJ7X0wxI4ZwaxtHNufdmW36FRyThnNf2kqcNW
15+
ne+iZnW0iUhlJS8qMK16xmEFjWWCpgFIt3UPwZDkX5ZhTMicq2NuQzkCAwEAATAN
16+
BgkqhkiG9w0BAQsFAAOCAQEAmOe0CNogX2Aqs8BXkSndoIJLTqrekJj4a/vs13hs
17+
vsGXDO9X0CulC4HGheW/8VPBKk8a8G3W9tj+JGi4XWIfamYcxARQI/CVRaUAq7nT
18+
ZAZyIRq0LQzEAFBJuVp+K5tprz03tgXiQ1h/J82tXaeaWtndcKTeIfGKsiGkYzz1
19+
vbdEEjGx3P4E/+hBnm0tQxD703Wm2jJaRzx4OSybprUKPILrNop11Op14kqernfj
20+
vbAPeQRRHXIyL4nft1JaR+xtaYER0R+VFGXenX98LYi1xJrtGl490yv6MX8bKFov
21+
upxwJuyrNmYR4OYBt0lIsuMvpNdE5stJcllvv7atVD7esQ==
22+
-----END CERTIFICATE-----

tests/assets/rootCA.key

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEowIBAAKCAQEAxEXyl2Bm5hg2ZhOxpJ1Dkn70Y06Wc/NJmdG9Sn62KcZc95tH
3+
oT8hvjYOEYT+a8FvsAtBubXvFwamZ8ft2TaiJzn0X3cXBzoqVl20i/Az1T6C1BvI
4+
03My40GmlLtZityKn5NTx+OvZhhhHSSR/XbLf1oGAFvIieSVyqEq7bdM5stL3jrn
5+
MRV6VjFjZlbaA1KULs/5A+3b/PkrPEUU/aTag/sOj+mAwMLP1+3yfa8LXT99T2Os
6+
ZQCaCXmnw2AntfTDEjhnBrG0c2592ZbfoVHJOGc1/aSpw1ad76JmdbSJSGUlLyow
7+
rXrGYQWNZYKmAUi3dQ/BkORflmFMyJyrY25DOQIDAQABAoIBADsUTvxv4SlbmmxJ
8+
e0xwphlfq5KE4lbOoZXyg0b8MzsJ4YwKqpoH1dFalguB+89Vr5fPG56Z+/jzYH2W
9+
uaqLfm3OTRe7UiwzvvC2ThVdXUzP/zN3lZDIeUXcyha0+jQJRJTaFPrzNyXFKt5J
10+
1sPz0TdpUqsi9Y9ERi5zKufZKAXEHvHzpOYGa2B1okCQ4JqsugF6Y2FETkM1/jdh
11+
ruY/JzihRPJcHIOdxwXQI5gbfZ13qsmKpJq2x/J7rPz2RtYdNMAvO2yhKbLMgKXH
12+
sDXn+Ss8tupXrr3CcAv7L0Kz6yUR+8XIi0P4rVRdOtSF2tnhpp/rqy5c6cAgYn45
13+
aOnveB0CgYEA57Jain/PstbxiqJDJWIj49YNn74D/Jw2xCRooD21bz+ehW1ik5an
14+
KYuxPd4z53FXa1azjoxxq4cIAe1nZSl1fEsVY/9TkUSN310JUduDY+I2FMQ5r3Xs
15+
o93Wbch2h4cueSpy55puGn3HLoqNZo89mrptmJwJZpQUWu5qatx0MEMCgYEA2Nxi
16+
QI/0xVGH4vafCfXJ/YuImjBww1c0dAbMKoV8SvGc5RHZxiv1v4E1LGy58LbaMb/u
17+
7+BTnhmKqV7MmfOFqbk2Z53KhKr5pWz2ifnDqavrn0vjuprYoqm+Obg38tF1kv0R
18+
fShvws4EzSoIIz/kqtjkbtMxAngDsZg4xxvR1NMCgYBMrajrNxtMq3fqkoK4R39r
19+
Mnb1y9PT8Prq9MWvaly2QY67x5SdFXmi9TkmKXhx+v+cZWgtH+uqgZiz0paqUwsv
20+
pEWi/2fvpolxR4ADGCumjcGqI7qXh+ZV4N/LG1GmzqUhsluurFwN5lxZ2b6sF3Gi
21+
2FnW7KTrzsvhwA916BmHswKBgAOlgQlw4j7HJi/M0dPLDEB1LjDZi6vdNYaV7qzw
22+
Xays72RyrmTErHcx5wD+OwovKPAZOB1UelN4Pnqmm24jSCYYdS+82YDtlxEPCf47
23+
8uxRdb7R+dxTaj0h+Y7i6B3vI7j7BGZEXcy6xh3lDQn6sw+kYgLzDinqdrVvx9Sh
24+
RR/9AoGBANWMXoOch+7m33KgCO8mjtZg2KDmI18akXd5fJRuf9PafysmrQ+GUdle
25+
rdNKCv5Oh6UTFZfsiLFDLi3u1SpSqthGH0ArpS87v0moA/NJ/EUkoUJaTYaLN7Ld
26+
GTfapdmvcZeTM1MfNovUvzErY/lURXKpkGzOLDyHW5gA88e6rAfw
27+
-----END RSA PRIVATE KEY-----

tests/assets/rootCA.srl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
D647D966F3C4188C

tests/assets/server.cnf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[req]
2+
default_bits = 4096
3+
prompt = no
4+
default_md = sha256
5+
distinguished_name = dn
6+
7+
[dn]
8+
C=US
9+
ST=SomeState
10+
L=SomeCity
11+
O=Test cert
12+
OU=SomeOrganizationUnit
13+
emailAddress=test@example.com
14+
CN = localhost

tests/assets/server.crt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIEpTCCA42gAwIBAgIJANZH2WbzxBiMMA0GCSqGSIb3DQEBCwUAMIGYMQswCQYD
3+
VQQGEwJVUzESMBAGA1UECAwJU29tZVN0YXRlMREwDwYDVQQHDAhTb21lQ2l0eTEQ
4+
MA4GA1UECgwHVGVzdCBDQTEdMBsGA1UECwwUU29tZU9yZ2FuaXphdGlvblVuaXQx
5+
HzAdBgkqhkiG9w0BCQEWEHRlc3RAZXhhbXBsZS5jb20xEDAOBgNVBAMMB1Rlc3Qg
6+
Q0EwHhcNMTgwOTAzMjA0MTUzWhcNMjAwMTE2MjA0MTUzWjCBnDELMAkGA1UEBhMC
7+
VVMxEjAQBgNVBAgMCVNvbWVTdGF0ZTERMA8GA1UEBwwIU29tZUNpdHkxEjAQBgNV
8+
BAoMCVRlc3QgY2VydDEdMBsGA1UECwwUU29tZU9yZ2FuaXphdGlvblVuaXQxHzAd
9+
BgkqhkiG9w0BCQEWEHRlc3RAZXhhbXBsZS5jb20xEjAQBgNVBAMMCWxvY2FsaG9z
10+
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANH2tcTSqAwKOGAXelvi
11+
2vi13S8SnMvbmmzg1nfWSlLYFeSMF3ox0TWUPywUlwG/g3gSobb+jr7F30UqOHo/
12+
n+f/B6agBdI6V5Wu1Xnh+Nr+vfW4KNa/hK0lfOpdxUCdns2HySUUJe+R7CDpLQno
13+
V7BnjtCu63W9pDHiCsQhVrNB2sQ8bvKAwQrITT85GW6eF4kZfyxjWbA1ps5ry47M
14+
vc9xzpmQtIznDjOETB1VXwUfpjeGl5eYAhydSYL7icZE2kFdR1RlK1gjkaKE2fvp
15+
qe6jJj6KepN6OEpHpx6SKh3CiM9yfkntwYqAplpmEuinkRVIjEYRmjrGHHK22lXq
16+
Nw0CAwEAAaOB6zCB6DCBtwYDVR0jBIGvMIGsoYGepIGbMIGYMQswCQYDVQQGEwJV
17+
UzESMBAGA1UECAwJU29tZVN0YXRlMREwDwYDVQQHDAhTb21lQ2l0eTEQMA4GA1UE
18+
CgwHVGVzdCBDQTEdMBsGA1UECwwUU29tZU9yZ2FuaXphdGlvblVuaXQxHzAdBgkq
19+
hkiG9w0BCQEWEHRlc3RAZXhhbXBsZS5jb20xEDAOBgNVBAMMB1Rlc3QgQ0GCCQD2
20+
ykTeoTiG1jAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DAUBgNVHREEDTALgglsb2Nh
21+
bGhvc3QwDQYJKoZIhvcNAQELBQADggEBAIImALESNkKTvrT1icgucMiAbBJXNq0S
22+
JUgZXq1YyiqVIcBb4FL0r8PXK6pszMsSsis0Aq1ISZgk9xyEVybGa/KjwY+mom5h
23+
aJliNrmaajecSmdtOAuSMqXzMclHvScDdr+GRv+TU9TF2LBCSIYk1RmOeBubS+Z/
24+
sCibthTpfjhgWFmDrq+JAuSUDYCajJbiy32ygXUC8fbJeinRZW2dTaMHbGBRCsSn
25+
amUZnoq0+LVfms3YU1sJH33RlTEO1h8nuQn3mBMxKCtQ6DEvfFfSQ5C2w2LTp/5Q
26+
mhiDIdxKaPHHDIw/oppg3+W0+ifycTGyXgjaVgPZzT4VFrp1uzAlm84=
27+
-----END CERTIFICATE-----

tests/assets/server.csr

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN CERTIFICATE REQUEST-----
2+
MIIC4jCCAcoCAQAwgZwxCzAJBgNVBAYTAlVTMRIwEAYDVQQIDAlTb21lU3RhdGUx
3+
ETAPBgNVBAcMCFNvbWVDaXR5MRIwEAYDVQQKDAlUZXN0IGNlcnQxHTAbBgNVBAsM
4+
FFNvbWVPcmdhbml6YXRpb25Vbml0MR8wHQYJKoZIhvcNAQkBFhB0ZXN0QGV4YW1w
5+
bGUuY29tMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
6+
DwAwggEKAoIBAQDR9rXE0qgMCjhgF3pb4tr4td0vEpzL25ps4NZ31kpS2BXkjBd6
7+
MdE1lD8sFJcBv4N4EqG2/o6+xd9FKjh6P5/n/wemoAXSOleVrtV54fja/r31uCjW
8+
v4StJXzqXcVAnZ7Nh8klFCXvkewg6S0J6FewZ47Qrut1vaQx4grEIVazQdrEPG7y
9+
gMEKyE0/ORlunheJGX8sY1mwNabOa8uOzL3Pcc6ZkLSM5w4zhEwdVV8FH6Y3hpeX
10+
mAIcnUmC+4nGRNpBXUdUZStYI5GihNn76anuoyY+inqTejhKR6cekiodwojPcn5J
11+
7cGKgKZaZhLop5EVSIxGEZo6xhxyttpV6jcNAgMBAAGgADANBgkqhkiG9w0BAQsF
12+
AAOCAQEAAHhZdZ03KmOf05qJY8VpDK07zNYHzhBnXtq7xgcrSK6+PdNpTwrlRZJl
13+
ytfdLnG5aUfzft6VUiqF4zo+U/Gva3wBYUL0EqxJzNRjz38nDmiad1D39VVX/sTK
14+
HhiLho+ZySttXA3BfxKHBi71Mdtt4AJExGAdVdcHW6N7vHWmMKpp9UFzyviAMnJ6
15+
STUTLo7ilFT9/P9BivOI/oR1iRlY5ndMBm6IayDJsN8TbYmjVb8c/ZyFUBFOEssz
16+
Crk7W/SBkWO3hHIJfXcUK9wD4JojkMsa5oH6vxCspqk3IQ0zUoxAebD1i1Tya8mo
17+
aCmtKi/8vwi8Hmr55nY+v6P7rOf0mg==
18+
-----END CERTIFICATE REQUEST-----

0 commit comments

Comments
 (0)