<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="http://www.codeplex.com/rss.xsl"?><rss version="2.0"><channel><title>C# Library and Code for Amazon S3</title><link>http://www.codeplex.com/ThreeSharp/Project/ProjectRss.aspx</link><description>An advanced C&amp;#35; library for interfacing with the Amazon S3 system. Among its powerful features are&amp;#58;   - Full support for data streaming. No need to load data into memory before sending to S3.   - Data e...</description><item><title>New Post: EncryptFile throwing "Cannot close stream until all bytes are written."</title><link>http://www.codeplex.com/ThreeSharp/Thread/View.aspx?ThreadId=33484</link><description>&lt;div style="line-height: normal;"&gt;I changed the crypto service provider from DESCryptoServiceProvider to RijndaelManaged and changed the padding correction code for ByteTotal to 16 ( from 8)&lt;br&gt;
&lt;br&gt;
Everything else is unchanged.&lt;br&gt;
&lt;br&gt;
Now when I try uploading files some of them upload fine while others fail with the above error.&lt;br&gt;
&lt;br&gt;
I've narrowed it down to JPEG and text files work and word documents fail with the above error.&lt;br&gt;
&lt;br&gt;
Looks like word seems to be always padding itself to make the total file size be a multiple of 16.&lt;br&gt;
&lt;br&gt;
I'm stumped and would appreciate any help&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;</description><author>vsagi123</author><pubDate>Wed, 13 Aug 2008 22:21:34 GMT</pubDate><guid isPermaLink="false">New Post: EncryptFile throwing "Cannot close stream until all bytes are written." 20080813102134P</guid></item><item><title>Commented Feature: Add support for Copy</title><link>http://www.codeplex.com/ThreeSharp/WorkItem/View.aspx?WorkItemId=10444</link><description>Amazon S3 has released a beta version of Copy functionality. Here are the release notes&amp;#58;&lt;br /&gt;&lt;br /&gt;http&amp;#58;&amp;#47;&amp;#47;developer.amazonwebservices.com&amp;#47;connect&amp;#47;entry.jspa&amp;#63;externalID&amp;#61;1462&amp;#38;categoryID&amp;#61;49 &lt;br /&gt;&lt;br /&gt;Here is the related documentation&amp;#58;&lt;br /&gt;&lt;br /&gt;http&amp;#58;&amp;#47;&amp;#47;docs.amazonwebservices.com&amp;#47;AmazonS3&amp;#47;2006-03-01&amp;#47;index.html&amp;#63;UsingCopyingObjects.html&lt;br /&gt;Comments: ** Comment from web user: jAffirma ** &lt;p&gt;Hi,&lt;br /&gt;  I&amp;#39;ve added copy support to Release 1.4.  Thanks for the feedback&amp;#33;&lt;/p&gt;&lt;p&gt;Thanks,&lt;br /&gt;Joel Wetzel&lt;br /&gt;Affirma Consulting&lt;/p&gt;</description><author>jAffirma</author><pubDate>Mon, 11 Aug 2008 18:58:58 GMT</pubDate><guid isPermaLink="false">Commented Feature: Add support for Copy 20080811065858P</guid></item><item><title>Reopened Issue: String encoding in Response.cs/Request.cs</title><link>http://www.codeplex.com/ThreeSharp/WorkItem/View.aspx?WorkItemId=9096</link><description>Hi,&lt;br /&gt;&lt;br /&gt;If you save international characters with your LoadStreamWithString method, you&amp;#39;ll loose the non-ASCII characters...&lt;br /&gt;&lt;br /&gt;As far as I could see in .Net documentation, strings are Unicode characters. I think it would be better to encode them using the System.Text.Encoding.Unicode encoder instead.&lt;br /&gt;&lt;br /&gt;I&amp;#39;ve tried it and it works well with those Danish characters I use... I applied the unicode encoder to Request.cs &amp;#40;LoadStreamWithFile&amp;#41; and Response.cs &amp;#40;StreamResponseToString&amp;#41;. And I could easily read the characters after woods...&lt;br /&gt; - I&amp;#39;ve also downloaded the object using cockpit and my Linux box and read it using gedit so the unicode encoding should work... &amp;#58;&amp;#41;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#47;&amp;#47;Regards Jonas F. Jensen&lt;br /&gt;Comments: ** Comment from web user: jAffirma ** &lt;p&gt;&lt;/p&gt;</description><author>jAffirma</author><pubDate>Mon, 11 Aug 2008 18:57:22 GMT</pubDate><guid isPermaLink="false">Reopened Issue: String encoding in Response.cs/Request.cs 20080811065722P</guid></item><item><title>Commented Issue: String encoding in Response.cs/Request.cs</title><link>http://www.codeplex.com/ThreeSharp/WorkItem/View.aspx?WorkItemId=9096</link><description>Hi,&lt;br /&gt;&lt;br /&gt;If you save international characters with your LoadStreamWithString method, you&amp;#39;ll loose the non-ASCII characters...&lt;br /&gt;&lt;br /&gt;As far as I could see in .Net documentation, strings are Unicode characters. I think it would be better to encode them using the System.Text.Encoding.Unicode encoder instead.&lt;br /&gt;&lt;br /&gt;I&amp;#39;ve tried it and it works well with those Danish characters I use... I applied the unicode encoder to Request.cs &amp;#40;LoadStreamWithFile&amp;#41; and Response.cs &amp;#40;StreamResponseToString&amp;#41;. And I could easily read the characters after woods...&lt;br /&gt; - I&amp;#39;ve also downloaded the object using cockpit and my Linux box and read it using gedit so the unicode encoding should work... &amp;#58;&amp;#41;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#47;&amp;#47;Regards Jonas F. Jensen&lt;br /&gt;Comments: ** Comment from web user: jAffirma ** &lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;#42;&amp;#42; Closed by jAffirma 8&amp;#47;11&amp;#47;2008 11&amp;#58;56 AM&lt;/p&gt;</description><author>jAffirma</author><pubDate>Mon, 11 Aug 2008 18:57:22 GMT</pubDate><guid isPermaLink="false">Commented Issue: String encoding in Response.cs/Request.cs 20080811065722P</guid></item><item><title>Closed Issue: String encoding in Response.cs/Request.cs</title><link>http://www.codeplex.com/ThreeSharp/WorkItem/View.aspx?WorkItemId=9096</link><description>Hi,&lt;br /&gt;&lt;br /&gt;If you save international characters with your LoadStreamWithString method, you&amp;#39;ll loose the non-ASCII characters...&lt;br /&gt;&lt;br /&gt;As far as I could see in .Net documentation, strings are Unicode characters. I think it would be better to encode them using the System.Text.Encoding.Unicode encoder instead.&lt;br /&gt;&lt;br /&gt;I&amp;#39;ve tried it and it works well with those Danish characters I use... I applied the unicode encoder to Request.cs &amp;#40;LoadStreamWithFile&amp;#41; and Response.cs &amp;#40;StreamResponseToString&amp;#41;. And I could easily read the characters after woods...&lt;br /&gt; - I&amp;#39;ve also downloaded the object using cockpit and my Linux box and read it using gedit so the unicode encoding should work... &amp;#58;&amp;#41;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#47;&amp;#47;Regards Jonas F. Jensen&lt;br /&gt;</description><author>jAffirma</author><pubDate>Mon, 11 Aug 2008 18:56:34 GMT</pubDate><guid isPermaLink="false">Closed Issue: String encoding in Response.cs/Request.cs 20080811065634P</guid></item><item><title>Commented Issue: String encoding in Response.cs/Request.cs</title><link>http://www.codeplex.com/ThreeSharp/WorkItem/View.aspx?WorkItemId=9096</link><description>Hi,&lt;br /&gt;&lt;br /&gt;If you save international characters with your LoadStreamWithString method, you&amp;#39;ll loose the non-ASCII characters...&lt;br /&gt;&lt;br /&gt;As far as I could see in .Net documentation, strings are Unicode characters. I think it would be better to encode them using the System.Text.Encoding.Unicode encoder instead.&lt;br /&gt;&lt;br /&gt;I&amp;#39;ve tried it and it works well with those Danish characters I use... I applied the unicode encoder to Request.cs &amp;#40;LoadStreamWithFile&amp;#41; and Response.cs &amp;#40;StreamResponseToString&amp;#41;. And I could easily read the characters after woods...&lt;br /&gt; - I&amp;#39;ve also downloaded the object using cockpit and my Linux box and read it using gedit so the unicode encoding should work... &amp;#58;&amp;#41;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#47;&amp;#47;Regards Jonas F. Jensen&lt;br /&gt;Comments: ** Comment from web user: jAffirma ** &lt;p&gt;Hi All,&lt;br /&gt;  I&amp;#39;ve switch to UTF8 encoding for Release 1.4, which should fix the encoding problems.  In a related issue, I&amp;#39;ve also added overloads to Request.LoadStreamWithString and Request.LoadStreamWithBytes to support manual override of the content type.&lt;/p&gt;&lt;p&gt;Thanks,&lt;br /&gt;Joel Wetzel&lt;br /&gt;Affirma Consulting&lt;/p&gt;</description><author>jAffirma</author><pubDate>Mon, 11 Aug 2008 18:56:00 GMT</pubDate><guid isPermaLink="false">Commented Issue: String encoding in Response.cs/Request.cs 20080811065600P</guid></item><item><title>New Post: Can't Set ContentType on a String</title><link>http://www.codeplex.com/ThreeSharp/Thread/View.aspx?ThreadId=19141</link><description>&lt;div style="line-height: normal;"&gt;&lt;p&gt;Hi Jeffrey,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; For Release 1.4, I've switched to UTF8 encoding, which should solve everyone's difficulties with the encoding.&amp;nbsp; Also, I've added overloads to Request.LoadStreamWithString and Request.LoadStreamWithBytes to allow a developer to set content type manually.&lt;br&gt;
&lt;br&gt;
Thanks,&lt;br&gt;
Joel Wetzel&lt;br&gt;
Affirma Consulting&lt;/p&gt;
&lt;/div&gt;</description><author>jAffirma</author><pubDate>Mon, 11 Aug 2008 18:54:08 GMT</pubDate><guid isPermaLink="false">New Post: Can't Set ContentType on a String 20080811065408P</guid></item><item><title>New Post: ThrowIfErrors... regex is incorrect?</title><link>http://www.codeplex.com/ThreeSharp/Thread/View.aspx?ThreadId=30920</link><description>&lt;div style="line-height: normal;"&gt;Hi Rob,&lt;br&gt;
&amp;nbsp; Your analysis was spot on!&amp;nbsp; I've included your fix in Release 1.4&lt;br&gt;
&lt;br&gt;
Thanks,&lt;br&gt;
Joel Wetzel&lt;br&gt;
Affirma Consulting
&lt;/div&gt;</description><author>jAffirma</author><pubDate>Mon, 11 Aug 2008 18:48:30 GMT</pubDate><guid isPermaLink="false">New Post: ThrowIfErrors... regex is incorrect? 20080811064830P</guid></item><item><title>New Post: Any plans to add 'Copy Object' support?</title><link>http://www.codeplex.com/ThreeSharp/Thread/View.aspx?ThreadId=28657</link><description>&lt;div style="line-height: normal;"&gt;&lt;p&gt;Hi All,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Thanks for the feedback!&amp;nbsp; I've added object copy support to Release 1.4, as well as the custom string comparer to fix the metadata ordering issue.&amp;nbsp; It's demonstrated in the console sample.&lt;/p&gt;
&lt;p&gt;Thanks,&lt;br&gt;
Joel Wetzel&lt;br&gt;
Affirma Consulting&lt;/p&gt;
&lt;/div&gt;</description><author>jAffirma</author><pubDate>Mon, 11 Aug 2008 18:43:51 GMT</pubDate><guid isPermaLink="false">New Post: Any plans to add 'Copy Object' support? 20080811064351P</guid></item><item><title>Created Release: Release 1.4 (Aug 11, 2008)</title><link>http://www.codeplex.com/ThreeSharp/Release/ProjectReleases.aspx?ReleaseId=16227</link><description>&lt;div&gt;
------------------------&lt;br&gt;Release 1.4 New Features&lt;br&gt;------------------------&lt;br&gt; &lt;br&gt;- Now supports the new object copy functionality in Amazon S3.&lt;br&gt;- Fixed a regular expression bug in the ThrowIfErrors method of the ThreeSharpQuery class.&lt;br&gt;- Fixed a problem with incorrect ordering of metadata headers containing dashes.&lt;br&gt;- Request and Response now use UTF8 encoding for strings, instead of ASCII encoding.&lt;br&gt;- Added overloads to Request.LoadStreamWithString and Request.LoadStreamWithBytes to allow content type to be set manually.&lt;br&gt;
&lt;/div&gt;</description><author></author><pubDate>Mon, 11 Aug 2008 18:41:38 GMT</pubDate><guid isPermaLink="false">Created Release: Release 1.4 (Aug 11, 2008) 20080811064138P</guid></item><item><title>Released: Release 1.4 (Aug 11, 2008)</title><link>http://www.codeplex.com/ThreeSharp/Release/ProjectReleases.aspx?ReleaseId=16227</link><description>&lt;div&gt;
------------------------&lt;br&gt;Release 1.4 New Features&lt;br&gt;------------------------&lt;br&gt; &lt;br&gt;- Now supports the new object copy functionality in Amazon S3.&lt;br&gt;- Fixed a regular expression bug in the ThrowIfErrors method of the ThreeSharpQuery class.&lt;br&gt;- Fixed a problem with incorrect ordering of metadata headers containing dashes.&lt;br&gt;- Request and Response now use UTF8 encoding for strings, instead of ASCII encoding.&lt;br&gt;- Added overloads to Request.LoadStreamWithString and Request.LoadStreamWithBytes to allow content type to be set manually.&lt;br&gt;
&lt;/div&gt;</description><author></author><pubDate>Mon, 11 Aug 2008 18:41:38 GMT</pubDate><guid isPermaLink="false">Released: Release 1.4 (Aug 11, 2008) 20080811064138P</guid></item><item><title>New Post: Any plans to add 'Copy Object' support?</title><link>http://www.codeplex.com/ThreeSharp/Thread/View.aspx?ThreadId=28657</link><description>&lt;div style="line-height: normal;"&gt;Found a more elegant solution.&amp;nbsp; This is a thread on the Amazon Form which has the details...&lt;br&gt;
&lt;br&gt;
http://developer.amazonwebservices.com/connect/thread.jspa?threadID=23365&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
First, you need to implement a custom Comparer object.&lt;br&gt;
&lt;br&gt;
&lt;hr&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private class MyStringComparer : IComparer {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private CompareInfo myComp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private CompareOptions myOptions = CompareOptions.None;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Constructs a comparer using the specified CompareOptions.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public MyStringComparer(CompareInfo cmpi, CompareOptions options) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myComp = cmpi;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.myOptions = options;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Compares strings with the CompareOptions specified in the constructor.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Compare(Object a, Object b) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (a == b) return 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (a == null) return -1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (b == null) return 1;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String sa = a as String;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String sb = b as String;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sa != null &amp;amp;&amp;amp; sb != null)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return myComp.Compare(sa, sb, myOptions);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentException(&amp;quot;a and b should be strings.&amp;quot;);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;hr&gt;
&lt;br&gt;
&lt;br&gt;
Then, in the MakeCanonicalString method...&lt;br&gt;
&lt;br&gt;
&lt;hr&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyStringComparer comp = new MyStringComparer(CompareInfo.GetCompareInfo(&amp;quot;&amp;quot;), CompareOptions.StringSort);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SortedList interestingHeaders = new SortedList(comp);&lt;br&gt;
&lt;br&gt;
&lt;hr&gt;
&lt;br&gt;
&lt;br&gt;
Hope this helps...&lt;br&gt;
&lt;hr&gt;
&lt;/div&gt;</description><author>stuartmiller</author><pubDate>Fri, 25 Jul 2008 14:26:09 GMT</pubDate><guid isPermaLink="false">New Post: Any plans to add 'Copy Object' support? 20080725022609P</guid></item><item><title>New Post: Any plans to add 'Copy Object' support?</title><link>http://www.codeplex.com/ThreeSharp/Thread/View.aspx?ThreadId=28657</link><description>&lt;div style="line-height: normal;"&gt;I implemented your objects, and it works great but for one issue I found.&lt;br&gt;
&lt;br&gt;
When you copy an object using the x-amz-metadata-directive, the OrderedList of headers will not sort properly in ThreeSharpUtils.MakeCanonicalString.&amp;nbsp; If your metadata keys starts with anything other than 'a', 'b' or 'c', the sort will place the x-amz-metadata-directive key out of order.&lt;br&gt;
&lt;br&gt;
For instance, if I add the keys &amp;quot;album&amp;quot; and &amp;quot;season&amp;quot; I get...&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
x-amz-meta-album:1986&lt;br&gt;
x-amz-metadata-directive:REPLACE&lt;br&gt;
x-amz-meta-seasonid:2006&lt;br&gt;
&lt;br&gt;
This will cause a 403 response from the server.&amp;nbsp; What I did to fix this was to replace the '-' char with a '~' char, and it sorts properly.&amp;nbsp; I have included my 'hack' below.&amp;nbsp; I'd be interested to see a more elegent solution.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static string MakeCanonicalString(string verb, string bucketName, string key, SortedList queryParams, SortedList headers, string expires)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder buf = new StringBuilder();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(verb);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(&amp;quot;\n&amp;quot;);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SortedList interestingHeaders = new SortedList();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (headers != null)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string header in headers.Keys)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string lk = header.ToLower();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (lk.Equals(&amp;quot;content-type&amp;quot;) ||&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lk.Equals(&amp;quot;content-md5&amp;quot;) ||&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lk.Equals(&amp;quot;date&amp;quot;) ||&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lk.StartsWith(AMAZON_HEADER_PREFIX))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //interestingHeaders.Add(lk, headers[header]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; interestingHeaders.Add(lk.Replace('-', '~'), headers[header]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if (interestingHeaders[ALTERNATIVE_DATE_HEADER] != null)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (interestingHeaders[ALTERNATIVE_DATE_HEADER.Replace('-', '~')] != null)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; interestingHeaders.Add(&amp;quot;date&amp;quot;, &amp;quot;&amp;quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if the expires is non-null, use that for the date field.&amp;nbsp; this&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // trumps the x-amz-date behavior.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (expires != null)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; interestingHeaders.Add(&amp;quot;date&amp;quot;, expires);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // these headers require that we still put a new line after them,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // even if they don't exist.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] newlineHeaders = { &amp;quot;content~type&amp;quot;, &amp;quot;content~md5&amp;quot; };&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string header in newlineHeaders)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (interestingHeaders.IndexOfKey(header) == -1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; interestingHeaders.Add(header, &amp;quot;&amp;quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Finally, add all the interesting headers (i.e.: all that startwith x-amz- ;-))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string header in interestingHeaders.Keys) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if (header.StartsWith(AMAZON_HEADER_PREFIX))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (header.StartsWith(AMAZON_HEADER_PREFIX.Replace('-', '~')))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(header.Replace('~', '-')).Append(&amp;quot;:&amp;quot;).Append((interestingHeaders[header] as string).Trim());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //buf.Append(header).Append(&amp;quot;:&amp;quot;).Append((interestingHeaders[header] as string).Trim());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(interestingHeaders[header]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(&amp;quot;\n&amp;quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Build the path using the bucket and key&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(&amp;quot;/&amp;quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bucketName != null &amp;amp;&amp;amp; !bucketName.Equals(&amp;quot;&amp;quot;))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(bucketName);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(&amp;quot;/&amp;quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Append the key (it may be an empty string)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (key != null &amp;amp;&amp;amp; key.Length != 0)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(key);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if there is an acl, logging, or torrent paramter, add them to the string.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (queryParams != null)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (queryParams.IndexOfKey(&amp;quot;acl&amp;quot;) != -1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(&amp;quot;?acl&amp;quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (queryParams.IndexOfKey(&amp;quot;torrent&amp;quot;) != -1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(&amp;quot;?torrent&amp;quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (queryParams.IndexOfKey(&amp;quot;logging&amp;quot;) != -1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf.Append(&amp;quot;?logging&amp;quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.WriteLine(buf.ToString());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return buf.ToString();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;/div&gt;</description><author>stuartmiller</author><pubDate>Wed, 23 Jul 2008 18:11:15 GMT</pubDate><guid isPermaLink="false">New Post: Any plans to add 'Copy Object' support? 20080723061115P</guid></item><item><title>New Post: Any plans to add 'Copy Object' support?</title><link>http://www.codeplex.com/ThreeSharp/Thread/View.aspx?ThreadId=28657</link><description>&lt;div style="line-height: normal;"&gt;Hello,
Any suggestions and corrections are welcome.
ObjectCopyRequest.cs
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
using System;
using System.IO;
using System.Xml.Serialization;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
namespace Affirma.ThreeSharp.Model
{
public class ObjectCopyRequest : Request
{
public ObjectCopyRequest(String bucketName, String sourceKey, String destinationKey)
{
this.Method = &amp;quot;PUT&amp;quot;;
this.BucketName = bucketName;
this.Key = destinationKey;
this.headers.Add(&amp;quot;x-amz-copy-source&amp;quot;, bucketName + &amp;quot;/&amp;quot; + sourceKey);
}
}
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ObjectCopyResponse.cs
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
using System;
using System.Collections.Generic;
using System.Text;
namespace Affirma.ThreeSharp.Model
{
public class ObjectCopyResponse : Response
{
}
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
add the following code to ThreeSharpQuery.cs
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public ObjectCopyResponse ObjectCopy(ObjectCopyRequest request)
{
return Invoke&amp;lt;ObjectCopyResponse&amp;gt;(request);
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
&lt;/div&gt;</description><author>palmut</author><pubDate>Tue, 08 Jul 2008 19:33:48 GMT</pubDate><guid isPermaLink="false">New Post: Any plans to add 'Copy Object' support? 20080708073348P</guid></item><item><title>Created Issue: Add support for Copy</title><link>http://www.codeplex.com/ThreeSharp/WorkItem/View.aspx?WorkItemId=10444</link><description>Amazon S3 has released a beta version of Copy functionality.&lt;br /&gt;</description><author>cno</author><pubDate>Tue, 08 Jul 2008 16:35:16 GMT</pubDate><guid isPermaLink="false">Created Issue: Add support for Copy 20080708043516P</guid></item><item><title>CREATED RELEASE: Version 1.4</title><link>http://www.codeplex.com/ThreeSharp/Release/ProjectReleases.aspx?ReleaseId=15129</link><description>&lt;div&gt;
Maintenance update for the library.&lt;br&gt;
&lt;/div&gt;</description><author></author><pubDate>Tue, 08 Jul 2008 15:49:49 GMT</pubDate><guid isPermaLink="false">CREATED RELEASE: Version 1.4 20080708034949P</guid></item><item><title>Commented Issue: String encoding in Response.cs/Request.cs</title><link>http://www.codeplex.com/ThreeSharp/WorkItem/View.aspx?WorkItemId=9096</link><description>Hi,&lt;br /&gt;&lt;br /&gt;If you save international characters with your LoadStreamWithString method, you&amp;#39;ll loose the non-ASCII characters...&lt;br /&gt;&lt;br /&gt;As far as I could see in .Net documentation, strings are Unicode characters. I think it would be better to encode them using the System.Text.Encoding.Unicode encoder instead.&lt;br /&gt;&lt;br /&gt;I&amp;#39;ve tried it and it works well with those Danish characters I use... I applied the unicode encoder to Request.cs &amp;#40;LoadStreamWithFile&amp;#41; and Response.cs &amp;#40;StreamResponseToString&amp;#41;. And I could easily read the characters after woods...&lt;br /&gt; - I&amp;#39;ve also downloaded the object using cockpit and my Linux box and read it using gedit so the unicode encoding should work... &amp;#58;&amp;#41;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#47;&amp;#47;Regards Jonas F. Jensen&lt;br /&gt;Comments: ** Comment from web user: cno ** &lt;p&gt;Here&amp;#39;s a related thread on the S3 forums&amp;#58; http&amp;#58;&amp;#47;&amp;#47;developer.amazonwebservices.com&amp;#47;connect&amp;#47;thread.jspa&amp;#63;messageID&amp;#61;94161&amp;#38;&amp;#35;94161 &lt;/p&gt;</description><author>cno</author><pubDate>Tue, 08 Jul 2008 15:47:06 GMT</pubDate><guid isPermaLink="false">Commented Issue: String encoding in Response.cs/Request.cs 20080708034706P</guid></item><item><title>New Post: Check successful upload with MD5 checksum.</title><link>http://www.codeplex.com/ThreeSharp/Thread/View.aspx?ThreadId=22748</link><description>&lt;div style="line-height: normal;"&gt;The &amp;quot;correct&amp;quot; way to handle this is to include a &amp;quot;Content-MD5&amp;quot; header on the PUT request (the original upload). With this in place then Amazon will return an error if the uploaded content's MD5&amp;nbsp;does not match the Content-MD5 value.&lt;br&gt;
&lt;br&gt;
Sort of:&lt;br&gt;
string md5 = MD5ChecksumBase64(Filename);&lt;br&gt;
Request.Headers.Add(&amp;quot;Content-MD5&amp;quot;, md5);&lt;br&gt;
&lt;br&gt;
and...&lt;br&gt;
&lt;p&gt;static string MD5ChecksumBase64(string Filename)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Need to use the MD5 crypto algorithm&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; using (MD5 md5 = new MD5CryptoServiceProvider())&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Use a filestream with a big (32K) buffer size&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (FileStream fs = new FileStream(Filename, FileMode.Open, FileAccess.Read, FileShare.Read, 32768))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Compute the hash of the entire file&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] HashValue = md5.ComputeHash(fs);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Return the value&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return System.Convert.ToBase64String(HashValue);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;/p&gt;
&lt;/div&gt;</description><author>rmacfadyen</author><pubDate>Sat, 05 Jul 2008 17:54:15 GMT</pubDate><guid isPermaLink="false">New Post: Check successful upload with MD5 checksum. 20080705055415P</guid></item><item><title>New Post: ThrowIfErrors... regex is incorrect?</title><link>http://www.codeplex.com/ThreeSharp/Thread/View.aspx?ThreadId=30920</link><description>&lt;div style="line-height: normal;"&gt;Hi,&lt;br&gt;
&lt;br&gt;
I think the ThrowIfErrors regex&amp;nbsp;may be&amp;nbsp;incorrect. I was testing adding Content-MD5 to PUT requests and was getting an exception &amp;quot;The remote server returned an error: (400) Bad Request&amp;quot;. During debugging I could see the XML error for bad MD5... but this was not being handled by the ThrowIfError logic. Here's a bad MD5 error:&lt;br&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br&gt;
&amp;lt;Error&amp;gt;&lt;br&gt;
&amp;lt;Code&amp;gt;InvalidDigest&amp;lt;/Code&amp;gt;&lt;br&gt;
&amp;lt;Message&amp;gt;The Content-MD5 you specified was an invalid.&amp;lt;/Message&amp;gt;&lt;br&gt;
&amp;lt;RequestId&amp;gt;xxx&amp;lt;/RequestId&amp;gt;&lt;br&gt;
&amp;lt;Content-MD5&amp;gt;qT6fm08+4TRQ62mX8IkC1Q==a&amp;lt;/Content-MD5&amp;gt;&lt;br&gt;
&amp;lt;HostId&amp;gt;xxx&amp;lt;/HostId&amp;gt;&lt;br&gt;
&amp;lt;/Error&amp;gt;&lt;br&gt;
&lt;br&gt;
Here's the guts of ThrowIfError:&lt;br&gt;
Match errorMatcher = Regex.Match(responseString, &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;(&amp;lt;Error&amp;gt;&amp;lt;Code&amp;gt;(.*)&amp;lt;/Code&amp;gt;&amp;lt;Message&amp;gt;(.*)&amp;lt;/Message&amp;gt;&amp;lt;/Error&amp;gt;).*(&amp;lt;Error&amp;gt;)?&amp;quot;);&lt;br&gt;
if (errorMatcher.Success)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; String xml = errorMatcher.Groups[2].Value;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; String code = errorMatcher.Groups[3].Value;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; String message = errorMatcher.Groups[4].Value;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ThreeSharpException ex = new ThreeSharpException(message, httpWebResponse.StatusCode, code, null, xml);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; throw ex;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
If I read the regex right it looks like an error &amp;quot;ends&amp;quot; in &amp;quot;&amp;lt;/Message&amp;gt;&amp;lt;/Error&amp;gt;&amp;quot;... but that clearly isn't always the case.&lt;br&gt;
&lt;br&gt;
Adjusting the code to:&lt;br&gt;
Match errorMatcher = Regex.Match(responseString,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;(&amp;lt;Error&amp;gt;&amp;lt;Code&amp;gt;(.*)&amp;lt;/Code&amp;gt;&amp;lt;Message&amp;gt;(.*)&amp;lt;/Message&amp;gt;).*(&amp;lt;/Error&amp;gt;)?&amp;quot;);&lt;br&gt;
if (errorMatcher.Success)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; String xml = errorMatcher.Groups[0].Value;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; String code = errorMatcher.Groups[2].Value;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; String message = errorMatcher.Groups[3].Value;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ThreeSharpException ex = new ThreeSharpException(message, httpWebResponse.StatusCode, code, null, xml);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; throw ex;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
This now appears to handle errors correctly. It no longer matches on &amp;quot;&amp;lt;/Message&amp;gt;&amp;lt;/Error&amp;gt;&amp;quot;... just &amp;quot;&amp;lt;/Message&amp;gt;&amp;quot;. &lt;br&gt;
&lt;br&gt;
Also the match Groups didn't seem to be correct... not sure if that's because of my changes or not (I don't think so... but I really haven't done any before/after testing of my change).&lt;br&gt;
&lt;br&gt;
Regards,&lt;br&gt;
&lt;br&gt;
Rob
&lt;/div&gt;</description><author>rmacfadyen</author><pubDate>Sat, 05 Jul 2008 16:17:24 GMT</pubDate><guid isPermaLink="false">New Post: ThrowIfErrors... regex is incorrect? 20080705041724P</guid></item><item><title>New Post: Transport forcibly closed when trying to upload</title><link>http://www.codeplex.com/ThreeSharp/Thread/View.aspx?ThreadId=27986</link><description>&lt;div style="line-height: normal;"&gt;Just to update this thread: this afternoon we got another &amp;quot;Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host.&amp;quot; error during beta testing at one of our sites.&amp;nbsp; Of the four uploads of large files that were done today at two different test sites, three went through without error and one produced this &amp;quot;forcibly closed&amp;quot; error.&amp;nbsp; So, clearly, the problem is still there for us.&lt;br&gt;
&lt;br&gt;
Since I haven't received any love from the Amazon guys on my cross-post over in the S3 forums, I think I'm going to sign up for one of their formal support plans (&amp;quot;Silver&amp;quot; or &amp;quot;Gold&amp;quot;) at this point and see what sort of troubleshooting advice I can get.&amp;nbsp; I would still love to get any advice from ThreeSharp-centric people about what would cause this to occur periodically, but in the meantime I'll see if Amazon can help.&lt;br&gt;
&lt;br&gt;
--John&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;</description><author>johnlu_78759</author><pubDate>Thu, 26 Jun 2008 18:50:52 GMT</pubDate><guid isPermaLink="false">New Post: Transport forcibly closed when trying to upload 20080626065052P</guid></item></channel></rss>