# 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
# 
# def cache_headers():
#     d = datetime.now() + td365
#     return (
#         (hdrs.ACCESS_CONTROL_MAX_AGE, td365seconds),
#         (hdrs.CACHE_CONTROL, "max-age=%s, public" % td365seconds),
#         (hdrs.EXPIRES, d.strftime("%a, %d %b %Y %H:%M:%S")),
#     )


from aiohttp import web, hdrs
from .base import StreamingTransport
from .utils import CACHE_CONTROL, session_cookie, cors_headers, cache_headers



class XHRTransport(StreamingTransport):
    """Long polling derivative transports,
    used for XHRPolling and JSONPolling."""

    maxsize = 0

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

        if request.method == hdrs.METH_OPTIONS:
            headers = (
                (hdrs.CONTENT_TYPE, "application/javascript; charset=UTF-8"),
                (hdrs.ACCESS_CONTROL_ALLOW_METHODS, "OPTIONS, POST"),
            )
            headers += session_cookie(request)
            headers += cors_headers(request.headers)
            headers += cache_headers()
            return web.Response(status=204, headers=headers)

        headers = (
            (hdrs.CONTENT_TYPE, "application/javascript; charset=UTF-8"),
            (hdrs.CACHE_CONTROL, CACHE_CONTROL),
        )
        headers += session_cookie(request)

# 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
# 
# def cache_headers():
#     d = datetime.now() + td365
#     return (
#         (hdrs.ACCESS_CONTROL_MAX_AGE, td365seconds),
#         (hdrs.CACHE_CONTROL, "max-age=%s, public" % td365seconds),
#         (hdrs.EXPIRES, d.strftime("%a, %d %b %Y %H:%M:%S")),
#     )


# Path: sockjs/transports/xhr.py
from aiohttp import web, hdrs
from .base import StreamingTransport
from .utils import CACHE_CONTROL, session_cookie, cors_headers, cache_headers




class XHRTransport(StreamingTransport):
    """Long polling derivative transports,
    used for XHRPolling and JSONPolling."""

    maxsize = 0

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

        if request.method == hdrs.METH_OPTIONS:
            headers = (
                (hdrs.CONTENT_TYPE, "application/javascript; charset=UTF-8"),
                (hdrs.ACCESS_CONTROL_ALLOW_METHODS, "OPTIONS, POST"),
            )
            headers += session_cookie(request)
            headers += cors_headers(request.headers)
            headers += cache_headers()
            return web.Response(status=204, headers=headers)

        headers = (
            (hdrs.CONTENT_TYPE, "application/javascript; charset=UTF-8"),
            (hdrs.CACHE_CONTROL, CACHE_CONTROL),
        )
        headers += session_cookie(request)

        headers += cors_headers(request.headers)