Fix -4/-6 crash caused by broken filter statement

In python3 filter returns a generator instead of a list. When -4 or
-6 is used or if the host system has either of those address
families disabled len() gets called onto this filter expression
which results into a crash. This commit makes a filter expression
out of this statement and also adds a test for ipv4-only downloading.
This commit is contained in:
Sebastian Lohff 2019-12-24 03:21:25 +01:00
parent 907013522c
commit ccd01e8b6e
2 changed files with 21 additions and 2 deletions

View File

@ -849,9 +849,9 @@ class ServeFile():
# filter out ips we are not listening on
if not self.listenIPv6:
ips = filter(lambda ip: ":" not in ip, ips)
ips = [ip for ip in ips if '.' in ip]
if not self.listenIPv4:
ips = filter(lambda ip: "." not in ip, ips)
ips = [ip for ip in ips if ':' in ip]
return ips
return None

View File

@ -2,6 +2,7 @@ import io
import os
import pytest
import requests
import socket
import subprocess
import tarfile
import time
@ -9,6 +10,12 @@ import urllib3
# crudly written to learn more about pytest and to have a base for refactoring
try:
ConnectionRefusedError
connrefused_exc = ConnectionRefusedError
except NameError:
connrefused_exc = socket.error
@pytest.fixture
def run_servefile():
@ -118,6 +125,18 @@ def test_specify_port(run_servefile, datadir):
check_download(data, fname='testfile', port=8081)
def test_ipv4_only(run_servefile, datadir):
data = "NOOT NOOT"
p = datadir({'testfile': data}) / 'testfile'
run_servefile([str(p), '-4'])
check_download(data, fname='testfile', host='127.0.0.1')
sock = socket.socket(socket.AF_INET6)
with pytest.raises(connrefused_exc):
sock.connect(("::1", 8080))
def test_big_download(run_servefile, datadir):
# test with about 10 mb of data
data = "x" * (10 * 1024 ** 2)