codekingpro/portable-devtools
114k
1def assemble_request(request):2 if request.data.content is None:3 raise ValueError("Cannot assemble flow with missing content")4 head = assemble_request_head(request)5 body = b"".join(6 assemble_body(7 request.data.headers, [request.data.content], request.data.trailers8 )9 )10 return head + body11 12 13def assemble_request_head(request):14 first_line = _assemble_request_line(request.data)15 headers = _assemble_request_headers(request.data)16 return b"%s\r\n%s\r\n" % (first_line, headers)17 18 19def assemble_response(response):20 if response.data.content is None:21 raise ValueError("Cannot assemble flow with missing content")22 head = assemble_response_head(response)23 body = b"".join(24 assemble_body(25 response.data.headers, [response.data.content], response.data.trailers26 )27 )28 return head + body29 30 31def assemble_response_head(response):32 first_line = _assemble_response_line(response.data)33 headers = _assemble_response_headers(response.data)34 return b"%s\r\n%s\r\n" % (first_line, headers)35 36 37def assemble_body(headers, body_chunks, trailers):38 if "chunked" in headers.get("transfer-encoding", "").lower():39 for chunk in body_chunks:40 if chunk:41 yield b"%x\r\n%s\r\n" % (len(chunk), chunk)42 if trailers:43 yield b"0\r\n%s\r\n" % trailers44 else:45 yield b"0\r\n\r\n"46 else:47 if trailers:48 raise ValueError(49 "Sending HTTP/1.1 trailer headers requires transfer-encoding: chunked"50 )51 for chunk in body_chunks:52 yield chunk53 54 55def _assemble_request_line(request_data):56 """57 Args:58 request_data (mitmproxy.net.http.request.RequestData)59 """60 if request_data.method.upper() == b"CONNECT":61 return b"%s %s %s" % (62 request_data.method,63 request_data.authority,64 request_data.http_version,65 )66 elif request_data.authority:67 return b"%s %s://%s%s %s" % (68 request_data.method,69 request_data.scheme,70 request_data.authority,71 request_data.path,72 request_data.http_version,73 )74 else:75 return b"%s %s %s" % (76 request_data.method,77 request_data.path,78 request_data.http_version,79 )80 81 82def _assemble_request_headers(request_data):83 """84 Args:85 request_data (mitmproxy.net.http.request.RequestData)86 """87 return bytes(request_data.headers)88 89 90def _assemble_response_line(response_data):91 return b"%s %d %s" % (92 response_data.http_version,93 response_data.status_code,94 response_data.reason,95 )96 97 98def _assemble_response_headers(response):99 return bytes(response.headers)100 