マルチパート/混合エンコーディングのみを提供するデバイスから、xml +任意のバイナリファイル(画像やオーディオなど)のPOSTデータを受信しています。
レシーバー側にcherrypyアップロード/POSTハンドラーを設定しました。multipart / form-dataを使用して、任意の数のパラメーターを実行できるようにすることができました。ただし、マルチパート混合データを送信しようとすると、処理が行われません。
@cherrypy.expose
def upload(self, *args,**kwargs):
"""upload adapted from cherrypy tutorials
We use our variation of cgi.FieldStorage to parse the MIME
encoded HTML form data containing the file."""
print args
print kwargs
cherrypy.response.timeout = 1300
lcHDRS = {}
for key, val in cherrypy.request.headers.iteritems():
lcHDRS[key.lower()] = val
incomingBytes = int(lcHDRS['content-length'])
print cherrypy.request.rfile
#etc..etc...
したがって、multipart / form-dataを送信する場合、argsとkwargsは明確に定義されています。
argsはフォームフィールドであり、kwargs=varsとvaluesのハッシュです。multipart / mixedを送信すると、argsとkwargsは空になり、生のPOST情報としてcherrypy.request.rfileがあります。
私の質問は、cherrypyにはPOSTのマルチパート/混合およびチャンクエンコーディングを処理するための組み込みハンドラーがありますか?または、cherrypy.tools.process_request_bodyをオーバーライドして、独自のデコーダーをロールする必要がありますか?
Cherrypyを備えた組み込みのwsgiサーバーがこれをHTTP/1.1仕様の一部として処理しているようですが、この機能にアクセスする際にcherrypyのドキュメントが見つからなかったようです。
...明確にするために
Cherrypyの最新バージョン3.1.1程度を使用しています。
デフォルトのフォームを作成するには、アップロード関数でパラメーターを作成するだけです。
multipart / form-dataについては、curl -F param1 = @ file1.jpg -F param2 = sometext -F param3 = @ file3.wav http:// destination:port/uploadを呼び出しています。
その例では、次のようになります。
args = ['param1','param2','param3]
kwargs = {'param1':CString<>, 'param2': 'sometext', 'param3':CString<>}
multipart / mixedを送信しようとしたときに、request.bodyを確認しようとしましたが、ボディ処理の設定に関係なく、Noneを取得し続けました。
私たちが得ている入力は次のようになります:
user-agent:UNTRUSTED/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1
content-language:en-US
content-length:565719
mime-version:1.0
content-type:multipart/mixed; boundary='newdivider'
host:192.168.1.1:8180
transfer-encoding:chunked
--newdivider
Content-type: text/xml
<?xml version='1.0' ?><data><Stuff>....
etc...etc...
--newdivider
Content-type: image/jpeg
Content-ID: file://localhost/root1/photos/Garden.jpg
Content-transfer-encoding: binary
<binary data>
multipart / mixedは、cherrypyがrfileだけを私に与えているという問題であるというこっそりの疑いがあります。私たちの目標は、受信側で最小限の処理で、cherrypyにボディをパーツに処理させることです(つまり、cherrypyに魔法をかけてもらいます)。そのために、送信形式をcherrypyが好むコンテンツタイプにするのが難しい場合は、そうしてください。受け入れられるフォーマットは何ですか?multipart / form-dataだけですか?