code: def upgrade_websocket(self, environ, start_response):
          
          websocket_version = environ.get('HTTP_SEC_WEBSOCKET_VERSION', '')
          if not websocket_version:
              raise UpgradeRequiredError
          elif websocket_version not in self.WS_VERSIONS:
              raise HandshakeError('Unsupported WebSocket Version: {0}'.format(websocket_version))
  
          key = environ.get('HTTP_SEC_WEBSOCKET_KEY', '').strip()
          if not key:
              raise HandshakeError('Sec-WebSocket-Key header is missing/empty')
          try:
              key_len = len(base64.b64decode(key))
          except TypeError:
              raise HandshakeError('Invalid key: {0}'.format(key))
          if key_len != 16:
              # 5.2.1 (3)
              raise HandshakeError('Invalid key: {0}'.format(key))
  
          sec_ws_accept = base64.b64encode(sha1(six.b(key) + self.WS_GUID).digest())
          if six.PY3:
              sec_ws_accept = sec_ws_accept.decode('ascii')
          headers = [
              ('Upgrade', 'websocket'),
              ('Connection', 'Upgrade'),
              ('Sec-WebSocket-Accept', sec_ws_accept),
              ('Sec-WebSocket-Version', str(websocket_version))
          ]
          if environ.get('HTTP_SEC_WEBSOCKET_PROTOCOL') is not None:
              headers.append(('Sec-WebSocket-Protocol', environ.get('HTTP_SEC_WEBSOCKET_PROTOCOL')))
  
          logger.debug('WebSocket request accepted, switching protocols')
          start_response(force_str('101 Switching Protocols'), headers)
          six.get_method_self(start_response).finish_content()
          return WebSocket(environ['wsgi.input'])
docs: Attempt to upgrade the socket environ['wsgi.input'] into a websocket enabled connection.