はじめてのContribution

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を投稿してみたいと思います。