2012-02-11 4 views
3

自分のHTTPサーバーをテストするためにチャンクされたHTTP本体を送信したい。私は、HTTPリクエストのボディがtransferrdチャンクされ、 私は、HTTPリクエストのボディはチャンク転送されませんWiresharkを使ってネットワークのパッケージを取り込む期待http.clientにチャンクエンコードHTTPボディをpythonで送信させるにはどうすればいいですか?

import http.client 

body = 'Hello World!' * 80 

conn = http.client.HTTPConnection("some.domain.com") 
url = "/some_path?arg=true_arg" 

conn.request("POST", url, body, {"Transfer-Encoding":"chunked"}) 

resp = conn.getresponse() 
print(resp.status, resp.reason) 

: は、だから私は、このPythonコードを書きました。

http.client libでPythonでチャンクボディを転送するにはどうすればいいですか?

答えて

7

[OK]を取得します。

まず、自分のチャンクエンコード関数を作成します。

その後(()、putheader()、endheaders()putrequestを使用し、(送信)の代わりに、要求の)

import http.client 

def chunk_data(data, chunk_size): 
    dl = len(data) 
    ret = "" 
    for i in range(dl // chunk_size): 
     ret += "%s\r\n" % (hex(chunk_size)[2:]) 
     ret += "%s\r\n\r\n" % (data[i * chunk_size : (i + 1) * chunk_size]) 

    if len(data) % chunk_size != 0: 
     ret += "%s\r\n" % (hex(len(data) % chunk_size)[2:]) 
     ret += "%s\r\n" % (data[-(len(data) % chunk_size):]) 

    ret += "0\r\n\r\n" 
    return ret 


conn = http.client.HTTPConnection(host) 
url = "/some_path" 
conn.putrequest('POST', url) 
conn.putheader('Transfer-Encoding', 'chunked') 
conn.endheaders() 
conn.send(chunk_data(body, size_per_chunk).encode('utf-8')) 

resp = conn.getresponse() 
print(resp.status, resp.reason) 
conn.close() 
+2

はchunk_dataの(すなわちのための内部の2行目に一つだけのセパレータwhith私にとっては良い作品:私は説明するために、コードを変更したRET + =「%sの\ rを\ n」は%(データ[ i * chunk_size:(i + 1)* chunk_size])) –

1

私はあなたが既にのようなあなたのデータのサイズを知っていればことをお勧めしたいですanswerを指定すると、Content-Lengthを設定して、すべてを1回のヒットで送り返すことができます。これは、とにかくconn.sendへの1回の呼び出しで何をしているのかを示しています。

チャンク転送のエンコードは、データのサイズがわからない場合に最も便利です。動的に生成されるコンテンツ。

import httplib 

def write_chunk(conn, data): 
    conn.send("%s\r\n" % hex(len(data))[2:]) 
    conn.send("%s\r\n" % data) 

def dynamically_generate_data(): 
    for i in range(80): 
     yield "hello world" 

conn = httplib.HTTPConnection("localhost") 
url = "/some_path" 
conn.putrequest('POST', url) 
conn.putheader('Transfer-Encoding', 'chunked') 
conn.endheaders() 

for new_chunk in dynamically_generate_data(): 
    write_chunk(conn, new_chunk) 
conn.send('0\r\n') 

resp = conn.getresponse() 
print(resp.status, resp.reason) 
conn.close() 
関連する問題