In a previous post I showed how to retrieve your bugs, comments and attachments from YouTrack. However, actually downloading each attachment is a little more work. Assume that the variable Url contains a value like "http://xxxxx.myjetbrains.com/youtrack/_persistent/yyyyy.doc?file=xx-xxx&v=0&c=false"
The following raises a HTTP NotFound exception:
var foo = Connection.Get(Url); //YouTrackSharp.Infrastructure.Connection
As does this:
String basePath = new System.Uri(Url).PathAndQuery; var foo = Connection.Get(basePath );
The following will raise a HTTP NotAuthorized exception because we are not supplying the authentication cookie to the web-server.
byte[] file = new System.Net.WebClient().DownloadData(Url);
I looked at the YouTrackSharp.Infrastructure.Connection
class and I didn’t see anything that would let me retrieve the authentication cookie.
Instead of writing code to manually implement the YouTrack REST API, I decided to take a different approach. I decided to modify YouTrackSharp itself to give me access to the authentication cookie.
I removed the NuGet package YouTrackSharp from my solution.
I downloaded the source of YouTrackSharp from GitHub and unzipped it next to my own project.
I included src\YouTrackSharp\YouTrackSharp.csproj into my solution
I modified src\YouTrackSharp\Infrastructure
to add the public
modifier as follows:
public CookieCollection _authenticationCookie;
I changed my own program to download the file as follows:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url); req.CookieContainer = new CookieContainer(); req.CookieContainer.Add(Connection._authenticationCookie); req.Method = "GET"; WebResponse response = req.GetResponse(); System.IO.Stream Stream = response.GetResponseStream(); var fileStream = System.IO.File.Create(String.Format("C:\\tmp\\{0}", Name)); Stream.CopyTo(fileStream); fileStream.Close();