2017-06-22 5 views
3

Googleのクラウドストレージ(Googleの公開アプリからのログファイル)からファイルをダウンロードしようとしています。Googleのクラウドストレージから常に不正なハッシュをダウンロードする

私のコードは、この

Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", "my-service-account-credential.json", EnvironmentVariableTarget.Process); 
StorageClient storageClient = StorageClient.Create(); 

var bucketName = "mybucketname"; 
var buckets = storageClient.GetBucket(bucketName); 
var objects = storageClient.ListObjects(bucketName).ToList(); 
foreach (var o in objects) 
{ 
    try 
    { 
     Directory.CreateDirectory(Path.GetDirectoryName(o.Name)); 
     using (var fs = File.Open(o.Name, FileMode.OpenOrCreate)) 
     { 
      await storageClient.DownloadObjectAsync(bucketName, o.Name, fs);            
     } 
    } 
    catch (Exception e) 
    { 
     if (e.Message.StartsWith("Incorrect hash")) 
     { 
      continue; 
     } 
     throw; 
    } 
} 

コードが実際に正常に動作するようです(実際のダウンロードしたファイルの内容を見てから判断すると、それはCSVファイルである)のように見えます。しかし、あなたが見ることができるように、私がダウンロードしたすべてのファイルがハッシュが間違っているという例外をスローするので、厄介なtry catch/hackを実装しました。私は、クライアントライブラリは、バケットのハッシュとダウンロードされたコンテンツのハッシュを比較し、これらは例外の結果、同一ではないと仮定しています。

例外は次のとおりです。

System.IO.IOException: Incorrect hash: expected 'DXpVGw==' (base64), was '2RMrcw==' (base64) 
    at Google.Cloud.Storage.V1.StorageClientImpl.<DownloadObjectAsyncImpl>d__48.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
    at MyClass.GoogleBucket.Functions.<DownloadGoogleBucketLogs>d__1.MoveNext() in mycode.cs:line 51 

だから私の質問は、あなたがこの例外を得ることなく、明確一つは、私がやっていることを行うことになっていない、オブジェクトをダウンロードします方法です。

+0

完全な例外の詳細を含めることはできますか? – mjwills

+0

例外の詳細が追加されました。私は別の時間を試して、多くのファイルは例外が常に発生することに注意してください。 – sjkp

+0

クライアントライブラリのバグかどうか疑問に思います。 GCSのメタデータに基づいて、オブジェクトのコンテンツタイプとコンテンツエンコーディングを教えてください。 –

答えて

6

TL; DR:2.1.0に更新されました。 (または、あなたが必死であれば、前にソースを取得してビルドしてください。)

これは修正するのが難しいものでした。

問題はHttpClientが自動的にデータを解凍していたことですが、サーバーが提供するハッシュは圧縮されたコンテンツ用です。

REST APIサポートライブラリとGoogle.Cloud.Storage.V1ライブラリの両方に変更を加え、ダウンロードしたデータを圧縮解除してから解凍しました。変更はGithubで統合され、2.1.0リリースに入っています。これは1月上旬に発生する予定です。

クライアント側の解凍が無効になり、サーバー側の解凍が行われるが、圧縮されたコンテンツのハッシュが残っている別のコーナーケースは修正されないことに注意してください。 Weはtracking that separatelyですが、明示的にStorageServiceを作成し、イニシャライザでgzipサポートを無効にしてから、そのサービスをラップするためにStorageClientを作成した場合にのみ表示されるので、サンプルコードには影響しません。

関連する問題