tags:

views:

38

answers:

2

I have an issue with URLs being transformed automatically as they are being processed.

Uri myUri = new Uri(this.url);

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri);
     request.ProtocolVersion = HttpVersion.Version10;
     request.Method = "GET";
     HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Apologies for the long urls In this case: this.url is correct

(https://zencoder-live.s3.amazonaws.com:443/ec03a97b1f726d8ee65774313a100db5%2Fa54779efdf5d1f64ac82954c870beb12.mp4?Signature=nrc0U65Pe3PiORokhAscndLdP68%3D&Expires=1284625412&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ)

Whereas the url inside the Uri object is not

({https://zencoder-live.s3.amazonaws.com/ec03a97b1f726d8ee65774313a100db5/a54779efdf5d1f64ac82954c870beb12.mp4?Signature=nrc0U65Pe3PiORokhAscndLdP68=&Expires=1284625412&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ}

Note the differences of "%2F" --> "/". The same happens if I feed this.url straight into WebRequest and I get a 403 error from the S3 server because the signatures no longer match.

Is there a way to prevent such transformations from occuring?

EDIT: As this is a desktop application (sorry for not mentioning earlier) HTTPUtilities is not available but the URI class has a similar function so I tried that

this.url = Uri.EscapeUriString(this.url); and this.url gets set to:

https://zencoder-live.s3.amazonaws.com:443/e09517d7841a9047f9ff7a2f015d2596%252F1e8e7e8e1a85665bc7e9b146ce444a88.mp4?Signature=6bs5vfOBUDeHeX2HdmrvVGDnDjE%253D&Expires=1284627002&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ

and then from within the HttpWebRequest Object:

https://zencoder-live.s3.amazonaws.com/e09517d7841a9047f9ff7a2f015d2596%252F1e8e7e8e1a85665bc7e9b146ce444a88.mp4?Signature=6bs5vfOBUDeHeX2HdmrvVGDnDjE%253D&Expires=1284627002&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ

The HttpWebRequest object has not transformed it at all so the URI is still incorrect. %2F gets converted to %252F and does not get converted back to %2F on creation of the Uri Object.

+2  A: 

You might want to have a look at the HttpUtility class, which offers UrlDecode / UrlEncode methods.

Jim Brissom
I saw that, but it doesn't seem to work as expected. Please see edit in to the original question
paullb
I tried importing HttpUtility class but it just converts the entire string which the Uri/ HttpWebRequest reject: "https%3a%2f%2fzencoder-live.s3.amazonaws.com%3a443%2f2e33f7d90e54b1e8816eb1d7d80e6b08%252Fe80da01b484e4c4167f944e1952a0577.mp4%3fSignature%3d08VGDqDybKH8QN5lDKHzn46Fy2M%253D%26Expires%3d1284688887%26AWSAccessKeyId%3dAKIAIIEXNN2J4YDTRUVQ"
paullb
+1  A: 

%2F in the first URL is being correctly transformed to /.
In order to stop this you must first HttpUtility.UrlEncode() to ensure the % is encoded.

Uri myUri = new Uri(HttpUtility.UrlEncode(this.url));
Codesleuth
Thanks for the idea, but as I am creating a console application HttpUtility is not available. See edit. I did try Uri.EscapeUriString but that didn't seem to do it.
paullb
I've tried your code, changing the user agent and using many different encoded versions of the URL and it's still doing the same `403 Forbidden` error for me too. The only suggestion I have is that the secure port connection isn't behaving.
Codesleuth
Thanks for trying out the links! In what what could it not be behaving (I'm fairly new to C# but experienced in PHP)
paullb
This didn't wind up working
paullb