import time
from socket import error as socket_error


def url_dir(request):
    return '/'.join(request.url_parts.path.split('/')[:-1]) + '/'


def stash_write(request, key, value):
    """Write to the stash, overwriting any previous value"""
    request.server.stash.take(key, url_dir(request))
    request.server.stash.put(key, value, url_dir(request))


def main(request, response):
    stateKey = request.GET.first("stateKey", "")
    abortKey = request.GET.first("abortKey", "")

    if stateKey:
        stash_write(request, stateKey, 'open')

    response.headers.set("Content-type", "text/plain")
    response.write_status_headers()

    # Writing an initial 2k so browsers realise it's there. *shrug*
    response.writer.write("." * 2048)

    while True:
        if not response.writer.flush():
            break
        # Trigger socket error on Python3, because flush doesn't
        try:
            response.writer._wfile._sock.getpeername()
        except (OSError,socket_error):
            break
        if abortKey and request.server.stash.take(abortKey, url_dir(request)):
            break
        response.writer.write(".")
        time.sleep(0.01)

    if stateKey:
        stash_write(request, stateKey, 'closed')
