google-gdataプロジェクトにContributeしてみました。
拙作のLhaz+で「最終計画.xls」というファイルをGoogleドライブにアップロードしようとしたところ,プログレスバーが一瞬現れて消えるだけで,ファイルがまったくアップロードされませんでした。
「最」という字に覚えがありました。Shift-JISで0x8DC5なのです。0xC5は「¥」でパスの区切りのため,0xC5が含まれる全角文字は問題を引き起こしやすいのです。
「どうせそれが原因だろう」と,同じ0xC5の含まれる「十.txt」をアップロードしてみたところ,これはアップロードできてしまいました。
そもそも,Lhaz+はユニコードビルドしているので,内部の文字コードはShift-JISではありませんでした。
あれこれデバッグしてC#のクラスのメンバーをあちこち覗いているうちに,ArgumentException例外がSystem.Net.WebHeaderCollection.CheckBadCharsから投げられていることに気がつきました。
検索すると,Googleグループで「世」の場合に同現象が起きているとの話がありました。しかし,示されている解決方法を試しても,解決しませんでした。
仕方がないので既に取得してあったGoogle Data .NET Client Libraryのソースをsvn updateして,中を見始めました。といってもコールスタックの情報が得られていたので,原因箇所はすぐ判りました。
HttpWebRequest.Headers.SetでHTTPリクエストヘッダに文字列を設定しているのですが,生文字列を設定しているのが原因でした。Uri.EscapeDataStringでエンコードするように修正してみたところ,バッチリ動作しました。「世」でも「最」でもアップロードできるようになりました。
せっかくなのでIssuesに投稿したところ,3時間ほどで正式な修正をして頂けました。Utilities.EncodeSlugHeaderという違う関数でエンコードしていましたが,修正箇所は同じでした。
また何か見つけたらPatchを投稿してみたいと思います。
コメントを残す