diff --git a/CHANGELOG.md b/CHANGELOG.md index d8e1b2f8e..af7fde0c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,7 +30,7 @@ at anytime. ### Added * 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 - * + * forward-compaitibility for upcoming DHT bencoding changes ### Removed * short(single dashed) arguments for `lbrynet-cli` diff --git a/lbrynet/daemon/Daemon.py b/lbrynet/daemon/Daemon.py index 12935af24..02703b8ef 100644 --- a/lbrynet/daemon/Daemon.py +++ b/lbrynet/daemon/Daemon.py @@ -2045,7 +2045,7 @@ class Daemon(AuthJSONRPCServer): .format(MAX_UPDATE_FEE_ESTIMATE - balance)) elif bid > max_bid_amount: 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)) metadata = metadata or {} diff --git a/lbrynet/dht/encoding.py b/lbrynet/dht/encoding.py index 45aeb3496..9862ca0d2 100644 --- a/lbrynet/dht/encoding.py +++ b/lbrynet/dht/encoding.py @@ -64,16 +64,9 @@ class Bencode(Encoding): keys = data.keys() keys.sort() for key in keys: - encodedDictItems += self.encode(key) + encodedDictItems += self.encode(key) # TODO: keys should always be bytestrings encodedDictItems += self.encode(data[key]) 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: print data raise TypeError("Cannot bencode '%s' object" % type(data)) diff --git a/lbrynet/dht/msgformat.py b/lbrynet/dht/msgformat.py index ae9cab435..7a9dd5378 100644 --- a/lbrynet/dht/msgformat.py +++ b/lbrynet/dht/msgformat.py @@ -43,24 +43,31 @@ class MessageTranslator(object): class DefaultFormat(MessageTranslator): """ The default on-the-wire message format for this library """ 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): msgType = msgPrimitive[self.headerType] if msgType == self.typeRequest: - msg = msgtypes.RequestMessage(msgPrimitive[self.headerNodeID], - msgPrimitive[self.headerPayload], - msgPrimitive[self.headerArgs], - msgPrimitive[self.headerMsgID]) + msg = msgtypes.RequestMessage(self.get(msgPrimitive, self.headerNodeID), + self.get(msgPrimitive, self.headerPayload), + self.get(msgPrimitive, self.headerArgs), + self.get(msgPrimitive, self.headerMsgID)) elif msgType == self.typeResponse: - msg = msgtypes.ResponseMessage(msgPrimitive[self.headerMsgID], - msgPrimitive[self.headerNodeID], - msgPrimitive[self.headerPayload]) + msg = msgtypes.ResponseMessage(self.get(msgPrimitive, self.headerMsgID), + self.get(msgPrimitive, self.headerNodeID), + self.get(msgPrimitive, self.headerPayload)) elif msgType == self.typeError: - msg = msgtypes.ErrorMessage(msgPrimitive[self.headerMsgID], - msgPrimitive[self.headerNodeID], - msgPrimitive[self.headerPayload], - msgPrimitive[self.headerArgs]) + msg = msgtypes.ErrorMessage(self.get(msgPrimitive, self.headerMsgID), + self.get(msgPrimitive, self.headerNodeID), + self.get(msgPrimitive, self.headerPayload), + self.get(msgPrimitive, self.headerArgs)) else: # Unknown message, no payload msg = msgtypes.Message(msgPrimitive[self.headerMsgID], msgPrimitive[self.headerNodeID]) diff --git a/lbrynet/dht/protocol.py b/lbrynet/dht/protocol.py index 9e535138e..b2d3e657a 100644 --- a/lbrynet/dht/protocol.py +++ b/lbrynet/dht/protocol.py @@ -209,7 +209,7 @@ class KademliaProtocol(protocol.DatagramProtocol): except (encoding.DecodeError, ValueError): # We received some rubbish here return - except IndexError: + except (IndexError, KeyError): log.warning("Couldn't decode dht datagram from %s", address) return