Пример #1
0
        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);
            }
        }
Пример #2
0
        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
                    }
                }
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
 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);
 }
Пример #5
0
        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);
            }
        }