def renameFile(self, currentFilename, newFilename): """ Rename a file @param currentFilename: current filename @type currentFilename: string @param newFilename: new filename @type newFilename: string """ if not self.__logged: self.warning( "not logged" ) return tpl = self.encapsule( sftp_event=templates.rename(fromFilename=currentFilename, toFilename=newFilename), cmd=RENAME_FILE ) tpl.addRaw( currentFilename ) self.logSentEvent( shortEvt = "rename file", tplEvt = tpl ) if self.cfg['agent-support']: agent_cmd = {'cmd': RENAME_FILE, 'current-filename': currentFilename, 'new-filename': newFilename } self.ssh().notifyAgent(cfg=agent_cmd) else: try: self.ssh().channel().rename(currentFilename, newFilename) except Exception as e: tpl = self.encapsule( sftp_event=templates.response_error(rsp=str(e)), cmd=RENAME_FILE ) tpl.addRaw( str(e) ) self.logRecvEvent( shortEvt = "response error", tplEvt = tpl ) else: tpl = self.encapsule( sftp_event=templates.response(), cmd=RENAME_FILE ) self.logRecvEvent( shortEvt = "file renamed", tplEvt = tpl )
def hasReceivedRow(self, timeout=1.0, row=None, rowIndex=None, rowMax=None): """ Waits to receive "row" event until the end of the timeout @param timeout: time max to wait to receive event in second (default=1s) @type timeout: float @return: an event matching with the template or None otherwise @rtype: templatemessage """ if not (isinstance(timeout, int) or isinstance(timeout, float)) or isinstance(timeout, bool): raise TestAdapterLib.ValueException( TestAdapterLib.caller(), "timeout argument is not a float or integer (%s)" % type(timeout)) expected = templates.db(host=self.cfg['host'], port=self.cfg['port'], more=templates.response(row=row, rowIndex=None, rowMax=None)) evt = self.received(expected=self.encapsule(db_event=expected), timeout=timeout) return evt
def renameFolder(self, currentPath, newPath): """ Rename a folder @param currentPath: current path folder @type currentPath: string @param newPath: new path folder @type newPath: string """ if not self.__logged: self.warning( "not logged" ) return tpl = self.encapsule( sftp_event=templates.rename(fromPath=currentPath, toPath=newPath), cmd=RENAME_FOLDER ) tpl.addRaw( currentPath ) self.logSentEvent( shortEvt = "rename folder", tplEvt = tpl ) if self.cfg['agent-support']: agent_cmd = {'cmd': RENAME_FOLDER, 'current-path': currentPath, 'new-path': newPath } self.ssh().notifyAgent(cfg=agent_cmd) else: try: self.ssh().channel().rename(currentPath, newPath) except Exception as e: tpl = self.encapsule( sftp_event=templates.response_error(rsp=str(e)), cmd=RENAME_FOLDER ) tpl.addRaw( str(e) ) self.logRecvEvent( shortEvt = "response error", tplEvt = tpl ) else: tpl = self.encapsule( sftp_event=templates.response() , cmd=RENAME_FOLDER ) self.logRecvEvent( shortEvt = "folder renamed", tplEvt = tpl )
def deleteFolder(self, path): """ Delete a folder @param path: path folder @type path: string """ if not self.__logged: self.warning( "not logged" ) return tpl = self.encapsule( sftp_event=templates.delete(path=path), cmd=DELETE_FOLDER ) tpl.addRaw( path ) self.logSentEvent( shortEvt = "delete folder", tplEvt = tpl ) if self.cfg['agent-support']: agent_cmd = {'cmd': DELETE_FOLDER, 'path': path } self.ssh().notifyAgent(cfg=agent_cmd) else: try: self.ssh().channel().rmdir(path) except Exception as e: tpl = self.encapsule( sftp_event=templates.response_error(rsp=str(e)), cmd=DELETE_FOLDER ) tpl.addRaw( str(e) ) self.logRecvEvent( shortEvt = "response error", tplEvt = tpl ) else: tpl = self.encapsule( sftp_event=templates.response(), cmd=DELETE_FOLDER ) self.logRecvEvent( shortEvt = "folder deleted", tplEvt = tpl )
def hasReceivedRow(self, timeout=1.0, row=None, rowIndex=None, rowMax=None): """ Waits to receive "response" event until the end of the timeout @param timeout: time max to wait to receive event in second (default=1s) @type timeout: float @return: an event matching with the template or None otherwise @rtype: templatemessage """ TestAdapterLib.check_timeout(caller=TestAdapterLib.caller(), timeout=timeout) expected = templates.db(host=self.cfg['host'], port=self.cfg['port'], more=templates.response(row=row, rowIndex=None, rowMax=None)) evt = self.received(expected=self.encapsule(db_event=expected), timeout=timeout) return evt
def getTemplateResponse(self, code="200", phrase="OK", version="HTTP/1.1", headers={}, body=None, overwriteCl=False): """ """ __hdrs = {} # add additional headers __hdrs.update(self.getDefaultHeaders()) __hdrs.update(headers) if body is not None: lenBod = len(body) if lenBod > 0: self.addContentLength(__hdrs, lenBod, overwriteCl) # prepare response template and send it tpl = templates.response(version=version, code=code, phrase=phrase, headers=__hdrs, body=body) return tpl
def addFolder(self, path, mode=511): """ Add a folder @param path: path folder @type path: string @param mode: folder mode in octal (default=511 (0777)) @type mode: integer """ if not self.__logged: self.warning( "not logged" ) return tpl = self.encapsule( sftp_event=templates.add(path=path, mode="%s" % mode), cmd=ADD_FOLDER ) tpl.addRaw( path ) self.logSentEvent( shortEvt = "add", tplEvt = tpl ) if self.cfg['agent-support']: agent_cmd = {'cmd': ADD_FOLDER, 'path': path, 'mode': mode } self.ssh().notifyAgent(cfg=agent_cmd) else: try: self.ssh().channel().mkdir(path, mode) except Exception as e: tpl = self.encapsule( sftp_event=templates.response_error(rsp=str(e)), cmd=ADD_FOLDER ) tpl.addRaw( str(e) ) self.logRecvEvent( shortEvt = "response error", tplEvt = tpl ) else: tpl = self.encapsule( sftp_event=templates.response(), cmd=ADD_FOLDER ) self.logRecvEvent( shortEvt = "folder added", tplEvt = tpl )
def deleteFile(self, filename): """ Delete a file @param filename: the name of the file to delete @type filename: string """ if not self.__logged: self.warning( "not logged" ) return tpl = self.encapsule( sftp_event=templates.delete(filename=filename), cmd=DELETE_FILE ) tpl.addRaw( filename ) self.logSentEvent( shortEvt = "delete file", tplEvt = tpl ) if self.cfg['agent-support']: agent_cmd = {'cmd': DELETE_FILE, 'filename': filename } self.ssh().notifyAgent(cfg=agent_cmd) else: try: self.ssh().channel().remove(filename) except Exception as e: tpl = self.encapsule( sftp_event=templates.response_error(rsp=str(e)), cmd=DELETE_FILE ) tpl.addRaw( str(e) ) self.logRecvEvent( shortEvt = "response error", tplEvt = tpl ) else: tpl = self.encapsule( sftp_event=templates.response(), cmd=DELETE_FILE ) self.logRecvEvent( shortEvt = "file deleted", tplEvt = tpl )
def putFile(self, toFilename, fromFilename=None, rawContent=None): """ Put file in binary transfer mode. @param toFilename: path of the destination file @type toFilename: string @param fromFilename: the file to upload @type fromFilename: string/None @param rawContent: raw content to upload @type rawContent: string/None """ if not self.__logged: self.warning( "not logged" ) return if fromFilename is None and rawContent is None: raise Exception("please to choose a type of upload") if fromFilename is not None: tpl = self.encapsule( sftp_event=templates.put(fromPath=fromFilename, toPath=toFilename), cmd=PUT_FILE ) tpl.addRaw( fromFilename ) if rawContent is not None: tpl = self.encapsule( sftp_event=templates.put(content=rawContent, toPath=toFilename) , cmd=PUT_FILE ) tpl.addRaw( rawContent ) self.logSentEvent( shortEvt = "put file", tplEvt = tpl ) if self.cfg['agent-support']: agent_cmd = {'cmd': PUT_FILE, 'to-filename': toFilename, } if fromFilename is not None: agent_cmd[ 'from-filename'] = fromFilename else: agent_cmd[ 'from-filename'] = '' if rawContent is not None: agent_cmd[ 'raw-content'] = rawContent else: agent_cmd[ 'raw-content'] = '' self.ssh().notifyAgent(cfg=agent_cmd) else: try: if rawContent is not None: myfile = io.BytesIO( rawContent ) if fromFilename is not None: myfile = open(fromFilename, 'rb') rsp = self.ssh().channel().putfo(myfile, toFilename) except Exception as e: tpl = self.encapsule( sftp_event=templates.response_error(rsp=str(e)), cmd=PUT_FILE ) tpl.addRaw( str(e) ) self.logRecvEvent( shortEvt = "response error", tplEvt = tpl ) else: tpl = self.encapsule( sftp_event=templates.response(rsp=str(rsp)), cmd=PUT_FILE ) tpl.addRaw( str(rsp) ) self.logRecvEvent( shortEvt = "file uploaded", tplEvt = tpl )
def receivedNotifyFromAgent(self, data): """ Function to reimplement """ self.debug( data ) if 'cmd' in data: if data['cmd'] == AGENT_INITIALIZED: tpl = TestTemplatesLib.TemplateMessage() layer = TestTemplatesLib.TemplateLayer('AGENT') layer.addKey("ready", True) layer.addKey(name='name', data=self.cfg['agent']['name'] ) layer.addKey(name='type', data=self.cfg['agent']['type'] ) tpl.addLayer(layer= layer) self.logRecvEvent( shortEvt = "Agent Is Ready" , tplEvt = tpl ) elif data['cmd'] == 'Connect': self.connPtr = FakePtr() tpl = templates.db( host=data['host'], port=data['port'], user=data['user'], password=data['password'], more=templates.connected() ) self.logRecvEvent( shortEvt = "connected", tplEvt = self.encapsule(db_event=tpl) ) elif data['cmd'] == 'Disconnect': tpl = templates.db(host=data['host'], port=data['port'], user=data['user'], password=data['password'], more=templates.disconnected() ) self.logRecvEvent( shortEvt = "disconnected", tplEvt = self.encapsule(db_event=tpl) ) self.connPtr = None elif data['cmd'] == 'Query': tpl = templates.db( host=data['host'], port=data['port'], user=data['user'], password=data['password'], more=templates.response(row=data['row'], rowIndex=data['row-index'], rowMax=data['row-max']) ) if self.logEventReceived: self.logRecvEvent( shortEvt = "row", tplEvt = self.encapsule(db_event=tpl) ) self.handleIncomingRow(lower=self.encapsule(db_event=tpl) ) elif data['cmd'] == 'Executed': tpl = templates.db( host=data['host'], port=data['port'], user=data['user'], password=data['password'], more=templates.executed(nbChanged=data['nb-changed']) ) self.logRecvEvent( shortEvt = "executed", tplEvt = self.encapsule(db_event=tpl) ) elif data['cmd'] == 'Terminated': tpl = templates.db( host=data['host'], port=data['port'], user=data['user'], password=data['password'], more=templates.terminated(nbRow=['nb-rows']) ) self.logRecvEvent( shortEvt = "terminated", tplEvt = self.encapsule(db_event=tpl) ) else: self.error("unknown command received: %s" % data["cmd"]) else: self.error("no cmd detected %s" % data)
def sendHttp(self, clientId, code="200", phrase="OK", version="HTTP/1.1", headers={}, body=None, overwriteCl=False): """ Send a response. @param clientId: client id @type clientId: integer @param code: code (default=200) @type code: string @param phrase: phrase (default=OK) @type phrase: string @param version: http version (default=HTTP/1.1) @type version: string @param headers: additional headers to add {key:value, ...} @type headers: dict @param body: http content of the response @type body: string/none """ __hdrs = {} # add additional headers __hdrs.update(self.getDefaultHeaders()) __hdrs.update(headers) if body is not None: lenBod = len(body) if lenBod > 0: self.addContentLength(__hdrs, lenBod, overwriteCl) # prepare response template and send it tpl = templates.response(version=version, code=code, phrase=phrase, headers=__hdrs, body=body) self.sendResponse(clientId=clientId, tpl=tpl)
def hasReceivedResponse(self, timeout=1.0): """ Wait to receive "response" event @param timeout: time max to wait to receive event in second (default=1s) @type timeout: float @return: an event matching with the template or None otherwise @rtype: templatemessage """ TestAdapter.check_timeout(caller=TestAdapter.caller(), timeout=timeout) if not self.__logged: self.warning( "not logged" ) return tpl_expected = self.encapsule( sftp_event=templates.response() ) evt = self.received( expected = tpl_expected, timeout = timeout ) return evt
def hasReceivedResponse(self, timeout=1.0): """ Wait to receive "response" event @param timeout: time max to wait to receive event in second (default=1s) @type timeout: float @return: an event matching with the template or None otherwise @rtype: templatemessage """ if not ( isinstance(timeout, int) or isinstance(timeout, float) ) or isinstance(timeout,bool): raise TestAdapter.ValueException(TestAdapter.caller(), "timeout argument is not a float or integer (%s)" % type(timeout) ) if not self.__logged: self.warning( "not logged" ) return tpl_expected = self.encapsule( sftp_event=templates.response() ) evt = self.received( expected = tpl_expected, timeout = timeout ) return evt
def hasUploadedFolder(self, timeout=1.0, nbFiles=None): """ Waiting uploaded event for folder @param timeout: time max to wait to receive event in second (default=1s) @type timeout: float @param nbFiles: number of file succesfully uploaded @type nbFiles: none/int @return: an event matching with the template or None otherwise @rtype: templatemessage """ if not self.__logged: self.warning( "not logged" ) return tpl_expected = self.encapsule( sftp_event=templates.response(rsp=nbFiles), cmd=PUT_FOLDER ) evt = self.received( expected = tpl_expected, timeout = timeout ) return evt
def putFolder(self, fromPath, toPath, overwrite=False): """ Put folder content with recursive mode @param fromPath: local path to upload @type fromPath: string @param toPath: remote destination @type toPath: string @param overwrite: overwrite file/folder if already exists in remote side @type overwrite: boolean """ if not self.__logged: self.warning( "not logged" ) return tpl = self.encapsule( sftp_event=templates.put_folder(fromPath=fromPath, toPath=toPath, overwrite=overwrite), cmd=PUT_FOLDER ) tpl.addRaw( fromPath ) self.logSentEvent( shortEvt = "put folder", tplEvt = tpl ) if self.cfg['agent-support']: agent_cmd = {'cmd': PUT_FOLDER, 'from-path': fromPath, 'overwrite': overwrite} if toPath is not None: agent_cmd[ 'to-path'] = toPath else: agent_cmd[ 'to-path'] = '' self.ssh().notifyAgent(cfg=agent_cmd) else: try: rsp = 0 # nb files uploaded rsp = self.__putFolder(fromPath=fromPath, toPath=toPath, overwrite=overwrite) except Exception as e: tpl = self.encapsule( sftp_event=templates.response_error(rsp=str(e)), cmd=PUT_FOLDER ) tpl.addRaw( str(e) ) self.logRecvEvent( shortEvt = "response error", tplEvt = tpl ) else: tpl = self.encapsule( sftp_event=templates.response(rsp=str(rsp)), cmd=PUT_FOLDER ) tpl.addRaw( str(rsp) ) self.logRecvEvent( shortEvt = "folder uploaded", tplEvt = tpl )
def getFile(self, filename, toPrivate=False): """ Get file content @param filename: file name @type filename: string @param toPrivate: save the file in the private area on True (default=False) @type toPrivate: boolean """ if not self.__logged: self.warning( "not logged" ) return tpl = self.encapsule( sftp_event=templates.get(filename=filename), cmd=GET_FILE ) tpl.addRaw( filename ) self.logSentEvent( shortEvt = "get file", tplEvt = tpl ) if self.cfg['agent-support']: agent_cmd = {'cmd': GET_FILE, 'filename': filename} self.ssh().notifyAgent(cfg=agent_cmd) else: try: myfile = io.BytesIO() self.ssh().channel().getfo(filename, myfile) read_data = myfile.getvalue() except Exception as e: tpl = self.encapsule( sftp_event=templates.response_error(rsp=str(e)), cmd=GET_FILE ) tpl.addRaw( str(e) ) self.logRecvEvent( shortEvt = "response error", tplEvt = tpl ) else: if toPrivate: head, tail = os.path.split(filename) self.privateSaveFile(destname=tail, data=read_data) # log event tpl = self.encapsule( sftp_event=templates.response(content=read_data), cmd=GET_FILE ) tpl.addRaw( read_data ) self.logRecvEvent( shortEvt = "file downloaded", tplEvt = tpl )
def listingFolder(self, path, extended=False): """ Listing the folder. @param path: current path folder @type path: string @param extended: extended mode (default=False) @type extended: boolean """ if not self.__logged: self.warning( "not logged" ) return tpl = self.encapsule( sftp_event=templates.listing(path=path), cmd=LISTING_FOLDER ) if path is not None: tpl.addRaw( path ) self.logSentEvent( shortEvt = "listing", tplEvt = tpl ) if self.cfg['agent-support']: agent_cmd = {'cmd': LISTING_FOLDER, 'path': path, 'extended': extended} self.ssh().notifyAgent(cfg=agent_cmd) else: try: if extended: ret = [] ret_tmp = self.ssh().channel().listdir_attr(path=path) for attr in ret_tmp: ret.append( str(attr) ) else: ret = self.ssh().channel().listdir(path=path) except Exception as e: tpl = self.encapsule( sftp_event=templates.response_error(rsp=str(e)), cmd=LISTING_FOLDER ) tpl.addRaw( str(e) ) self.logRecvEvent( shortEvt = "response error", tplEvt = tpl ) else: tpl = self.encapsule( sftp_event=templates.response(rsp='\n'.join(ret) ), cmd=LISTING_FOLDER ) tpl.addRaw( '\n'.join(ret) ) self.logRecvEvent( shortEvt = "folder listing", tplEvt = tpl )
def query(self, query, queryName=None): """ Query the database @param query: sql query @type query: string @param queryName: query identifier @type queryName: string/none """ if self.connPtr is None: self.warning('connect first to the database') else: self.debug('query db') # log query event tpl = templates.db(host=self.cfg['host'], port=self.cfg['port'], user=self.cfg['user'], password=self.cfg['password'], more=templates.query(query=query)) self.logSentEvent(shortEvt="query", tplEvt=self.encapsule(db_event=tpl)) if self.cfg['agent-support']: remote_cfg = { 'cmd': 'Query', 'query': query, 'user': self.cfg['user'], 'password': self.cfg['password'], 'host': self.cfg['host'], 'port': self.cfg['port'] } self.sendNotifyToAgent(data=remote_cfg) else: try: cursor = self.connPtr.cursor() cursor.execute(query) i = 0 # log response event tpl = templates.db(host=self.cfg['host'], port=self.cfg['port'], user=self.cfg['user'], password=self.cfg['password'], more=templates.executed( status=cursor.statusmessage, nbChanged=str(cursor.rowcount))) self.logRecvEvent(shortEvt="executed", tplEvt=self.encapsule(db_event=tpl)) try: row = cursor.fetchone() while row: i += 1 self.debug(row) # as dict fields = map(lambda x: x[0], cursor.description) ret = dict(zip(fields, row)) # each value as str ret_str = {} if queryName is not None: ret_str['query-name'] = queryName for k, v in ret.items(): ret_str[k] = str(v) # log response event tpl = templates.db(host=self.cfg['host'], port=self.cfg['port'], user=self.cfg['user'], password=self.cfg['password'], more=templates.response( row=ret_str, rowIndex=i, rowMax=cursor.rowcount)) if self.logEventReceived: self.logRecvEvent( shortEvt="row", tplEvt=self.encapsule(db_event=tpl)) self.handleIncomingRow(lower=self.encapsule( db_event=tpl)) row = cursor.fetchone() except psycopg2.ProgrammingError as e: pass # no more to read # log response event tpl = templates.db(host=self.cfg['host'], port=self.cfg['port'], user=self.cfg['user'], password=self.cfg['password'], more=templates.terminated(nbRow=i)) self.logRecvEvent(shortEvt="terminated", tplEvt=self.encapsule(db_event=tpl)) # close the cursor and commit cursor.close() self.connPtr.commit() except psycopg2.Error as e: self.onError(err=(0, str(e))) except Exception as e: self.error(str(e)) else: pass
def decode(self, rsp, nomoredata=False, request=False): """ Try to decode some data to a valid payload. """ if len(rsp) == 0 and nomoredata: return (DECODING_NOTHING_TODO, None, None, None) # strict mode for the separator between headers and body ? if '\r\n\r\n' not in rsp: if not self.strictMode: if '\n\r\n' in rsp: rsp = rsp.replace('\n\r\n', '\r\n\r\n' ) bod = '' # split all headers hdrs = rsp.split(self.sep) # parse response code and phrase rspDecoded = hdrs[0].split(" ", 2) if len(rspDecoded) != 3: if request: self.debug('malformed http code request: %s' % rsp) else: self.debug('malformed http code response: %s' % rsp) return (DECODING_NEED_MORE_DATA, None, None, None) if request: httpMethod = rspDecoded[0] httpUri = rspDecoded[1] httpVersion = rspDecoded[2] summary = "%s %s %s" % (httpMethod, httpUri, httpVersion) else: httpVersion = rspDecoded[0] httpCode = rspDecoded[1] httpPhrase = (rspDecoded[2].decode("ISO8859-1")).encode("utf-8") summary = "%s %s %s" % (httpVersion, httpCode, httpPhrase) # parse hdrs to list http_body_detected = False content_type_hdr = None content_length_hdr = None transfer_encoding_hdr = None hdrs_dict = {} i = 1 for hdr in hdrs[1:]: i += 1 h = hdr.strip() # remove spaces before and after if not hdr: http_body_detected = True break # reached body and its empty line fv = hdr.split(':', 1) if len(fv) != 2: raise Exception('invalid http headers: %s' % fv ) # rfc 2616: Field names are case-insensitive f = fv[0].lower().strip() # extract field and remove spaces v = fv[1].strip() # extract value and remove spaces if f == "content-type": content_type_hdr = v if f == "content-length": content_length_hdr = v if f == "transfer-encoding": transfer_encoding_hdr = v if hdrs_dict.has_key(f): if isinstance( hdrs_dict[f], TestTemplatesLib.TemplateLayer): tpl.addKey(name="%s" % tpl.getLenItems(), data=v ) else: tpl = TestTemplatesLib.TemplateLayer('') tpl.addKey(name="%s" % tpl.getLenItems(), data=hdrs_dict[f]) tpl.addKey(name="%s" % tpl.getLenItems(), data=v ) hdrs_dict[f] = tpl else: hdrs_dict[f] = v if not http_body_detected: self.debug("body not detected") return (DECODING_NEED_MORE_DATA, None, None, None) # transfer-encoding header is present ? if transfer_encoding_hdr is not None: self.debug( "transfer encoding header detected (%s)" % str(transfer_encoding_hdr) ) if transfer_encoding_hdr == 'chunked': try: if not hdrs[i].strip(): self.debug("wait for the chunk size in a next payload" ) return (DECODING_NEED_MORE_DATA, None, None, None) # Let's wait for the chunk size in a next payload chunkSize = int(hdrs[i].strip(), 16) self.debug("chunk size detected: %s" % chunkSize ) remainingPayload = '\r\n'.join(hdrs[i+1:]) # consuming chunk with thr exactly chunkSize characters then followed by an empty line or possibly another chunksize while chunkSize != 0: chunk = remainingPayload[:chunkSize] if len(chunk) < chunkSize: self.debug("current chunk (%s) lower than chunk size expected (%s), need more data" % ( len(chunk), chunkSize) ) return (DECODING_NEED_MORE_DATA, None, None, None) bod += chunk remainingPayload = remainingPayload[chunkSize:] lines = remainingPayload.split('\r\n') # ['', '0', '', ''] if lines[0]: # should be an empty line... raise Exception("No chunk boundary at the end of the chunk. Invalid data.") if not lines[1]: self.debug("No next chunk size yet" ) return (DECODING_NEED_MORE_DATA, None, None, None) # No next chunk size yet else: chunkSize = int(lines[1].strip(), 16) self.debug("next chunk size detected: %s" % chunkSize ) # fix issue, final chunk size received but crlf is missing if len(lines) <= 2: self.debug("next chunk size received but crlf is missing, waiting more data" ) return (DECODING_NEED_MORE_DATA, None, None, None) # final chunk size received but crlf is missing # end of fix remainingPayload = '\r\n'.join(lines[2:]) except IndexError: return (DECODING_NEED_MORE_DATA, None, None, None) else: raise Exception("not yet supported") # content-length header is present ? else: bod ="\r\n".join(hdrs[i:]) if content_length_hdr is not None: self.debug( "content-length header detected (%s)" % str(content_length_hdr) ) cl = int(content_length_hdr) bl = len(bod) truncate_body = False if self.truncateBody: bod = '%s ...stream truncated....' % bod[:100] truncate_body = True if not ( truncate_body ): if bl < cl: return (DECODING_NEED_MORE_DATA, None, None, None) elif bl > cl: # Truncate the body bod = bod[:cl] else: self.debug( "no transfer encoding header or content-length header" ) if request: if http_body_detected and len(bod) == 0: nomoredata = True # if the status code is 100 or 200 OK from a proxy, discard the first response and read the next one instead. if len(hdrs) == 3 and len(bod) == 0: if len(hdrs[0]) and not len(hdrs[1]) and not len(hdrs[2]): self.debug('message with one line only detected, discard and read the next one') bod = '' nomoredata = True if self.websocketMode: self.debug( "websocket mode activated on codec" ) if http_body_detected and len(bod) == 0: nomoredata = True if not request: if http_body_detected and len(bod) == 0 and httpCode == "204": self.debug('204 no content detected') bod = '' nomoredata = True # No chunk, no content-length, no body separator detected # wait until the end of the connection if not nomoredata: return (DECODING_NEED_MORE_DATA, None, None, None) # content-type header is present ? if content_type_hdr is not None: self.debug( "content type header detected (%s)" % str(content_type_hdr) ) content_type = content_type_hdr.split(";", 1)[0] # split the type of data # update summary with content type summary = "%s (%s)" % (summary, content_type) # decode the body with the charset defined in the header content-type and re-encode to utf8 if content_type == "text/html" or content_type == "text/plain" : if len(bod)> 0: # fix error in adapter 2.1.0, decode body only if the length > 0 content_type_charset = content_type_hdr.split("charset=") if len(content_type_charset)==1: self.debug("Codec: charset is missing, decode body with iso-8859-1") content_type_charset = "iso-8859-1" else: content_type_charset = content_type_hdr.split("charset=")[1].split(";", 1)[0] try: bod_decoded = bod.decode(content_type_charset) bod = bod_decoded.encode("utf-8") except Exception as e: self.warning('Codec: unable to decode body with charset: %s' % content_type_charset) # create template if request: ret = templates.request(method=httpMethod, uri=httpUri, version=httpVersion, headers=hdrs_dict, body=bod) else: if not len(hdrs_dict): hdrs_dict = None if not len(bod): bod=None ret = templates.response(version=httpVersion, code=httpCode, phrase=httpPhrase, headers=hdrs_dict, body=bod) if not request: if httpCode == "100": left_data = "\r\n".join(hdrs[i:]) ret.addRaw(hdrs[0]) return (DECODING_OK_CONTINUE, ret, summary, left_data ) return (DECODING_OK, ret, summary, None)
def onSftpEvent(self, event): """ """ if 'sftp-event' in event: if event['sftp-event'] == 'response-error' : tpl = self.encapsule( sftp_event=templates.response_error(rsp=event['err']), cmd=event['cmd'] ) tpl.addRaw( event['err'] ) self.logRecvEvent( shortEvt = "response error", tplEvt = tpl ) if event['sftp-event'] == 'folder-listing': tpl = self.encapsule( sftp_event=templates.response(rsp=event['rsp'] ), cmd=LISTING_FOLDER ) tpl.addRaw( event['rsp'] ) self.logRecvEvent( shortEvt = "folder listing", tplEvt = tpl ) if event['sftp-event'] == 'folder-added': tpl = self.encapsule( sftp_event=templates.response(), cmd=ADD_FOLDER ) self.logRecvEvent( shortEvt = "folder added", tplEvt = tpl ) if event['sftp-event'] == 'file-renamed': tpl = self.encapsule( sftp_event=templates.response(), cmd=RENAME_FILE ) self.logRecvEvent( shortEvt = "file renamed", tplEvt = tpl ) if event['sftp-event'] == 'file-deleted': tpl = self.encapsule( sftp_event=templates.response(), cmd=DELETE_FILE ) self.logRecvEvent( shortEvt = "file deleted", tplEvt = tpl ) if event['sftp-event'] == 'folder-renamed': tpl = self.encapsule( sftp_event=templates.response() , cmd=RENAME_FOLDER ) self.logRecvEvent( shortEvt = "folder renamed", tplEvt = tpl ) if event['sftp-event'] == 'folder-deleted': tpl = self.encapsule( sftp_event=templates.response(), cmd=DELETE_FOLDER ) self.logRecvEvent( shortEvt = "folder deleted", tplEvt = tpl ) if event['sftp-event'] == 'file-downloaded': tpl = self.encapsule( sftp_event=templates.response(content=event['content']), cmd=GET_FILE ) tpl.addRaw( event['content'] ) self.logRecvEvent( shortEvt = "file downloaded", tplEvt = tpl ) if event['sftp-event'] == 'file-uploaded': tpl = self.encapsule( sftp_event=templates.response(rsp=event['rsp']), cmd=PUT_FILE ) tpl.addRaw( event['rsp'] ) self.logRecvEvent( shortEvt = "file uploaded", tplEvt = tpl ) if event['sftp-event'] == 'folder-downloaded': tpl = self.encapsule( sftp_event=templates.response(content=event['content']), cmd=GET_FOLDER ) tpl.addRaw( event['content'] ) self.logRecvEvent( shortEvt = "folder downloaded", tplEvt = tpl ) if event['sftp-event'] == 'folder-uploaded': tpl = self.encapsule( sftp_event=templates.response(rsp=event['rsp']), cmd=PUT_FOLDER ) tpl.addRaw( event['rsp'] ) self.logRecvEvent( shortEvt = "folder uploaded", tplEvt = tpl ) if event['sftp-event'] == 'wait-file': tpl = self.encapsule( sftp_event=templates.wait_file(path=event['path'], filename=event['filename'], result=event['result']), cmd=WAIT_FILE ) self.logRecvEvent( shortEvt = "wait file", tplEvt = tpl ) if event['sftp-event'] == 'wait-folder': tpl = self.encapsule( sftp_event=templates.wait_folder(path=event['path'], folder=event['folder'], result=event['result']), cmd=WAIT_FOLDER ) self.logRecvEvent( shortEvt = "wait folder", tplEvt = tpl )
def hasReceivedRestResponse(self, httpCode="200", httpPhrase="OK", httpVersion='HTTP/1.1', timeout=1.0, httpHeaders={}, httpBody=None): """ Wait to receive "rest response" until the end of the timeout. @param httpCode: http code (default=200) @type httpCode: string @param httpPhrase: http phrase (default=OK) @type httpPhrase: string @param httpVersion: http version (default=HTTP/1.1) @type httpVersion: string @param httpHeaders: expected http headers @type httpHeaders: dict @param httpBody: expected body (default=None) @type httpBody: string/none @param timeout: time to wait in seconds (default=1s) @type timeout: float @return: http response @rtype: template """ if not (isinstance(timeout, int) or isinstance(timeout, float)): raise TestAdapter.ValueException( TestAdapter.caller(), "timeout argument is not a float or integer (%s)" % type(timeout)) tpl = TestTemplates.TemplateMessage() if self.cfg['agent-support']: layer_agent = TestTemplates.TemplateLayer('AGENT') layer_agent.addKey(name='name', data=self.cfg['agent']['name']) layer_agent.addKey(name='type', data=self.cfg['agent']['type']) tpl.addLayer(layer_agent) tpl.addLayer(AdapterIP.ip(more=AdapterIP.received())) tpl.addLayer(AdapterTCP.tcp(more=AdapterTCP.received())) if self.ADP_HTTP.tcp().cfg['ssl-support']: tpl.addLayer(AdapterSSL.ssl(more=AdapterSSL.received())) headers = { 'content-type': TestOperators.Contains(needle='application/json', AND=True, OR=False) } headers.update(httpHeaders) tpl.addLayer( AdapterHTTP.response(version=httpVersion, code=httpCode, phrase=httpPhrase, headers=headers, body=httpBody)) tpl.addLayer(templates.response()) return self.hasReceivedResponse(expected=tpl, timeout=timeout)