import pytest

from .env import H2Conf, H2TestEnv


@pytest.mark.skipif(condition=H2TestEnv.is_unsupported, reason="mod_http2 not supported here")
class TestConditionalHeaders:

    @pytest.fixture(autouse=True, scope='class')
    def _class_scope(self, env):
        H2Conf(env).add(
            """
            KeepAlive on
            MaxKeepAliveRequests 30
            KeepAliveTimeout 30"""
        ).add_vhost_test1().install()
        assert env.apache_restart() == 0

    # check handling of 'if-modified-since' header
    def test_h2_201_01(self, env):
        url = env.mkurl("https", "test1", "/006/006.css")
        r = env.curl_get(url)
        assert r.response["status"] == 200
        lm = r.response["header"]["last-modified"]
        assert lm
        r = env.curl_get(url, options=["-H", "if-modified-since: %s" % lm])
        assert 304 == r.response["status"]
        r = env.curl_get(url, options=["-H", "if-modified-since: Tue, 04 Sep 2010 11:51:59 GMT"])
        assert r.response["status"] == 200

    # check handling of 'if-none-match' header
    def test_h2_201_02(self, env):
        url = env.mkurl("https", "test1", "/006/006.css")
        r = env.curl_get(url)
        assert r.response["status"] == 200
        etag = r.response["header"]["etag"]
        assert etag
        r = env.curl_get(url, options=["-H", "if-none-match: %s" % etag])
        assert 304 == r.response["status"]
        r = env.curl_get(url, options=["-H", "if-none-match: dummy"])
        assert r.response["status"] == 200
        
    @pytest.mark.skipif(True, reason="304 misses the Vary header in trunk and 2.4.x")
    def test_h2_201_03(self, env):
        url = env.mkurl("https", "test1", "/006.html")
        r = env.curl_get(url, options=["-H", "Accept-Encoding: gzip"])
        assert r.response["status"] == 200
        for h in r.response["header"]:
            print("%s: %s" % (h, r.response["header"][h]))
        lm = r.response["header"]["last-modified"]
        assert lm
        assert "gzip" == r.response["header"]["content-encoding"]
        assert "Accept-Encoding" in r.response["header"]["vary"]
        
        r = env.curl_get(url, options=["-H", "if-modified-since: %s" % lm,
                                       "-H", "Accept-Encoding: gzip"])
        assert 304 == r.response["status"]
        for h in r.response["header"]:
            print("%s: %s" % (h, r.response["header"][h]))
        assert "vary" in r.response["header"]

    # Check if "Keep-Alive" response header is removed in HTTP/2.
    def test_h2_201_04(self, env):
        url = env.mkurl("https", "test1", "/006.html")
        r = env.curl_get(url, options=["--http1.1", "-H", "Connection: keep-alive"])
        assert r.response["status"] == 200
        assert "timeout=30, max=30" == r.response["header"]["keep-alive"]
        r = env.curl_get(url, options=["-H", "Connection: keep-alive"])
        assert r.response["status"] == 200
        assert "keep-alive" not in r.response["header"]
