# Path: sockjs/protocol.py
# def dumps(data):
#     return json.dumps(data, **kwargs)
# 
# ENCODING = "utf-8"
# 
# Path: sockjs/transports/base.py
# class StreamingTransport(Transport):
# 
#     timeout = None
#     maxsize = 131072  # 128K bytes
# 
#     def __init__(self, manager, session, request):
#         super().__init__(manager, session, request)
# 
#         self.size = 0
#         self.response = None
# 
#     async def send(self, text):
#         blob = (text + "\n").encode(ENCODING)
#         await self.response.write(blob)
# 
#         self.size += len(blob)
#         if self.size > self.maxsize:
#             return True
#         else:
#             return False
# 
#     async def handle_session(self):
#         assert self.response is not None, "Response is not specified."
# 
#         # session was interrupted
#         if self.session.interrupted:
#             await self.send(close_frame(1002, "Connection interrupted"))
# 
#         # session is closing or closed
#         elif self.session.state in (STATE_CLOSING, STATE_CLOSED):
#             await self.session._remote_closed()
#             await self.send(close_frame(3000, "Go away!"))
# 
#         else:
#             # acquire session
#             try:
#                 await self.manager.acquire(self.session)
#             except SessionIsAcquired:
#                 await self.send(close_frame(2010, "Another connection still open"))
#             else:
#                 try:
#                     while True:
#                         if self.timeout:
#                             try:
#                                 frame, text = await asyncio.wait_for(
#                                     self.session._wait(), timeout=self.timeout
#                                 )
#                             except asyncio.futures.TimeoutError:
#                                 frame, text = FRAME_MESSAGE, "a[]"
#                         else:
#                             frame, text = await self.session._wait()
# 
#                         if frame == FRAME_CLOSE:
#                             await self.session._remote_closed()
#                             await self.send(text)
#                             return
#                         else:
#                             stop = await self.send(text)
#                             if stop:
#                                 break
#                 except asyncio.CancelledError:
#                     await self.session._remote_close(exc=aiohttp.ClientConnectionError)
#                     await self.session._remote_closed()
#                     raise
#                 except SessionIsClosed:
#                     pass
#                 finally:
#                     await self.manager.release(self.session)
# 
# Path: sockjs/transports/utils.py
# CACHE_CONTROL = "no-store, no-cache, no-transform, must-revalidate, max-age=0"
# 
# def session_cookie(request):
#     cookie = request.cookies.get("JSESSIONID", "dummy")
#     cookies = http.cookies.SimpleCookie()
#     cookies["JSESSIONID"] = cookie
#     cookies["JSESSIONID"]["path"] = "/"
#     return ((hdrs.SET_COOKIE, cookies["JSESSIONID"].output(header="")[1:]),)
# 
# def cors_headers(headers, nocreds=False):
#     origin = headers.get(hdrs.ORIGIN, "*")
#     cors = ((hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, origin),)
# 
#     ac_headers = headers.get(hdrs.ACCESS_CONTROL_REQUEST_HEADERS)
#     if ac_headers:
#         cors += ((hdrs.ACCESS_CONTROL_ALLOW_HEADERS, ac_headers),)
# 
#     if origin != "*":
#         return cors + ((hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"),)
#     else:
#         return cors


import re
from aiohttp import web, hdrs
from ..protocol import dumps, ENCODING
from .base import StreamingTransport
from .utils import CACHE_CONTROL, session_cookie, cors_headers
    check_callback = re.compile(r"^[a-zA-Z0-9_\.]+$")

    async def send(self, text):
        blob = ("<script>\np(%s);\n</script>\r\n" % dumps(text)).encode(ENCODING)
        await self.response.write(blob)

        self.size += len(blob)
        if self.size > self.maxsize:
            return True
        else:
            return False

    async def process(self):
        request = self.request

        try:
            callback = request.query.get("c", None)
        except Exception:
            callback = request.GET.get("c", None)

        if callback is None:
            await self.session._remote_closed()
            return web.HTTPInternalServerError(text='"callback" parameter required')

        elif not self.check_callback.match(callback):
            await self.session._remote_closed()
            return web.HTTPInternalServerError(text='invalid "callback" parameter')

        headers = (
            (hdrs.CONTENT_TYPE, "text/html; charset=UTF-8"),

# Path: sockjs/protocol.py
# def dumps(data):
#     return json.dumps(data, **kwargs)
# 
# ENCODING = "utf-8"
# 
# Path: sockjs/transports/base.py
# class StreamingTransport(Transport):
# 
#     timeout = None
#     maxsize = 131072  # 128K bytes
# 
#     def __init__(self, manager, session, request):
#         super().__init__(manager, session, request)
# 
#         self.size = 0
#         self.response = None
# 
#     async def send(self, text):
#         blob = (text + "\n").encode(ENCODING)
#         await self.response.write(blob)
# 
#         self.size += len(blob)
#         if self.size > self.maxsize:
#             return True
#         else:
#             return False
# 
#     async def handle_session(self):
#         assert self.response is not None, "Response is not specified."
# 
#         # session was interrupted
#         if self.session.interrupted:
#             await self.send(close_frame(1002, "Connection interrupted"))
# 
#         # session is closing or closed
#         elif self.session.state in (STATE_CLOSING, STATE_CLOSED):
#             await self.session._remote_closed()
#             await self.send(close_frame(3000, "Go away!"))
# 
#         else:
#             # acquire session
#             try:
#                 await self.manager.acquire(self.session)
#             except SessionIsAcquired:
#                 await self.send(close_frame(2010, "Another connection still open"))
#             else:
#                 try:
#                     while True:
#                         if self.timeout:
#                             try:
#                                 frame, text = await asyncio.wait_for(
#                                     self.session._wait(), timeout=self.timeout
#                                 )
#                             except asyncio.futures.TimeoutError:
#                                 frame, text = FRAME_MESSAGE, "a[]"
#                         else:
#                             frame, text = await self.session._wait()
# 
#                         if frame == FRAME_CLOSE:
#                             await self.session._remote_closed()
#                             await self.send(text)
#                             return
#                         else:
#                             stop = await self.send(text)
#                             if stop:
#                                 break
#                 except asyncio.CancelledError:
#                     await self.session._remote_close(exc=aiohttp.ClientConnectionError)
#                     await self.session._remote_closed()
#                     raise
#                 except SessionIsClosed:
#                     pass
#                 finally:
#                     await self.manager.release(self.session)
# 
# Path: sockjs/transports/utils.py
# CACHE_CONTROL = "no-store, no-cache, no-transform, must-revalidate, max-age=0"
# 
# def session_cookie(request):
#     cookie = request.cookies.get("JSESSIONID", "dummy")
#     cookies = http.cookies.SimpleCookie()
#     cookies["JSESSIONID"] = cookie
#     cookies["JSESSIONID"]["path"] = "/"
#     return ((hdrs.SET_COOKIE, cookies["JSESSIONID"].output(header="")[1:]),)
# 
# def cors_headers(headers, nocreds=False):
#     origin = headers.get(hdrs.ORIGIN, "*")
#     cors = ((hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, origin),)
# 
#     ac_headers = headers.get(hdrs.ACCESS_CONTROL_REQUEST_HEADERS)
#     if ac_headers:
#         cors += ((hdrs.ACCESS_CONTROL_ALLOW_HEADERS, ac_headers),)
# 
#     if origin != "*":
#         return cors + ((hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"),)
#     else:
#         return cors


# Path: sockjs/transports/htmlfile.py
import re
from aiohttp import web, hdrs
from ..protocol import dumps, ENCODING
from .base import StreamingTransport
from .utils import CACHE_CONTROL, session_cookie, cors_headers

    check_callback = re.compile(r"^[a-zA-Z0-9_\.]+$")

    async def send(self, text):
        blob = ("<script>\np(%s);\n</script>\r\n" % dumps(text)).encode(ENCODING)
        await self.response.write(blob)

        self.size += len(blob)
        if self.size > self.maxsize:
            return True
        else:
            return False

    async def process(self):
        request = self.request

        try:
            callback = request.query.get("c", None)
        except Exception:
            callback = request.GET.get("c", None)

        if callback is None:
            await self.session._remote_closed()
            return web.HTTPInternalServerError(text='"callback" parameter required')

        elif not self.check_callback.match(callback):
            await self.session._remote_closed()
            return web.HTTPInternalServerError(text='invalid "callback" parameter')

        headers = (
            (hdrs.CONTENT_TYPE, "text/html; charset=UTF-8"),

            (hdrs.CACHE_CONTROL, CACHE_CONTROL),