| """ |
| websocket - WebSocket client library for Python |
| |
| Copyright (C) 2010 Hiroki Ohtani(liris) |
| |
| This library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| This library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with this library; if not, write to the Free Software |
| Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| Boston, MA 02110-1335 USA |
| |
| """ |
| import six |
| |
| __all__ = ["NoLock", "validate_utf8", "extract_err_message", "extract_error_code"] |
| |
| |
| class NoLock(object): |
| |
| 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: |
| if six.PY2: |
| i = ord(i) |
| 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 |