def encode_multipart(self, fields, files): """Encodes a multipart form request (not using '=' in boundary) Parameters ---------- fields : dictionary, mandatory dictionary with keywords and values files : array with key, filename and value, mandatory array with key, filename, value Returns ------- The suitable content-type and the body for the request Notes ----------------- In boundary use * instead of =, async processor complains if it has = """ timeMillis = int(round(time.time() * 1000)) boundary = '***%s***' % str(timeMillis) CRLF = '\r\n' multiparItems = [] for key in fields: multiparItems.append('--' + boundary + CRLF) multiparItems.append( 'Content-Disposition: form-data; name="%s"%s' % (key, CRLF)) multiparItems.append(CRLF) multiparItems.append(fields[key]+CRLF) for (key, filename, value) in files: multiparItems.append('--' + boundary + CRLF) multiparItems.append( 'Content-Disposition: form-data; name="%s"; filename="%s"%s' % (key, filename, CRLF)) multiparItems.append( 'Content-Type: %s%s' % (mimetypes.guess_extension(filename), CRLF)) multiparItems.append(CRLF) multiparItems.append(value) multiparItems.append(CRLF) multiparItems.append('--' + boundary + '--' + CRLF) multiparItems.append(CRLF) body = utils.util_create_string_from_buffer(multiparItems) contentType = 'multipart/form-data; boundary=%s' % boundary return contentType, body
def encode_multipart(self, fields, files): """Encodes a multipart form request (not using '=' in boundary) Parameters ---------- fields : dictionary, mandatory dictionary with keywords and values files : array with key, filename and value, mandatory array with key, filename, value Returns ------- The suitable content-type and the body for the request Notes ----------------- In boundary use * instead of =, async processor complains if it has = """ timeMillis = int(round(time.time() * 1000)) boundary = '***%s***' % str(timeMillis) CRLF = '\r\n' multiparItems = [] for key in fields: multiparItems.append('--' + boundary + CRLF) multiparItems.append( 'Content-Disposition: form-data; name="%s"%s' % (key, CRLF)) multiparItems.append(CRLF) multiparItems.append(fields[key] + CRLF) for (key, filename, value) in files: multiparItems.append('--' + boundary + CRLF) multiparItems.append( 'Content-Disposition: form-data; name="%s"; filename="%s"%s' % (key, filename, CRLF)) multiparItems.append('Content-Type: %s%s' % (mimetypes.guess_extension(filename), CRLF)) multiparItems.append(CRLF) multiparItems.append(value) multiparItems.append(CRLF) multiparItems.append('--' + boundary + '--' + CRLF) multiparItems.append(CRLF) body = utils.util_create_string_from_buffer(multiparItems) contentType = 'multipart/form-data; boundary=%s' % boundary return contentType, body
def encode_multipart(self, fields, files): """Encodes a multipart form request Parameters ---------- fields : dictionary, mandatory dictionary with keywords and values files : array with key, filename and value, mandatory array with key, filename, value Returns ------- The suitable content-type and the body for the request """ timeMillis = int(round(time.time() * 1000)) boundary = f'==={timeMillis}===' CRLF = '\r\n' multiparItems = [] for key in fields: multiparItems.append(f'--{boundary}{CRLF}') multiparItems.append( f'Content-Disposition: form-data; name="{key}"{CRLF}') multiparItems.append(CRLF) multiparItems.append(f'{fields[key]}{CRLF}') for (key, filename, value) in files: multiparItems.append(f'--{boundary}{CRLF}') multiparItems.append( f'Content-Disposition: form-data; name="{key}"; filename="{filename}"{CRLF}' ) multiparItems.append( f'Content-Type: {mimetypes.guess_extension(filename)}{CRLF}') multiparItems.append(CRLF) multiparItems.append(value) multiparItems.append(CRLF) multiparItems.append(f'--{boundary}--{CRLF}') multiparItems.append(CRLF) body = utils.util_create_string_from_buffer(multiparItems) contentType = f'multipart/form-data; boundary={boundary}' return contentType, body.encode('utf-8')
def __create_string_from_buffer(self): return Utils.util_create_string_from_buffer(self.__charBuffer)
def __parseUrl(self, url, verbose=False): isHttps = False if url.startswith("https://"): isHttps = True protocol = "https" else: protocol = "http" if verbose: print("is https: " + str(isHttps)) urlInfoPos = url.find("://") if urlInfoPos < 0: raise ValueError("Invalid URL format") urlInfo = url[(urlInfoPos+3):] items = urlInfo.split("/") if verbose: print("'" + urlInfo + "'") for i in items: print("'" + i + "'") itemsSize = len(items) hostPort = items[0] portPos = hostPort.find(":") if portPos > 0: # port found host = hostPort[0:portPos] port = int(hostPort[portPos+1:]) else: # no port found host = hostPort # no port specified: use defaults if isHttps: port = 443 else: port = 80 if itemsSize == 1: serverContext = "" tapContext = "" elif itemsSize == 2: serverContext = "/"+items[1] tapContext = "" elif itemsSize == 3: serverContext = "/"+items[1] tapContext = "/"+items[2] else: data = [] for i in range(1, itemsSize-1): data.append("/"+items[i]) serverContext = utils.util_create_string_from_buffer(data) tapContext = "/"+items[itemsSize-1] if verbose: print("protocol: '%s'" % protocol) print("host: '%s'" % host) print("port: '%d'" % port) print("server context: '%s'" % serverContext) print("tap context: '%s'" % tapContext) return protocol, host, port, serverContext, tapContext