Hi all, I'm trying to transfer a binary file over xmlrpclib. My test file is a .jpeg file. I can transfer all the data over but when I go to open the .jpeg I get "Error interpreting JPEG image file (Invalid JPEG file structure: SOS before SOF)"
here's the code: ===========Various Shared Functions======== #EncodeAES takes a Cipher c and encrypts a String s EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) #DecodeAES takes a Cipher C and decrypts the cyphertext e #then removes the padding from the decrypted string DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) CIPHER = AES.new("KEY") # method to change strings back into tuples def stringToTuple(string): if string[0] + string[-1] == "()": items = string[1:-1] items = items.split(',') return items else: raise ValueError("Badly formatted string (missing brackets).") ======client================= def Download(self, FileName, Data_Size=1024): ErrorCount = 0 Pkt_Num = -1 OldPkt_Num = Pkt_Num localFile = open("files/"+FileName, "wb") print print "Requesting First Packet" packet = self.client.download(EncodeAES(CIPHER, str(Pkt_Num))) if packet[0] == "False": print packet[1] return False packet = stringToTuple(DecodeAES(CIPHER, packet)) if int(packet[0]) == -3: print "Received Error Packet" else: print "Received Packet: ", int(packet[0]) print "packet[1], ", packet[2:-1] Pkt_Num = int(packet[0]) while Pkt_Num >= 0 and ErrorCount <= 10: if (OldPkt_Num +1) == Pkt_Num: OldPkt_Num = OldPkt_Num +1 localFile.write(binascii. a2b_base64(packet[1][2:-1])) #<<<<!!!!!<<< writing to the file on the client ErrorCount == 0 else: ErrorCount = ErrorCount +1 Pkt_Num = OldPkt_Num print "Requesting Packet: ", Pkt_Num +1 packet = self.client.download(EncodeAES(CIPHER, str(Pkt_Num))) packet = stringToTuple(DecodeAES(CIPHER, packet)) Pkt_Num = int(packet[0]) if int(packet[0]) == -3: print "Received Error Packet" elif int(packet[0]) == -2: print "Received EOF" else: print "Received Packet: ", int(packet[0]) localFile.close() if Pkt_Num == -2: print packet[1][2:-1] return True elif Pkt_Num == -3: os.remove("files/"+FileName) print packet[1][2:-1] return False else: os.remove("files/"+FileName) print "Unexpected Packet: File Transfer Stopped" return False ==========Server Method============= def download(self, Pkt_Num): Old_Pkt_Num = self.PKT DataRate = self.DATA Pkt_Num = int(DecodeAES(CIPHER,Pkt_Num)) if Pkt_Num == -1 and Old_Pkt_Num == -1: Pkt_Num = 0 try: f = open("files/"+self.usr_dict[client][FILENAME], "rb") except IOError: return EncodeAES(CIPHER, str((-3, "File Could Not be opened"))) data = binascii.b2a_base64(f.read((Pkt_Num+1 * DataRate))) #<<<<<<!!!!!!!<<<<<<<< reading from file f.close() self.usr_dict[client][PKT] = Pkt_Num return EncodeAES(CIPHER, str((Pkt_Num, data))) elif Pkt_Num == Old_Pkt_Num: if Pkt_Num * DataRate >= os.path.getsize("files/"+self.usr_dict[client][FILENAME]): return EncodeAES(CIPHER, str((-2, "File Transfer Complete"))) try: f = open("files/"+self.usr_dict[client][FILENAME], "rb") except IOError: return EncodeAES(CIPHER, str((-3, "File Could Not be opened"))) data = f.read((Pkt_Num+1 * DataRate)) data = None data = binascii.b2a_base64(f.read(DataRate)) #<<<<<<<<!!!!!!!<<<<<<< reading from file f.close() self.usr_dict[client][PKT] = Pkt_Num +1 return EncodeAES(CIPHER, str((Pkt_Num+1, data))) else: return EncodeAES(CIPHER, str((-3, "Incorrect Packet Requested"))) Thank you all for the help, I know there are better ways and transfer protocol modules to but I'd like to do this without them. ~Jordan -- http://mail.python.org/mailman/listinfo/python-list