http://www.test.com/main/page.html?query=val#middle
converts to
pack://http:,www.test.com,main,page.html?query=val#middle/
So I says to myself, this is easy, it's just combining two Uris. Simple!
So I says to myself, this is easy, it's just combining two Uris. Simple!
Wrong
Uri original = new Uri ("http://www.test.com/main/page.html?query=val#middle");
Uri complete = new Uri ("pack://" + original.OriginalString); // FAILS
Uri complete = new Uri (new Uri ("pack://", original)); //FAILS
Uri complete = new Uri (new Uri ("pack://", original.OriginalString)); // FAILS
How about escaping the second string...
string escaped = Uri.HexEscape (original.OriginalString);
Uri complete = new Uri ("pack://" + escaped); // FAILS
So at this stage I've lost all faith in humanity, so i try a basic test just to make sure i'm not insane. I'll try create a pack uri object myself, just to prove that it really is possible to parse them.
Uri complete = new Uri ("pack://http:,www.test.com,main,page.html?query=val#middle/");
After several hours and a lot of wasted time I finally came up with this:
Uri complete = new Uri (new Uri ("pack://"), escaped);
This is the *only* way to create a Pack URI. You have to hex escape the original uri and then call the constructor overload which takes a Uri and a string.
That is one of the stupidest things I've ever seen.
Uri complete = new Uri (new Uri ("pack://", original)); //FAILS
Uri complete = new Uri (new Uri ("pack://", original.OriginalString)); // FAILS
How about escaping the second string...
string escaped = Uri.HexEscape (original.OriginalString);
Uri complete = new Uri ("pack://" + escaped); // FAILS
So at this stage I've lost all faith in humanity, so i try a basic test just to make sure i'm not insane. I'll try create a pack uri object myself, just to prove that it really is possible to parse them.
Uri complete = new Uri ("pack://http:,www.test.com,main,page.html?query=val#middle/");
EPIC FAIL
You can't do that. While they can *generate* that Uri for you, you can't generate one for yourself. Funnily enough, they do register a custom parser for the pack scheme, it's just incapable of parsing pack URI's. Don't ask me why.
After several hours and a lot of wasted time I finally came up with this:
Uri complete = new Uri (new Uri ("pack://"), escaped);
This is the *only* way to create a Pack URI. You have to hex escape the original uri and then call the constructor overload which takes a Uri and a string.
That is one of the stupidest things I've ever seen.