2013-07-03 2 views
0

저는 스트리밍 방식으로 데이터를 검색하고 처리하기위한 매우 간단한 proof-of-concept을 개발하려고합니다. 내가 요청한 서버는 청크로 데이터를 보낼 것이지만, 청크를 반복 할 때 httplib을 사용하는 데 문제가 있습니다.httplib.HTTPResponse의 데이터를 반복 할 수 있습니까?

def getData(src): 
    d = src.read(1024) 
    while d and len(d) > 0: 
     yield d 
     d = src.read(1024) 

if __name__ == "__main__": 
    con = httplib.HTTPSConnection('example.com', port='8443', cert_file='...', key_file='...') 
    con.putrequest('GET', '/path/to/resource') 
    response = con.getresponse() 

    for s in getData(response): 
     print s 
     raw_input() # Just to give me a moment to examine each packet 

매우 간단 수입 HTTPLIB을 :

는 여기에 내가 노력하고있어입니다. 서버에 대한 HTTPS 연결을 열고 리소스를 요청한 다음 한 번에 1024 바이트 씩 결과를 가져옵니다. 확실히 HTTPS 연결을 성공적으로 만들고있어 문제가되지 않습니다.

그러나 내가 찾는 것은 src.read(1024)에 대한 호출이 매번 같은 것을 반환한다는 것입니다. 응답의 처음 1024 바이트 만 반환하며 파일 내에서 커서를 추적하지 않습니다.

한 번에 1024 바이트를 어떻게 받겠습니까? read()에 관한 문서는 꽤 희소합니다. urllib 또는 urllib2 사용에 대해 생각해 보았지만 둘 다 HTTPS 연결을 만들 수없는 것 같습니다.

HTTPS가 필요합니다. Requests과 같은 패키지가 내 손을 잡기가 다소 어려운 제한된 회사 환경에서 작업하고 있습니다. 가능하다면 Python의 표준 lib 디렉토리에서 해결책을 찾고 싶습니다.

는 // 큰 오래 된 지방 편집

내가 단순히 d 변수를 업데이트 깜빡했던 내 원래의 코드에서 밝혀졌습니다. yield 루프 외부에서 읽음으로 초기화하고 루프에서 변경하지 않았습니다. 일단 거기에 다시 추가하면 완벽하게 작동합니다.

그래서 간단히 말해서, 나는 아주 바보예요.

+0

, 당신은 HTTPSHandler 보았다 :

여기에 나를 위해 작업 버전 대신 요청()를 사용하여,입니까? 'opener = urllib2.OpenerDirector() opener.add_handler (urllib2.HTTPSHandler())' – Hut8

+0

아무것도 돌려 보내지 않으려면 putrequest() 뒤에 con.send()가 필요합니다. 샘플 반복기는 HTTPConnection 객체에서 작동합니다. – tdelaney

+0

@tdelaney'con.send()'없이 데이터를 다시 얻었습니다. 올바른 데이터입니다. 그러나 처음 1024 비트 만 가져옵니다. 나는 con.putrequest() 다음에'con.send ("")'를 추가하려고 시도했지만 나는 여전히 같은 결과를 얻고있다. –

답변

-1

seek 명령을 사용하여 읽음과 함께 커서를 이동할 수 있습니다.

이것은 문제의 시도입니다. 나는 그것을 공정에서 덜 파이썬으로 만들면 사과드립니다.

if __name__ == "__main__": 
    con = httplib.HTTPSConnection('example.com', port='8443', cert_file='...', key_file='...') 
    con.putrequest('GET', '/path/to/resource') 
    response = con.getresponse() 
    c=0 
    while True: 
     response.seek(c*1024,0) 
     data =d.read(1024) 
     c+=1 
     if len(data)==0: 
      break 
     print data 
     raw_input() 

적어도 도움이 되었길 바랍니다.

+0

이것은 작동하지 않습니다. [httplib 문서] (http://docs.python.org/2/library/httplib.html#httplib.HTTPResponse)에서 읽고있는 내용에서,'HTTPResponse'는'.seek()'를 가지고 있지 않습니다. 방법. 또한 실험으로 확인했습니다. 'response'는'AttributeError'를 던집니다. –

0

con.putrequest()가 실제로 작동합니까? ,

http://docs.python.org/2/library/httplib.html

를 다른 방법으로() 메소드 위에서 설명한 요청을 사용하여 : 그 방법으로 요청을하는 것은 당신이 공식 HTTPLIB 문서에서 볼 수 있듯이 당신은 또한 다른 방법의 무리를 호출 할 필요 아래의 네 가지 기능을 사용하여 단계별로 요청을 보낼 수도 있습니다.

putrequest() 
putheader() 
endheaders() 
send() 

기본 HTTPConnection.request() 함수를 사용하지 않는 이유는 어떤 이유가 있나요?urllib2가와

import httlplib 

def getData(src, chunk_size=1024): 
    d = src.read(chunk_size) 
    while d: 
     yield d 
     d = src.read(chunk_size) 

if __name__ == "__main__": 
    con = httplib.HTTPSConnection('google.com') 
    con.request('GET', '/') 
    response = con.getresponse() 

    for s in getData(response, 8): 
     print s 
     raw_input() # Just to give me a moment to examine each packet 
+0

그래, 그 기능을 사용 했어. 나는 예제에서 그것들을 추가하는 것을 고심하지는 않았지만, 헤더 등의 혼란을 가하고 있었다. –

관련 문제