static void ProcessReadResponse(IAsyncResult result, HttpAsyncContext context) { int count = context.Stream.EndRead(result); context.Offset += count; if (count == 0) { int resultId; // ignore BOM if present int startIndex = (context.Offset >= 3 && context.Buffer[0] == 0xEF && context.Buffer[1] == 0xBB && context.Buffer[2] == 0xBF) ? 3 : 0; if (int.TryParse(Encoding.UTF8.GetString(context.Buffer, startIndex, context.Offset - startIndex), out resultId)) { context.Response.Close(); context.ResultId = resultId; context.OnSuccess(); } else { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "{0}. Server response is malformed.", context.ExceptionMessagePrefix)); } } else if (context.Offset == context.Buffer.Length) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "{0}. Server response exceedes the expected size.", context.ExceptionMessagePrefix)); } else { context.Stream.BeginRead(context.Buffer, context.Offset, context.Buffer.Length - context.Offset, PubsubClient.ContinueHttpRequest, context); } }
static void ContinueHttpRequest(IAsyncResult result) { HttpAsyncContext context = (HttpAsyncContext)result.AsyncState; try { context.Processor(result, context); } catch (Exception e) { if (context != null) { if (context.Stream != null) { context.Stream.Close(); } if (context.Response != null) { context.Response.Close(); } context.Exception = e; try { context.OnError(); } catch (Exception) { // empty } } } }
static void ProcessPublishWriteRequest(IAsyncResult result, HttpAsyncContext context) { PublishHttpAsyncContext publishContext = (PublishHttpAsyncContext)context; context.Stream.EndWrite(result); context.Processor = PubsubClient.ProcessPublishReadRequest; publishContext.Message.Body.BeginRead(context.Buffer, 0, context.Buffer.Length, PubsubClient.ContinueHttpRequest, context); }
static void ProcessGetResponse(IAsyncResult result, HttpAsyncContext context) { context.Response = (HttpWebResponse)context.Request.EndGetResponse(result); if (context.Response.StatusCode != HttpStatusCode.OK) { throw new InvalidOperationException( string.Format(CultureInfo.InvariantCulture, "{0}. Server returned status code {1}: {2}.", context.ExceptionMessagePrefix, context.Response.StatusCode, context.Response.StatusDescription)); } context.Stream = context.Response.GetResponseStream(); context.Processor = PubsubClient.ProcessReadResponse; context.Stream.BeginRead(context.Buffer, 0, context.Buffer.Length, PubsubClient.ContinueHttpRequest, context); }
static void ProcessPublishReadRequest(IAsyncResult result, HttpAsyncContext context) { PublishHttpAsyncContext publishContext = (PublishHttpAsyncContext)context; int count = publishContext.Message.Body.EndRead(result); if (count == 0) { context.Stream.Close(); context.Processor = PubsubClient.ProcessGetResponse; context.Request.BeginGetResponse(PubsubClient.ContinueHttpRequest, context); } else { context.Processor = PubsubClient.ProcessPublishWriteRequest; context.Stream.BeginWrite(context.Buffer, 0, count, PubsubClient.ContinueHttpRequest, context); } }