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); } }); }
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); } }
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); } })); }