예제 #1
0
 def _get_cookie_kvp(self, cookie: str) -> (str, str):
     """parse cookie str to key-value pair"""
     k, v = helper_str.get_kvp(cookie, '=')
     if k is None or k == "" or v is None or v == "":
         return (k, v)
     v = v.rstrip().rstrip(';')
     return (k, v)
예제 #2
0
    def _parse_req_headers(self, headers: str):
        """parse str headers like:
        aaa:aaa
        bbb:bbb
        ...

        to 

        {
            "aaa":"aaa",
            "bbb":"bbb"
        }
        """
        res = {}
        try:
            if headers is None or headers == "":
                return res
            allheaders = headers.split('\n')
            for oneheader in allheaders:
                k, v = helper_str.get_kvp(oneheader, ':')
                if k is None or k == "" or v is None or v == "":
                    continue
                # do not check duplicate keys here
                res[k.strip()] = v.strip()

        except Exception as ex:
            raise ex
        return res
예제 #3
0
    def _parse_data(self, data: str):
        """parse str data like:
        aaa=aaa&bbb=bbb
        ...

        to 

        {
            "aaa":"aaa",
            "bbb":"bbb"
        }
        """
        res = {}
        try:
            if data is None or data == "":
                return res
            alldatas = data.split('&')
            for onedata in alldatas:
                k, v = helper_str.get_kvp(onedata, '=')
                if k is None or k == "" or v is None or v == "":
                    continue
                # do not check duplicate keys here
                res[k] = v

        except Exception as ex:
            raise ex
        return res
예제 #4
0
    def __get_segs_from_stream(self, stm: io.IOBase,
                               targettype: type = None) -> iter:
        """从流中读取字段,返回 DataSeg 对象迭代器\n
        targettype: 目标类型,可以为任何 DataSeg 类型的子类,若为空,则返回 DataSeg 类型的对象"""
        try:

            if stm is None or stm.closed:
                raise Exception("Data stream is unreadable")

            segidx = 1
            segline = 0
            seg: DataSeg = DataSeg()
            prevline: str = ''
            for line in stm:
                if line is None or line == "":
                    break

                segline += 1

                if (line == '\n' or line == '\r\n') and \
                        (prevline.endswith('\n') or prevline.endswith('\r\n')):
                    seg.segindex = segidx
                    segidx += 1
                    seg.segline = segline
                    yield seg
                    seg = DataSeg()
                else:
                    k, v = helper_str.get_kvp(line, ':')
                    if not k is None and not k == "":
                        v = helper_str.base64_decode_format(v)
                        # 这里若遇到键相同,容错处理只保留第一次读到的键值对
                        if not seg._fields.__contains__(k):
                            seg._fields[k] = v.strip()

                prevline = line

            if not seg is None and len(seg._fields) > 0:
                seg.segindex = segidx
                seg.segline = segline
                yield seg

        except Exception as ex:
            raise ex
예제 #5
0
    def _get_segments(self, data: InputData) -> iter:
        """读取数据流,返回数据段枚举"""
        try:

            if data.stream is None or not data.stream.readable():
                self._logger.error(
                    "Data stream is None when trying to convert to standard Task: %s"
                    % data._source)
                return

            segidx = 1
            seg: DataSeg = DataSeg()
            prevline: str = None
            for line in data.stream:
                if line is None or line == "":
                    break

                if (line == '\n' or line == '\r\n') and (prevline == '\n' or
                                                         prevline == '\r\n'):
                    seg.segindex = segidx
                    segidx += 1
                    yield seg
                    seg = DataSeg()

                k, v = helper_str.get_kvp(line, ':')
                if not k is None and not k == "":
                    # 这里若遇到键相同,容错处理只保留第一次读到的键值对
                    v = helper_str.base64_decode_format(v)
                    if not seg._fields.__contains__(k):
                        seg._fields[k] = v.strip()

                prevline = line

            if not seg is None and len(seg._fields) > 0:
                yield seg

        except Exception:
            self._logger.error("Read data segments error:\ndata:%s\nex:%s" %
                               (data._source, traceback.format_exc()))
            if not data is None:
                data.on_complete(False)