2014-12-24 3 views
2

그래서 맨손 소켓을 사용하여 웹 페이지를 다운로드하는 프로그램이 있습니다. 나는 맨손으로 소켓을 사용해야하고 요청이나 urllib 등을 사용할 수 없다. 나는 오징어 프록시 뒤에있는 네트워크에있다. 그래서 나의 파이썬 프로그램은 간단히 connect을 프록시 서버로 만들고 GET 요청을한다. HAR 파일에서 가져옵니다. 커틀을 사용하여 요청을 테스트했습니다.오징어 프록시는 GET 요청에 501을 제공하지만 파이썬에 의해 작성된 것입니다.

curl https://apis.google.com/_/scs/abc-static/_/js/k=gapi.gapi.en.wgbKiK972Ko.O/m=gapi_iframes,googleapis_client,plusone/rt=j/sv=1/d=1/ed=1/rs=AItRSTOlX0YCaQmKijyj5lpKQ5AVm7UE6A/cb=gapi.loaded_0 -o out_file 

출력을 적절한 전체 파일로 가져옵니다. 나는 응답 헤더를 검사하고 그들은

HTTP/1.1 200 OK 
Vary: Accept-Encoding 
Content-Type: text/javascript; charset=UTF-8 
Last-Modified: Thu, 11 Dec 2014 20:44:59 GMT 
Date: Fri, 12 Dec 2014 03:38:46 GMT 
Expires: Sat, 12 Dec 2015 03:38:46 GMT 
X-Content-Type-Options: nosniff 
Server: sffe 
X-XSS-Protection: 1; mode=block 
Cache-Control: public, max-age=31536000 
Age: 1065247 
Alternate-Protocol: 443:quic,p=0.02 
Transfer-Encoding: chunked 

가 지금은 파이썬에서 소켓 프로그래밍을 사용하여 같은 일을 시도하다 :

HOST = 'proxy.address.of.squid.proxy' 
    PORT = 3128 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST, PORT)) 
    url = 'https://apis.google.com/_/scs/abc-static/_/js/k=gapi.gapi.en.wgbKiK972Ko.O/m=gapi_iframes,googleapis_client,plusone/rt=j/sv=1/d=1/ed=1/rs=AItRSTOlX0YCaQmKijyj5lpKQ5AVm7UE6A/cb=gapi.loaded_0' 
    httpVrsn = 'HTTP/1.1' 
    domain = 'apis.google.com' 
    objReq = 'GET '+url+' '+httpVrsn+'\r\nHost: '+domain+'\r\n\r\n'; 
    s.send(objReq); 
    data = ''; 
    try: 
     data = s.recv(1024); 
     print data 
    # other non-relevant stuff 

내가 얻을 출력은

HTTP/1.0 501 Not Implemented 
Server: squid/3.1.19 
Mime-Version: 1.0 
Date: Wed, 24 Dec 2014 10:25:42 GMT 
Content-Type: text/html 
Content-Length: 3576 
X-Squid-Error: ERR_UNSUP_REQ 0 
Vary: Accept-Language 
Content-Language: en 
X-Cache: MISS from localhost 
X-Cache-Lookup: NONE from localhost:3128 
Via: 1.0 localhost (squid/3.1.19) 
Connection: close 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html><head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>ERROR: The requested URL could not be retrieved</title> 
<style type="text/css"><!-- 
/* 
Stylesheet for Squid Error pages 
Adapted from design by Free CSS Templates 
http://www.freecsstemplates.org 
Released for free under a Creative Commons Attribution 2.5 License 
*/ 

/* Page basics */ 
* { 
    font-family: verdana, sans-serif; 
} 

html body { 
    margin: 0; 
    padding: 0; 
    background: #efefef; 
    font-size: 12px; 
    color: #1e1e1e; 
} 

그래서 내 오징어 프록시 3.1이 설명하지 않은 this을 확인했습니다. support Transfer-Encoding : chunked하지만 POST 요청의 경우라고 말합니다. GET 요청에도 적용되는지 확실하지 않습니다. 나는 또한 Unable to test HTTP PUT-based file upload via Squid Proxy을 체크 아웃했다. 필자는 컬 (curl)이나 심지어 브라우저가 동일한 프록시 뒤에있는 동일한 네트워크에서 요청되었을 때 콘텐츠를 가져올 수 있지만 파이썬을 통해 성공적으로 응답을 가져올 수 없다는 것을 이해할 수는 없습니까?

프록시를 제어 할 권한이 없으므로 Squid 프록시로 조정하지 않고도 파이썬 프로그램을 작동시킬 수있는 방법이 있습니다.

+0

아마 사이트를 참조하십시오 구성합니다. mechanize.Browser를 사용하고 파이썬 프로그램이라는 사용자 에이전트를 설정하십시오. Firefox. –

+0

그럴 경우 사용자 에이전트가 어떤 용도로 사용하는지 궁금합니다. 지금까지 제가 확인한 바에 따르면, 기본적으로 curl에는 User-Agent가 없으며 여전히 작동합니다. 그 이유는 아니지만 시도해 보겠습니다. – sawrubh

답변

0

Curl은 터널링 방법 인 CONNECT 방법을 사용합니다. 프록시는 단순히 TCP 수준에서 원격쪽에 연결하고 컬링은 TLS 핸드 셰이크를 포함한 모든 통신을 수행합니다. 모든 TCP/IP 패킷은 프록시에 의해 앞뒤로 '삽'됩니다. 그러나 특정 코드 (예 : 관리자/회사가 자신의 CA 인증서를 자신의 인증서 풀에 넣을 때)에서 프록시에 의한 자동 침입 (MITM)이 가능합니다.

파이썬 스크립트가 원격 측과 통신하도록 프록시에 요청하는 것. 어떻게 든 프록시는 TLS 연결을 수행 할 수 없습니다 (빌드 중에 구성되거나 사용 불가능하게 설정되었거나 그렇지 않은 경우에는 불가능).

는 오징어가 사용자 에이전트를 좋아하지 않는 다른 쪽 끝 또는 오징어에 http://wiki.squid-cache.org/Features/HTTPS