void GotResponse (IAsyncResult result)
{
HttpChannelRequestAsyncResult channelResult = (HttpChannelRequestAsyncResult) result.AsyncState;
channelResult.CompletedSynchronously &= result.CompletedSynchronously;
WebResponse res;
Stream resstr;
try {
res = channelResult.WebRequest.EndGetResponse (result);
resstr = res.GetResponseStream ();
} catch (WebException we) {
res = we.Response;
if (res == null) {
channelResult.Complete (we);
return;
}
try {
// The response might contain SOAP fault. It might not.
resstr = res.GetResponseStream ();
} catch (WebException we2) {
channelResult.Complete (we2);
return;
}
}
var hrr = (HttpWebResponse) res;
if ((int) hrr.StatusCode >= 400 && (int) hrr.StatusCode < 500) {
channelResult.Complete (new WebException (String.Format ("There was an error on processing web request: Status code {0}({1}): {2}", (int) hrr.StatusCode, hrr.StatusCode, hrr.StatusDescription)));
}
try {
Message ret;
// TODO: unit test to make sure an empty response never throws
// an exception at this level
if (hrr.ContentLength == 0) {
ret = Message.CreateMessage (MessageVersion.Default, String.Empty);
} else {
using (var responseStream = resstr) {
MemoryStream ms = new MemoryStream ();
byte [] b = new byte [65536];
int n = 0;
while (true) {
n = responseStream.Read (b, 0, 65536);
if (n == 0)
break;
ms.Write (b, 0, n);
}
ms.Seek (0, SeekOrigin.Begin);
ret = Encoder.ReadMessage (
ms, (int) source.Transport.MaxReceivedMessageSize, res.ContentType);
}
}
var rp = new HttpResponseMessageProperty () { StatusCode = hrr.StatusCode, StatusDescription = hrr.StatusDescription };
#if MOONLIGHT
if (hrr.SupportsHeaders) {
foreach (string key in hrr.Headers)
rp.Headers [key] = hrr.Headers [key];
}
#else
foreach (var key in hrr.Headers.AllKeys)
rp.Headers [key] = hrr.Headers [key];
#endif
ret.Properties.Add (HttpResponseMessageProperty.Name, rp);
channelResult.Response = ret;
channelResult.Complete ();
} catch (Exception ex) {
channelResult.Complete (ex);
} finally {
res.Close ();
}
}