Merge pull request #1138 from lbryio/dht-compat

make dht forwards-compatible for upcoming switch to standardized bencode dict keys
This commit is contained in:
Alex Grin 2018-03-13 09:47:00 -04:00 committed by GitHub
commit 6dd8138c05
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 23 deletions

View file

@ -30,7 +30,7 @@ at anytime.
### Added ### Added
* scripts to autogenerate documentation * scripts to autogenerate documentation
* now updating new channel also takes into consideration the original bid amount, so now channel could be updated for wallet balance + the original bid amount * now updating new channel also takes into consideration the original bid amount, so now channel could be updated for wallet balance + the original bid amount
* * forward-compaitibility for upcoming DHT bencoding changes
### Removed ### Removed
* short(single dashed) arguments for `lbrynet-cli` * short(single dashed) arguments for `lbrynet-cli`

View file

@ -2045,7 +2045,7 @@ class Daemon(AuthJSONRPCServer):
.format(MAX_UPDATE_FEE_ESTIMATE - balance)) .format(MAX_UPDATE_FEE_ESTIMATE - balance))
elif bid > max_bid_amount: elif bid > max_bid_amount:
raise InsufficientFundsError( raise InsufficientFundsError(
"Please lower the bid value, the maximum amount you can specify for this claim is {}" "Please lower the bid. After accounting for the estimated fee, you only have {} left."
.format(max_bid_amount)) .format(max_bid_amount))
metadata = metadata or {} metadata = metadata or {}

View file

@ -64,16 +64,9 @@ class Bencode(Encoding):
keys = data.keys() keys = data.keys()
keys.sort() keys.sort()
for key in keys: for key in keys:
encodedDictItems += self.encode(key) encodedDictItems += self.encode(key) # TODO: keys should always be bytestrings
encodedDictItems += self.encode(data[key]) encodedDictItems += self.encode(data[key])
return 'd%se' % encodedDictItems return 'd%se' % encodedDictItems
elif isinstance(data, float):
# This (float data type) is a non-standard extension to the original Bencode algorithm
return 'f%fe' % data
elif data is None:
# This (None/NULL data type) is a non-standard extension
# to the original Bencode algorithm
return 'n'
else: else:
print data print data
raise TypeError("Cannot bencode '%s' object" % type(data)) raise TypeError("Cannot bencode '%s' object" % type(data))

View file

@ -43,24 +43,31 @@ class MessageTranslator(object):
class DefaultFormat(MessageTranslator): class DefaultFormat(MessageTranslator):
""" The default on-the-wire message format for this library """ """ The default on-the-wire message format for this library """
typeRequest, typeResponse, typeError = range(3) typeRequest, typeResponse, typeError = range(3)
headerType, headerMsgID, headerNodeID, headerPayload, headerArgs = range(5) headerType, headerMsgID, headerNodeID, headerPayload, headerArgs = range(5) # TODO: make str
@staticmethod
def get(primitive, key):
try:
return primitive[key]
except KeyError:
return primitive[str(key)] # TODO: switch to int()
def fromPrimitive(self, msgPrimitive): def fromPrimitive(self, msgPrimitive):
msgType = msgPrimitive[self.headerType] msgType = msgPrimitive[self.headerType]
if msgType == self.typeRequest: if msgType == self.typeRequest:
msg = msgtypes.RequestMessage(msgPrimitive[self.headerNodeID], msg = msgtypes.RequestMessage(self.get(msgPrimitive, self.headerNodeID),
msgPrimitive[self.headerPayload], self.get(msgPrimitive, self.headerPayload),
msgPrimitive[self.headerArgs], self.get(msgPrimitive, self.headerArgs),
msgPrimitive[self.headerMsgID]) self.get(msgPrimitive, self.headerMsgID))
elif msgType == self.typeResponse: elif msgType == self.typeResponse:
msg = msgtypes.ResponseMessage(msgPrimitive[self.headerMsgID], msg = msgtypes.ResponseMessage(self.get(msgPrimitive, self.headerMsgID),
msgPrimitive[self.headerNodeID], self.get(msgPrimitive, self.headerNodeID),
msgPrimitive[self.headerPayload]) self.get(msgPrimitive, self.headerPayload))
elif msgType == self.typeError: elif msgType == self.typeError:
msg = msgtypes.ErrorMessage(msgPrimitive[self.headerMsgID], msg = msgtypes.ErrorMessage(self.get(msgPrimitive, self.headerMsgID),
msgPrimitive[self.headerNodeID], self.get(msgPrimitive, self.headerNodeID),
msgPrimitive[self.headerPayload], self.get(msgPrimitive, self.headerPayload),
msgPrimitive[self.headerArgs]) self.get(msgPrimitive, self.headerArgs))
else: else:
# Unknown message, no payload # Unknown message, no payload
msg = msgtypes.Message(msgPrimitive[self.headerMsgID], msgPrimitive[self.headerNodeID]) msg = msgtypes.Message(msgPrimitive[self.headerMsgID], msgPrimitive[self.headerNodeID])

View file

@ -209,7 +209,7 @@ class KademliaProtocol(protocol.DatagramProtocol):
except (encoding.DecodeError, ValueError): except (encoding.DecodeError, ValueError):
# We received some rubbish here # We received some rubbish here
return return
except IndexError: except (IndexError, KeyError):
log.warning("Couldn't decode dht datagram from %s", address) log.warning("Couldn't decode dht datagram from %s", address)
return return