Example #1
0
        public Task <QQHttpResponse> ExecuteHttpRequestAsync(QQHttpRequest request, IQQHttpListener listener, CancellationToken token)
        {
            try
            {
#if DEBUG
                if (request.RawUrl == QQConstants.URL_ROBOT_TULING)
                {
                    //var str = httpItem.GetRequestHeader();
                    //var count = str.Length;
                }
#endif
                var httpRequest = GetHttpRequest(request);
                var result1     = _httpClient.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead, token);
                result1.Wait();
                var result = result1.Result;
#if DEBUG
                if (request.RawUrl == QQConstants.URL_ROBOT_TULING)
                {
                    var str   = request.GetRequestHeader(_cc);
                    var count = str.Length;
                }
#endif
                if (!result.IsSuccessStatusCode)
                {
                    throw new QQException(QQErrorCode.ErrorHttpStatus, result.StatusCode.ToString());
                }

                var response = new QQHttpResponse
                {
                    ResponseMessage = result.ReasonPhrase,
                    ResponseCode    = (int)result.StatusCode,
                    Headers         = new Dictionary <string, List <string> >(),
                    ResultType      = request.ResultType,
                };

                switch (request.ResultType)
                {
                case ResponseResultType.String:
                {
                    var r = result.Content.ReadAsStringAsync();
                    r.Wait();
                    response.ResponseString = r.Result;         // await result.Content.ReadAsStringAsync().ConfigureAwait(false);
                    break;
                }

                case ResponseResultType.Byte:
                {
                    var r = result.Content.ReadAsByteArrayAsync();
                    r.Wait();
                    response.ResponseBytes = r.Result;        // await result.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
                    break;
                }

                case ResponseResultType.Stream:
                {
                    var r = result.Content.ReadAsByteArrayAsync();
                    r.Wait();
                    response.ResponseStream = new MemoryStream(r.Result);        //await result.Content.ReadAsByteArrayAsync().ConfigureAwait(false)
                    break;
                }
                }

                foreach (var header in result.Headers)
                {
                    response.Headers[header.Key] = header.Value.ToList();
                }
                foreach (var header in result.Content.Headers)
                {
                    response.Headers[header.Key] = header.Value.ToList();
                }

                if (result.Headers.Location != null)
                {
                    request.Url = result.Headers.Location.AbsoluteUri;
                    //return ExecuteHttpRequest(request, listener);
                    var task = Task.Factory.StartNew(() => { return(response); });
                    return(task);
                }
                else
                {
                    listener.OnHttpHeader(response);
                    listener.OnHttpRead(0, response.GetContentLength());
                    listener.OnHttpFinish(response);

                    var task = Task.Factory.StartNew(() => { return(response); });

                    return(task);
                }
            }
            catch (Exception ex)
            {
                var qqEx = ex as QQException ?? new QQException(ex);
                // throw qqEx;              // 不抛出,而是交给listener处理
                listener.OnHttpError(qqEx); // 这个listener负责推送一个类型为ON_HTTP_ERROR的actor到线程池,这个actor会执行action的OnHttpError方法
                return(null);
            }
        }
Example #2
0
        public Task<QQHttpResponse> ExecuteHttpRequest(QQHttpRequest request, IQQHttpListener listener)
        {
            return Task.Run(() =>
            {
                try
                {
                    var httpItem = new HttpItem()
                    {
                        KeepAlive = true,
                        ProtocolVersion = HttpVersion.Version10,
                        ContentType = "application/x-www-form-urlencoded; charset=UTF-8", // post方法的时候必须填写,要不然服务器无法解析
                        Encoding = Encoding.UTF8,
                        Allowautoredirect = true,
                        Method = request.Method,
                        URL = request.Url,
                        ReadWriteTimeout = (request.ReadTimeout > 0) ? request.ReadTimeout : 100000,
                        Timeout = (request.ConnectTimeout > 0) ? request.ConnectTimeout : 30000,
                        ResultType = ResultType.Byte,
                    };

                    if (request.HeaderMap.ContainsKey("User-Agent"))
                    {
                        httpItem.UserAgent = request.HeaderMap["User-Agent"];
                        request.HeaderMap.Remove("User-Agent");
                    }
                    if (request.HeaderMap.ContainsKey("Referer"))
                    {
                        httpItem.Referer = request.HeaderMap["Referer"];
                        request.HeaderMap.Remove("Referer");
                    }

                    foreach (var header in request.HeaderMap)
                    {
                        httpItem.Header.Add(header.Key, header.Value);
                    }
                    httpItem.CookieContainer = _cookieContainer;

                    if (request.Method.Equals("POST"))
                    {
                        if (request.FileMap.Count > 0)
                        {
                            httpItem.PostDataType = PostDataType.FilePath;
                            httpItem.Postdata = "";
                        }
                        else if (request.PostMap.Count > 0)
                        {
                            httpItem.PostDataType = PostDataType.String;
                            httpItem.Postdata = request.InputString;
                        }
                    }
                    else if (request.Method.Equals("GET"))
                    {

                    }
                    else
                    {
                        throw new QQException(QQErrorCode.IO_ERROR, "not support http method:" + request.Method);
                    }

                    HttpResult result = new HttpHelper().GetHtml(httpItem);
                    QQHttpResponse response = new QQHttpResponse()
                    {
                        ResponseMessage = result.StatusDescription,
                        ResponseCode = (int)result.StatusCode,
                        ResponseData = result.ResultByte,
                        Headers = new Dictionary<string, List<string>>(),
                    };
                    if (result.Header != null)
                    {
                        foreach (string header in result.Header)
                        {
                            response.Headers.Add(header, result.Header[header]);
                        }
                    }
                    if (result.CookieCollection != null)
                    {
                        _cookieContainer.Add(result.CookieCollection);
                    }

                    if (listener != null)
                    {
                        listener.OnHttpHeader(response);
                        listener.OnHttpRead(0, response.GetContentLength());
                        listener.OnHttpFinish(response);
                    }
                    return response;
                }
                catch (IOException e)
                {
                    throw new QQException(QQErrorCode.IO_ERROR, e);
                }
                catch (Exception e)
                {
                    throw new QQException(QQErrorCode.UNKNOWN_ERROR, e);
                }
            });
        }
Example #3
0
 public QQHttpResponse ExecuteHttpRequest(QQHttpRequest qqRequest, IQQHttpListener listener)
 {
     throw new NotSupportedException();
 }
Example #4
0
        public Task <QQHttpResponse> ExecuteHttpRequest(QQHttpRequest request, IQQHttpListener listener)
        {
            return(Task.Run(() =>
            {
                try
                {
                    var httpItem = new HttpItem()
                    {
                        KeepAlive = true,
                        ProtocolVersion = HttpVersion.Version10,
                        ContentType = "application/x-www-form-urlencoded; charset=UTF-8", // post方法的时候必须填写,要不然服务器无法解析
                        Encoding = Encoding.UTF8,
                        Allowautoredirect = true,
                        Method = request.Method,
                        URL = request.Url,
                        ReadWriteTimeout = (request.ReadTimeout > 0) ? request.ReadTimeout : 100000,
                        Timeout = (request.ConnectTimeout > 0) ? request.ConnectTimeout : 30000,
                        ResultType = ResultType.Byte,
                    };

                    if (request.HeaderMap.ContainsKey("User-Agent"))
                    {
                        httpItem.UserAgent = request.HeaderMap["User-Agent"];
                        request.HeaderMap.Remove("User-Agent");
                    }
                    if (request.HeaderMap.ContainsKey("Referer"))
                    {
                        httpItem.Referer = request.HeaderMap["Referer"];
                        request.HeaderMap.Remove("Referer");
                    }

                    foreach (var header in request.HeaderMap)
                    {
                        httpItem.Header.Add(header.Key, header.Value);
                    }
                    httpItem.CookieContainer = _cookieContainer;

                    if (request.Method.Equals("POST"))
                    {
                        if (request.FileMap.Count > 0)
                        {
                            httpItem.PostDataType = PostDataType.FilePath;
                            httpItem.Postdata = "";
                        }
                        else if (request.PostMap.Count > 0)
                        {
                            httpItem.PostDataType = PostDataType.String;
                            httpItem.Postdata = request.InputString;
                        }
                    }
                    else if (request.Method.Equals("GET"))
                    {
                    }
                    else
                    {
                        throw new QQException(QQErrorCode.IO_ERROR, "not support http method:" + request.Method);
                    }

                    HttpResult result = new HttpHelper().GetHtml(httpItem);
                    QQHttpResponse response = new QQHttpResponse()
                    {
                        ResponseMessage = result.StatusDescription,
                        ResponseCode = (int)result.StatusCode,
                        ResponseData = result.ResultByte,
                        Headers = new Dictionary <string, List <string> >(),
                    };
                    if (result.Header != null)
                    {
                        foreach (string header in result.Header)
                        {
                            response.Headers.Add(header, result.Header[header]);
                        }
                    }
                    if (result.CookieCollection != null)
                    {
                        _cookieContainer.Add(result.CookieCollection);
                    }

                    if (listener != null)
                    {
                        listener.OnHttpHeader(response);
                        listener.OnHttpRead(0, response.GetContentLength());
                        listener.OnHttpFinish(response);
                    }
                    return response;
                }
                catch (IOException e)
                {
                    throw new QQException(QQErrorCode.IO_ERROR, e);
                }
                catch (Exception e)
                {
                    throw new QQException(QQErrorCode.UNKNOWN_ERROR, e);
                }
            }));
        }