post 値が壊れる?

1,296 views
Skip to first unread message

てんたま

unread,
Feb 7, 2013, 6:34:40 PM2/7/13
to pla...@googlegroups.com
play2.1 RC1 java で使っています。

<form>
<img name="img01" src="base64 のものすごく長い文字列">
<input name="text01" type="text" />
</form>

のような感じで、img を base64 形式の文字列で持っていると
コントローラで受け取るときに
img01 も text01 も null になります。

base64 の文字列が 65kb 辺りがボーダーで
それより短いと普通にコントローラで受け取れるのですが
長いとすべての値が null か 0 になります。

同じような問題に直面した方いませんか。
どのように回避したか教えていただけないでしょうか。
(あきらめた、こうすると 65kb 以上の文字列を post できた、など)

150kb ぐらいまで OK にしたいんですが。

よろしくお願いします。

天然パーマ

unread,
Feb 7, 2013, 9:32:53 PM2/7/13
to pla...@googlegroups.com
天然パーマと申します。

URLの文字数で悩まされ事があります。今回の事象も同じかな?と投稿させていただきます。

ブラウザに依存、またはサーバに依存するのかは不確かですが、すべての項目に無制限は無いと考えています。
base64形式は関係なく、単に文字数制限に引っかかりnullまたは0になっているのかもしれません。

imgのaltには全角512文字までと記載されている記事がありました。

IEのURLは最大 2,083文字

srcもURLと考えればIEなら2083文字までしかサポートできないかもしれません。
srcの文字数制限が掛かれている情報は発見できませんでしたが・・・

ちなみに、
URLの長い文字はあきらめました。

-------------------------------------------
天然パーマ


2013年2月8日金曜日 8時34分40秒 UTC+9 てんたま:

高橋俊幸

unread,
Feb 8, 2013, 5:46:20 AM2/8/13
to pla...@googlegroups.com

高橋と申します。こんばんは。

なんだか一般的でないやり方をとろうとしてらっしゃるように思うのですが、どんなアプリなんでしょうか?
もしかしてやりたいことって長い文字列のポストではなくて画像のアップロードだったりしますか?

2013/02/08 8:34 "てんたま" <momma...@gmail.com>:
--
このメールは Google グループのグループ「日本Playframeworkユーザー会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、play_ja+u...@googlegroups.com にメールを送信します。
このグループに投稿するには、pla...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/play_ja?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

てんたま

unread,
Feb 8, 2013, 8:07:46 AM2/8/13
to pla...@googlegroups.com
天然パーマさん、高橋さん返信ありがとうございます。

高橋さんの書きこみを見て、重要と思われることを書き忘れていることに気付きました。
あまり詳しくは書けないのですが textarea の value にbase64 形式の image も含まれていて、textarea の value を post しています。
文字だけだと 200 kb ぐらいまでは post 出来るのを今確認しました。

やりたいことは、textarea の value を post することです。
そこに 長い base64 の文字列を持つ img タグがあると post 値が壊れます。
文字列が 150kb ぐらいまで OK になるようにしたいのですが、、、

よろしくお願いします。

高橋俊幸

unread,
Feb 8, 2013, 9:24:54 AM2/8/13
to pla...@googlegroups.com
高橋です。

Mac Firefox/Safari + play 2.1.0(Scala)
で同じように base64 エンコードした画像を含んだ form を作って
試してみましたが、再現できませんでした。
というか img タグの src 属性の値がリクエストに含まれることが普通はないとおもいます。
なにか他の原因も探ってみてはいかがでしょうか?

ちなみに検証コードはこんな具合です。
https://gist.github.com/tototoshi/4739295


2013年2月8日 22:07 てんたま <momma...@gmail.com>:

てんたま

unread,
Feb 10, 2013, 10:17:17 AM2/10/13
to pla...@googlegroups.com
おさわがせしてすいません、単純に post 値の最大値の問題でした。
application.conf に

parsers.text.maxLength = 1024k

を追加したら無事に post 出来ました。
アドバイスのおかげで無事に穴から脱出できました。
ありがとうございました。

rch850

unread,
Feb 12, 2013, 11:16:36 PM2/12/13
to pla...@googlegroups.com
はじめまして、りちゃ(@rch850)といいます。

もしかして私が遭遇している問題と同じかも?と思って開いてみたのですが、
解決されたようでよかったです。
とはいえ、今後遭遇するかもってことで、書いておきます。

2.1.0(Java)でテストを書くとき
route(fakeRequest(POST, "/hoge").withFormUrlEncodedBody(...));
のように書くと、コントローラ側で body が null になってしまいます。
deprecated になってしまった routeAndCall を使えば大丈夫なようです。

shinya mochizuki

unread,
Feb 13, 2013, 3:23:40 AM2/13/13
to pla...@googlegroups.com
望月です。

とりあえず問題を整理しましょう。
今回の問題は、Http リクエストの Entity ボディが巨大だった場合に、Play の BodyParser がそれをどう扱うか、という問題でした。

まず、巨大すぎるかどうかの判断ですが、これは単純に Entity ボディの長さを見ます。利用される値は、BodyParser に自分で長さを渡してやらない場合は、
という仕様になっています。

次に、巨大すぎた場合にどうなるかですが、Scala の API で提供される BodyParser では、ステータスコード 413(Entity Too Long) の Http レスポンスを返すようになっています
一方、何故かは分かりませんが(Java API の事情は全く詳しくないので、本当に分かりません…)、Java の API で提供される BodyParser では、何故か null として Body がパーズされるようになっています
null になっていたのは、上記の Java API の意図の不明な仕様が原因だと思われます。parse に何故失敗したのかが、デフォルトで闇に葬られる仕様というのが妥当かどうかはここでは議論しないことにしましょう…


さて、りちゃさんのいわれている「routeAndCall を使えば回避可能」に関してですが、これは Java API で提供されている routeAndCall に限った「バグ」です。
元々 routeAndCall には、アクションの BodyParser で body を parse しないというバグがありました。現在は修正されています。とはいえ別の問題もあるため矢張り deprecated です。
ここで重要なのは、上記リンクのコミットでの修正は Scala API に限ったものであり、Java API では同様の修正は現状なされていない、ということです。修正漏れでしょう。
そのため、巨大すぎる Body を生成するような FakeRequest を routeAndCall で扱えるのは、バグによる偶然です。前述の通り routeAndCall には別の問題もあるため、利用は避けたほうがいいでしょう。そもそもテスト時にしか通らないのでは、テストの意味がありません。

巨大な Http リクエストを扱いたい場合には、application.conf にグローバルな設定値を記述するか、そのようなリクエストを受け取る可能性のあるアクションの BodyParser に適切な長さを設定してやるのが良いと思います。
Reply all
Reply to author
Forward
0 new messages