1
# Written by Petru Paler
2
# see LICENSE.txt for license information
9
except (OverflowError, ValueError):
14
elif x[f] == '0' and newf != f+1:
18
def decode_string(x, f):
19
colon = x.index(':', f)
22
except (OverflowError, ValueError):
24
if x[f] == '0' and colon != f+1:
27
return (x[colon:colon+n], colon+n)
29
def decode_list(x, f):
32
v, f = decode_func[x[f]](x, f)
36
def decode_dict(x, f):
40
k, f = decode_string(x, f)
44
r[k], f = decode_func[x[f]](x, f)
48
decode_func['l'] = decode_list
49
decode_func['d'] = decode_dict
50
decode_func['i'] = decode_int
51
decode_func['0'] = decode_string
52
decode_func['1'] = decode_string
53
decode_func['2'] = decode_string
54
decode_func['3'] = decode_string
55
decode_func['4'] = decode_string
56
decode_func['5'] = decode_string
57
decode_func['6'] = decode_string
58
decode_func['7'] = decode_string
59
decode_func['8'] = decode_string
60
decode_func['9'] = decode_string
64
r, l = decode_func[x[0]](x, 0)
65
except (IndexError, KeyError):
83
bdecode('i341foo382e')
87
assert bdecode('i4e') == 4L
88
assert bdecode('i0e') == 0L
89
assert bdecode('i123456789e') == 123456789L
90
assert bdecode('i-10e') == -10L
112
bdecode('35208734823ljdahflajhdf')
117
bdecode('2:abfdjslhfld')
121
assert bdecode('0:') == ''
122
assert bdecode('3:abc') == 'abc'
123
assert bdecode('10:1234567890') == '1234567890'
134
assert bdecode('le') == []
136
bdecode('leanfdldjfh')
140
assert bdecode('l0:0:0:e') == ['', '', '']
142
bdecode('relwjhrlewjh')
146
assert bdecode('li1ei2ei3ee') == [1, 2, 3]
147
assert bdecode('l3:asd2:xye') == ['asd', 'xy']
148
assert bdecode('ll5:Alice3:Bobeli2ei3eee') == [['Alice', 'Bob'], [2, 3]]
159
assert bdecode('de') == {}
160
assert bdecode('d3:agei25e4:eyes4:bluee') == {'age': 25, 'eyes': 'blue'}
161
assert bdecode('d8:spam.mp3d6:author5:Alice6:lengthi100000eee') == {'spam.mp3': {'author': 'Alice', 'length': 100000}}
173
bdecode('d1:b0:1:a0:e')
178
bdecode('d1:a0:1:a0:e')
229
from types import StringType, IntType, LongType, DictType, ListType, TupleType
231
class Bencached(object):
232
__slots__ = ['bencoded']
234
def __init__(self, s):
237
def encode_bencached(x,r):
240
def encode_int(x, r):
241
r.extend(('i', str(x), 'e'))
243
def encode_string(x, r):
244
r.extend((str(len(x)), ':', x))
246
def encode_list(x, r):
249
encode_func[type(i)](i, r)
252
def encode_dict(x,r):
257
r.extend((str(len(k)), ':', k))
258
encode_func[type(v)](v, r)
262
encode_func[type(Bencached(0))] = encode_bencached
263
encode_func[IntType] = encode_int
264
encode_func[LongType] = encode_int
265
encode_func[StringType] = encode_string
266
encode_func[ListType] = encode_list
267
encode_func[TupleType] = encode_list
268
encode_func[DictType] = encode_dict
271
from types import BooleanType
272
encode_func[BooleanType] = encode_int
278
encode_func[type(x)](x, r)
282
assert bencode(4) == 'i4e'
283
assert bencode(0) == 'i0e'
284
assert bencode(-10) == 'i-10e'
285
assert bencode(12345678901234567890L) == 'i12345678901234567890e'
286
assert bencode('') == '0:'
287
assert bencode('abc') == '3:abc'
288
assert bencode('1234567890') == '10:1234567890'
289
assert bencode([]) == 'le'
290
assert bencode([1, 2, 3]) == 'li1ei2ei3ee'
291
assert bencode([['Alice', 'Bob'], [2, 3]]) == 'll5:Alice3:Bobeli2ei3eee'
292
assert bencode({}) == 'de'
293
assert bencode({'age': 25, 'eyes': 'blue'}) == 'd3:agei25e4:eyes4:bluee'
294
assert bencode({'spam.mp3': {'author': 'Alice', 'length': 100000}}) == 'd8:spam.mp3d6:author5:Alice6:lengthi100000eee'
295
assert bencode(Bencached(bencode(3))) == 'i3e'