def uploadFiles(request): if 'cmd' not in request or request['cmd'] != "uploadFiles": raise StateError('uploadFiles: incorrect cmd request: {}'.format(request)) if Web.wsDataConn is None: # A remote fileWatcher hasn't connected yet errStr = 'Waiting for fileWatcher to attach, please try again momentarily' Web.setUserError(errStr) return try: srcFile = request['srcFile'] compress = request['compress'] except KeyError as err: Web.setUserError("UploadFiles request missing a parameter: {}".format(err)) return # get the list of file to upload cmd = listFilesReqStruct(srcFile) response = Web.sendDataMsgFromThread(cmd, timeout=10) if response.get('status') != 200: Web.setUserError("Error listing files {}: {}". format(srcFile, response.get('error'))) return fileList = response.get('fileList') if type(fileList) is not list: Web.setUserError("Invalid fileList reponse type {}: expecting list". format(type(fileList))) return if len(fileList) == 0: response = {'cmd': 'uploadProgress', 'file': 'No Matching Files'} Web.sendUserMsgFromThread(json.dumps(response)) return for file in fileList: try: cmd = getFileReqStruct(file, compress=compress) data = handleDataRequest(cmd) # write the returned data out to a file filename = response.get('filename') if filename is None: if 'data' in response: del response['data'] raise StateError('sendDataRequestToFile: filename field not in response: {}'.format(response)) # prepend with common output path and write out file # note: can't just use os.path.join() because if two or more elements # have an aboslute path it discards the earlier elements global CommonOutputDir outputFilename = os.path.normpath(CommonOutputDir + filename) dirName = os.path.dirname(outputFilename) if not os.path.exists(dirName): os.makedirs(dirName) writeFile(outputFilename, data) response['filename'] = outputFilename except Exception as err: Web.setUserError( "Error uploading file {}: {}".format(file, str(err))) return response = {'cmd': 'uploadProgress', 'file': file} Web.sendUserMsgFromThread(json.dumps(response)) response = {'cmd': 'uploadProgress', 'file': '------upload complete------'} Web.sendUserMsgFromThread(json.dumps(response))
def getFile(self, filename): data = None if self.local: with open(filename, 'rb') as fp: data = fp.read() else: getFileCmd = projUtils.getFileReqStruct(filename) retVals = projUtils.clientSendCmd(self.commPipes, getFileCmd) data = retVals.data return data
def test_getBigFile(self, bigTestfile): # Read in original data with open(bigTestfile, 'rb') as fp: data = fp.read() # Read via fileClient startTime = time.time() cmd = projUtils.getFileReqStruct(bigTestfile) try: responseData = handleDataRequest(cmd) except Exception as err: assert False, str(err) assert responseData == data print('Read Bigfile time: {}'.format(time.time() - startTime)) # Write bigFile Synchronous startTime = time.time() cmd = projUtils.putBinaryFileReqStruct(bigTestfile) for putFilePart in projUtils.generateDataParts(data, cmd, compress=False): response = Web.sendDataMsgFromThread(putFilePart) assert response['status'] == 200 print('Write Bigfile sync time: {}'.format(time.time() - startTime)) # Write bigFile Asynchronous startTime = time.time() cmd = projUtils.putBinaryFileReqStruct(bigTestfile) callIds = [] for putFilePart in projUtils.generateDataParts(data, cmd, compress=False): callId = Web.sendDataMsgFromThreadAsync(putFilePart) callIds.append(callId) for callId in callIds: response = Web.getDataMsgResponse(callId) assert response['status'] == 200 print('Write Bigfile async time: {}'.format(time.time() - startTime)) # Read back written data writtenPath = os.path.join(CommonOutputDir, bigTestfile) with open(writtenPath, 'rb') as fp: writtenData = fp.read() assert writtenData == data
def test_getFile(self, dicomTestFilename): print("test_getFile") global fileData assert Web.wsDataConn is not None # Try to initialize file watcher with non-allowed directory cmd = projUtils.initWatchReqStruct('/', '*', 0) response = Web.sendDataMsgFromThread(cmd) # we expect an error because '/' directory not allowed assert response['status'] == 400 # Initialize with allowed directory cmd = projUtils.initWatchReqStruct(testDir, '*.dcm', 0) response = Web.sendDataMsgFromThread(cmd) assert response['status'] == 200 dcmImg = readDicomFromFile(dicomTestFilename) anonDcm = anonymizeDicom(dcmImg) data = writeDicomToBuffer(anonDcm) # with open(dicomTestFilename, 'rb') as fp: # data = fp.read() cmd = projUtils.watchFileReqStruct(dicomTestFilename) try: responseData = handleDataRequest(cmd) except Exception as err: assert False, str(err) # import pdb; pdb.set_trace() assert responseData == data # Try compressed version cmd = projUtils.watchFileReqStruct(dicomTestFilename, compress=True) try: responseData = handleDataRequest(cmd) except Exception as err: assert False, str(err) assert responseData == data cmd = projUtils.getFileReqStruct(dicomTestFilename) try: responseData = handleDataRequest(cmd) except Exception as err: assert False, str(err) assert responseData == data # Try compressed version cmd = projUtils.getFileReqStruct(dicomTestFilename, compress=True) try: responseData = handleDataRequest(cmd) except Exception as err: assert False, str(err) assert responseData == data cmd = projUtils.getNewestFileReqStruct(dicomTestFilename) try: responseData = handleDataRequest(cmd) except Exception as err: assert False, str(err) assert responseData == data # Try to get a non-allowed file cmd = projUtils.getFileReqStruct('/tmp/file.nope') try: responseData = handleDataRequest(cmd) except RequestError as err: # Expecting a status not 200 error to be raised assert 'status' in str(err) else: self.fail('Expecting RequestError') # try from a non-allowed directory cmd = projUtils.getFileReqStruct('/nope/file.dcm') try: responseData = handleDataRequest(cmd) except RequestError as err: # Expecting a status not 200 error to be raised assert 'status' in str(err) else: self.fail('Expecting RequestError') # Test putTextFile testText = 'hello2' textFileName = os.path.join(tmpDir, 'test2.txt') cmd = projUtils.putTextFileReqStruct(textFileName, testText) response = Web.sendDataMsgFromThread(cmd) assert response['status'] == 200 # Test putBinaryData function testData = b'\xFE\xED\x01\x23' dataFileName = os.path.join(tmpDir, 'test2.bin') cmd = projUtils.putBinaryFileReqStruct(dataFileName) for putFilePart in projUtils.generateDataParts(testData, cmd, compress=True): response = Web.sendDataMsgFromThread(putFilePart) assert response['status'] == 200 # read back an compare to original cmd = projUtils.getFileReqStruct(dataFileName) response = Web.sendDataMsgFromThread(cmd) responseData = b64decode(response['data']) assert responseData == testData