I am using Octokit.net version 0.9.0
(GitHub API for .NET) for getting zip contents of few repositories.
I already have the list of repositories I need but I am having trouble with getting the the content of the repositories as .zip files (called zipball)
// ... client = new Client(...);
// some authentication logic...
// some other queries to GitHub that work correctly
var url = "https://api.github.com/repos/SomeUser/SomeRepo/zipball";
var response = await this.client.Connection.Get<byte[]>(
new Uri(url),
new Dictionary<string, string>(),
null);
var data = response.Body;
var responseData = response.HttpResponse.Body;
data
is nullresponseData.GetType().Name
says the responseData
is of type stringEncoding.ASCII.GetBytes(response.HttpResponse.Body.ToString());
I get invalid zip fileWhat is the correct way to get zipballs of repositories after being authenticated using Octokit.net library?
I've also opened an issue in octokit.net repository.
After checking the source of Octokit I think this is not possible (as of version 0.10.0):
See Octokit\Http\HttpClientAdapter.cs
// We added support for downloading images. Let's constrain this appropriately.
if (contentType == null || !contentType.StartsWith("image/"))
{
responseBody = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
}
else
{
responseBody = await responseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
}
The response body (responseData
) is converted to an unicode string and, thus, it's mangled and not binary the same. See my PR792 (need to replace the if statement with if (contentType == null || (!contentType.StartsWith("image/") && !contentType.StartsWith("application/")))
) to fix this (then it's a byte array. Writing possible using System.IO.File.WriteAllBytes("c:\\test.zip", (byte[])responseData);
).