This is an automated email from the ASF dual-hosted git repository. bcall pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push: new 21cdbda Adding custom method support and bug fixes 21cdbda is described below commit 21cdbdaef560df0e21e5c772d7069eee61d422c7 Author: Jesse Zhang <macisasandw...@gmail.com> AuthorDate: Fri Feb 2 11:05:37 2018 -0600 Adding custom method support and bug fixes --- tests/tools/sessionvalidation/sessionvalidation.py | 12 +++--- tests/tools/traffic-replay/NonSSL.py | 5 +++ tests/tools/traffic-replay/SSLReplay.py | 43 +++++++++++++--------- tests/tools/traffic-replay/extractHeader.py | 21 ++++++++++- 4 files changed, 56 insertions(+), 25 deletions(-) diff --git a/tests/tools/sessionvalidation/sessionvalidation.py b/tests/tools/sessionvalidation/sessionvalidation.py index 101e27b..5c926ea 100644 --- a/tests/tools/sessionvalidation/sessionvalidation.py +++ b/tests/tools/sessionvalidation/sessionvalidation.py @@ -23,7 +23,9 @@ import sessionvalidation.transaction as transaction import sessionvalidation.request as request import sessionvalidation.response as response -valid_HTTP_request_methods = ['GET', 'POST', 'HEAD'] +# valid_HTTP_request_methods = ['GET', 'POST', 'HEAD'] +# custom_HTTP_request_methods = ['PULL'] # transaction monitor plugin for ATS may have custom methods +allowed_HTTP_request_methods = ['GET', 'POST', 'HEAD', 'PULL'] G_CUSTOM_METHODS = False G_VERBOSE_LOG = True @@ -156,7 +158,6 @@ class SessionValidator(object): retval = True #valid_HTTP_request_methods = ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'TRACE', 'OPTIONS', 'CONNECT', 'PATCH'] - custom_HTTP_request_methods = ['PULL'] # transaction monitor plugin for ATS may have custom methods # we can later uncomment the previous line to support more HTTP methods valid_HTTP_versions = ['HTTP/1.0', 'HTTP/1.1', 'HTTP/2.0'] @@ -171,10 +172,9 @@ class SessionValidator(object): elif float(txn_req.getTimestamp()) <= 0: _verbose_print("invalid transaction request timestamp") retval = False - elif txn_req.getHeaders().split()[0] not in valid_HTTP_request_methods: - if G_CUSTOM_METHODS and txn_req.getHeaders().split()[0] not in custom_HTTP_request_methods: - _verbose_print("invalid HTTP method for transaction {0}".format(txn_req.getHeaders().split()[0])) - retval = False + elif txn_req.getHeaders().split()[0] not in allowed_HTTP_request_methods: + _verbose_print("invalid HTTP method for transaction {0}".format(txn_req.getHeaders().split()[0])) + retval = False elif not txn_req.getHeaders().endswith("\r\n\r\n"): _verbose_print("transaction request headers didn't end with \\r\\n\\r\\n") retval = False diff --git a/tests/tools/traffic-replay/NonSSL.py b/tests/tools/traffic-replay/NonSSL.py index 9685bf2..60525bc 100644 --- a/tests/tools/traffic-replay/NonSSL.py +++ b/tests/tools/traffic-replay/NonSSL.py @@ -112,6 +112,11 @@ def txn_replay(session_filename, txn, proxy, result_queue, request_session): txn_req_headers), headers=txn_req_headers_dict, data=body) responseHeaders = r1.headers responseContent = r1.content + else: # EXPERIMENTAL + r1 = request_session.request(method, extractHeader.extract_GET_path( + txn_req_headers), headers=txn_req_headers_dict, data=body) + responseHeaders = r1.headers + responseContent = r1.content #gzip_file = gzip.GzipFile(fileobj=responseContent) #shutil.copyfileobj(gzip_file, f) diff --git a/tests/tools/traffic-replay/SSLReplay.py b/tests/tools/traffic-replay/SSLReplay.py index cc0d94e..bf49a60 100644 --- a/tests/tools/traffic-replay/SSLReplay.py +++ b/tests/tools/traffic-replay/SSLReplay.py @@ -21,6 +21,7 @@ import http.client import socket import ssl import pprint +# import gevent import requests import os #import threading @@ -29,6 +30,7 @@ from multiprocessing import current_process import sessionvalidation.sessionvalidation as sv import lib.result as result import extractHeader +# from gevent import monkey, sleep from threading import Thread import mainProcess import json @@ -125,24 +127,32 @@ def txn_replay(session_filename, txn, proxy, result_queue, request_session): nBytes = int(txn_req_headers_dict['Content-Length']) body = createDummyBodywithLength(nBytes) #print("request session is",id(request_session)) + + # NOTE: request_session here is actually python's HTTPSConnection, which is different from that in NonSSL, which uses the requests library -_- if method == 'GET': - r1 = request_session.request('GET', extractHeader.extract_GET_path( - txn_req_headers), headers=txn_req_headers_dict, data=body) - responseHeaders = r1.headers - responseContent = r1.content # byte array + request_session.request('GET', extractHeader.extract_GET_path( + txn_req_headers), headers=txn_req_headers_dict, body=body) + r1 = request_session.getresponse() + responseContent = r1.read() # byte array elif method == 'POST': - r1 = request_session.request('POST', extractHeader.extract_GET_path( - txn_req_headers), headers=txn_req_headers_dict, data=body) - responseHeaders = r1.headers - responseContent = r1.content + request_session.request('POST', extractHeader.extract_GET_path( + txn_req_headers), headers=txn_req_headers_dict, body=body) + r1 = request_session.getresponse() + responseContent = r1.read() elif method == 'HEAD': - r1 = request_session.request('HEAD', extractHeader.extract_GET_path( - txn_req_headers), headers=txn_req_headers_dict, data=body) - responseHeaders = r1.headers - responseContent = r1.content - + request_session.request('HEAD', extractHeader.extract_GET_path( + txn_req_headers), headers=txn_req_headers_dict, body=body) + r1 = request_session.getresponse() + responseContent = r1.read() + else: # EXPERIMENTAL + request_session.request(method, extractHeader.extract_GET_path( + txn_req_headers), headers=txn_req_headers_dict, body=body) + r1 = request_session.getresponse() + responseContent = r1.read() + + responseHeaders = extractHeader.responseHeaderTuple_to_dict(r1.getheaders()) expected = extractHeader.responseHeader_to_dict(resp.getHeaders()) # print("------------EXPECTED-----------") # print(expected) @@ -152,7 +162,7 @@ def txn_replay(session_filename, txn, proxy, result_queue, request_session): if mainProcess.verbose: expected_output_split = resp.getHeaders().split('\r\n')[0].split(' ', 2) expected_output = (int(expected_output_split[1]), str(expected_output_split[2])) - r = result.Result(session_filename, expected_output[0], r1.status_code, responseContent) + r = result.Result(session_filename, expected_output[0], r1.status, responseContent) b_res, res = r.getResult(responseHeaders, expected, colorize=True) print(res) @@ -201,8 +211,7 @@ def session_replay(input, proxy, result_queue): txn_req_headers = req.getHeaders() txn_req_headers_dict = extractHeader.header_to_dict(txn_req_headers) sc = ssl.SSLContext(protocol=ssl.PROTOCOL_SSLv23) - if Config.ca_certs != None and Config.keyfile != None: - sc.load_cert_chain(Config.ca_certs, keyfile=Config.keyfile) + sc.load_cert_chain(Config.ca_certs, keyfile=Config.keyfile) conn = ProxyHTTPSConnection(Config.proxy_host, Config.proxy_ssl_port, cert_file=Config.ca_certs, key_file=Config.keyfile, context=sc, server_name=txn_req_headers_dict['Host']) for txn in session.getTransactionIter(): @@ -215,7 +224,7 @@ def session_replay(input, proxy, result_queue): #sslSocket.bStop = False bSTOP = True - #print("stopping now") + print("stopping now") input.put('STOP') break diff --git a/tests/tools/traffic-replay/extractHeader.py b/tests/tools/traffic-replay/extractHeader.py index c8f7961..a815183 100644 --- a/tests/tools/traffic-replay/extractHeader.py +++ b/tests/tools/traffic-replay/extractHeader.py @@ -17,7 +17,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import sessionvalidation +import sessionvalidation.sessionvalidation as sv def extract_txn_req_method(headers): @@ -34,6 +34,16 @@ def extract_host(headers): return line.split(' ')[1] return "notfound" +def responseHeaderTuple_to_dict(header): + header_dict = {} + + for key, val in header: + if key.lower() in header_dict: + header_dict[key.lower()] += ", {0}".format(val) + else: + header_dict[key.lower()] = val + + return header_dict def responseHeader_to_dict(header): headerFields = header.split('\r\n', 1)[1] @@ -59,7 +69,14 @@ def header_to_dict(header): header = [x for x in header if (x != u'')] headers = {} for line in header: - if 'GET' in line or 'POST' in line or 'HEAD' in line: # ignore initial request line + should_skip = False + + # we have to ignore the intital request line with the HTTP method in it + for method in sv.allowed_HTTP_request_methods: + if method in line: + should_skip = True + + if should_skip: # ignore initial request line continue split_here = line.find(":") -- To stop receiving notification emails like this one, please contact bc...@apache.org.