123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- """
- _url.py
- websocket - WebSocket client library for Python
- Copyright 2021 engn33r
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- """
- __all__ = ["NoLock", "validate_utf8", "extract_err_message", "extract_error_code"]
- class NoLock:
- def __enter__(self):
- pass
- def __exit__(self, exc_type, exc_value, traceback):
- pass
- try:
- # If wsaccel is available we use compiled routines to validate UTF-8
- # strings.
- from wsaccel.utf8validator import Utf8Validator
- def _validate_utf8(utfbytes):
- return Utf8Validator().validate(utfbytes)[0]
- except ImportError:
- # UTF-8 validator
- # python implementation of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/
- _UTF8_ACCEPT = 0
- _UTF8_REJECT = 12
- _UTF8D = [
- # The first part of the table maps bytes to character classes that
- # to reduce the size of the transition table and create bitmasks.
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
- 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8,
- # The second part is a transition table that maps a combination
- # of a state of the automaton and a character class to a state.
- 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12,
- 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12,
- 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12,
- 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12,
- 12,36,12,12,12,12,12,12,12,12,12,12, ]
- def _decode(state, codep, ch):
- tp = _UTF8D[ch]
- codep = (ch & 0x3f) | (codep << 6) if (
- state != _UTF8_ACCEPT) else (0xff >> tp) & ch
- state = _UTF8D[256 + state + tp]
- return state, codep
- def _validate_utf8(utfbytes):
- state = _UTF8_ACCEPT
- codep = 0
- for i in utfbytes:
- state, codep = _decode(state, codep, i)
- if state == _UTF8_REJECT:
- return False
- return True
- def validate_utf8(utfbytes):
- """
- validate utf8 byte string.
- utfbytes: utf byte string to check.
- return value: if valid utf8 string, return true. Otherwise, return false.
- """
- return _validate_utf8(utfbytes)
- def extract_err_message(exception):
- if exception.args:
- return exception.args[0]
- else:
- return None
- def extract_error_code(exception):
- if exception.args and len(exception.args) > 1:
- return exception.args[0] if isinstance(exception.args[0], int) else None
|