2015-01-27 2 views
3

나는이 질문에 대답하기 위해 proxpy 용 플러그인을 작성하고있다. 이것은 기본적으로 HTTP/HTTPS 프록시입니다. HTTP 요청과 응답 각각에 대한 인수가 두 개의 함수를 구현하여 확장합니다. 다음과 같은 내용 :어떤 응답이 proxpy를 사용하여 어떤 요청에 속하는지 파악하기

method1(request): 
    #your implementation 

method2(response): 
    #your implementation 

요청 및 응답을 다음 형식으로 파일에 간단하게 작성하고 싶습니다. 이 같은

Request 1 
Response of request 1 
Request 2 
Response of request 2. 
#etc 

그러나, 요청과 응답은 반드시 순서대로 그들이 기록 할 수 있도록 뭔가 :

Request 1 
Request 2 
Response of request 2 
Request 3 
Response of request 3 
Response of request 2 

그래서 본질적으로 내가 뭘 원하는 어떤 각을 요청할 찾아이다 응답은에 해당합니다.

답변

3

다음 코드와 같이 스레드 ID별로 사전에 저장된 각 요청을 저장 한 다음 동일한 스레드 ID를 사용하여 응답을 일치시킬 수 있습니다. 이는 proxpy이 각 요청 및 응답 쌍 (별도의 작업자 스레드)을 사용한다는 사실에의 존합니다 (proxpy 구현에 대한 지식이 필요합니다!).

플러그인 코드 외부에서 발생하는 예외는 sent 사전에 "고아"요청을 발생시킵니다 (실제로 관찰 된 것처럼 스레드 ID가 재사용되는 경우에는 별 문제가되지 않을 수도 있음).

또한이 플러그인의 출력은 페어링 된 요청과 응답을 기록하는 것이지만 순서는 반드시 전송 된 순서가 아닌 응답 수신입니다.

import threading 

lock = threading.Lock() 
sent = {} 
req_seq = 0 

def proxy_mangle_request(req): 
    global req_seq 
    lock.acquire() 
    req_seq += 1 
    thread_id = threading.current_thread().ident 
# print "thread id = {}".format(thread_id) 
    req.seq = req_seq 
    sent[thread_id] = req 
    lock.release() 

    return req 

def proxy_mangle_response(res): 
    thread_id = threading.current_thread().ident 
# print "Got response for thread_id {}".format(thread_id) 
    print "Request: {}".format(sent[thread_id].seq) 
    lock.acquire() 
    del sent[thread_id] 
    lock.release() 

    print "Response: {}".format(res) 
    return res 
+0

감사합니다. @mhawke, 아주 멋진 해결책입니다. 귀하의 회신을 받기 전에 proxpy 구현에서 proxy_mangle_response 메소드의 인수로 req를 추가하기 위해 몇 가지 사항을 변경했습니다. 그래서 정의는'def proxy_mangle_response (res, req)'처럼 보입니다. 왜냐하면 rege를 매개 변수로 사용하기 위해서 위임 메소드의 정의를 core.py에서 변경해야했습니다. 이것이 proxpy 자체의 구현을 변경해야한다는 사실 외에도이 접근법에 명백한 결함이 있습니까? 예, proxpy에 익숙해지면 여기에서 분명히 도움이됩니다. :) – Rabee

+0

'proxpy'를 전혀 변경하지 말아야합니다. 관리자가 모듈을 업데이트하고 업데이트하려고하면 어떻게됩니까? 패치 된 버전을 유지해야 할 필요가 있습니다. 그러면 빨리 지루해집니다. 다른 한편, 유용 할 수도 있으므로'proxpy '저자에게 당신의 변경 (응답 핸들러에 요청을 넘겨주기)을 제안 할 수 있습니다. – mhawke

+0

다시 @mhawke. 나는 당신이 제안한 변화를 만들 것이라고 생각합니다. – Rabee