public virtual async Task <ActionEvent> ExecuteAsync(CancellationToken token)
        {
            HttpRequestItem requestItem = null;

            if (!token.IsCancellationRequested)
            {
                ++ExcuteTimes;
                try
                {
                    requestItem = BuildRequest();
                    var response = await HttpService.ExecuteHttpRequestAsync(requestItem, token).ConfigureAwait(false);

                    return(await HandleResponse(response).ConfigureAwait(false));
                }
                catch (TaskCanceledException) { }
                catch (OperationCanceledException) { }
                catch (Exception ex)
                {
                    ex = ex.InnerException ?? ex;
#if DEBUG
                    // 此处用于生成请求信息,然后用fiddler等工具测试
                    if (requestItem != null)
                    {
                        var url    = requestItem.RawUrl;
                        var header = requestItem.GetRequestHeader(HttpService.GetCookies(requestItem.RawUrl));
                        var data   = requestItem.RawData;
                        var len    = data.Length;
                    }
#endif
                    return(await HandleExceptionAsync(ex).ConfigureAwait(false));
                }
            }
            return(await NotifyActionEventAsync(ActionEvent.CreateEvent(ActionEventType.EvtCanceled, this)).ConfigureAwait(false));
        }
        public async Task <HttpResponseMessage> ExecuteAsync(HttpRequestItem httpRequestItem)
        {
            HttpRequestMessage httpRequest = new HttpRequestMessage()
            {
                RequestUri = new Uri(httpRequestItem.URL),
                Method     = httpRequestItem.HttpMethod,
                Content    = httpRequestItem.HttpContent
            };

            httpRequest.Headers.Add("Authorization", httpRequestItem.AuthzHeader);

            if (httpRequestItem.IsDataRequest)
            {
                httpRequest.Headers.Add("X-Api-Version", "1");
                httpRequest.Headers.Add("Accept", "application/json");
            }

            //if (httpRequestItem.IsFileUpload)
            //{
            //    httpRequest.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data");
            //}

            HttpResponseMessage httpResponse =
                await _client.SendAsync(httpRequest, HttpCompletionOption.ResponseContentRead);

            return(httpResponse);
        }
示例#3
0
        public async Task GetAccessTokenAsync(string verifier)
        {
            string authzHeader = _authorizationHeader.CreateForAccess(Config.ConsumerKey, Config.ConsumerSecret, Config.Token, Config.TokenSecret, verifier);

            var httpRequestItem = new HttpRequestItem
            {
                URL           = Consts.AccessToken,
                HttpMethod    = System.Net.Http.HttpMethod.Get,
                AuthzHeader   = authzHeader,
                HttpContent   = null,
                IsDataRequest = false
            };

            var response = await _httpRequestHandler.ExecuteAsync(httpRequestItem).ConfigureAwait(false);

            var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            if (!response.IsSuccessStatusCode)
            {
                throw new ServerException((int)response.StatusCode, result);
            }

            string[] kvpairs = result.Split('&');
            System.Collections.Generic.Dictionary <string, string> parameters = System.Linq.Enumerable.ToDictionary(System.Linq.Enumerable.Select(kvpairs, pair => pair.Split('=')), kv => kv[0], kv => kv[1]);

            string oauth_error_message;

            if (parameters.TryGetValue("oauth_error_message", out oauth_error_message))
            {
                throw new ServerException(oauth_error_message);
            }

            Config.Token       = parameters["oauth_token"];
            Config.TokenSecret = parameters["oauth_token_secret"];
        }
示例#4
0
        private static HttpRequestMessage GetHttpRequest(HttpRequestItem item)
        {
            var request = new HttpRequestMessage(new HttpMethod(item.Method.ToString()), item.GetUrl());

            switch (item.Method)
            {
            case HttpMethodType.Post:
            case HttpMethodType.Put:
            case HttpMethodType.Delete:
            case HttpMethodType.Head:
            case HttpMethodType.Options:
            case HttpMethodType.Trace:
                request.Content = new StringContent(item.RawData, item.EncodingType, item.ContentType);
                break;

            case HttpMethodType.Get:
            default:
                break;
            }
            foreach (var header in item.HeaderMap.Where(h => !NotAddHeaderNames.Contains(h.Key)))
            {
                request.Headers.Add(header.Key, header.Value);
            }
            return(request);
        }
示例#5
0
 protected override void ModifyRequest(HttpRequestItem req)
 {
     req.AddQueryValue("tuin", _friend.Uin);
     req.AddQueryValue("vfwebqq", Session.Vfwebqq);
     req.AddQueryValue("t", Timestamp);
     req.Referrer = ApiUrls.ReferrerS;
 }
示例#6
0
        private HttpRequestMessage GetHttpRequest(HttpRequestItem item)
        {
            var request = new HttpRequestMessage(new HttpMethod(item.Method.ToString().ToUpper()), item.GetUrl());

            switch (item.Method)
            {
            case HttpMethodType.Post:
            case HttpMethodType.Put:
            case HttpMethodType.Delete:
            case HttpMethodType.Head:
            case HttpMethodType.Options:
            case HttpMethodType.Trace:
                request.Content = new StringContent(item.RawData, item.EncodingType, item.ContentType);
                break;

            case HttpMethodType.Get:
            default:
                break;
            }
            foreach (var header in item.HeaderMap.Where(h => !NotAddHeaderNames.Contains(h.Key)))
            {
                request.Headers.Add(header.Key, header.Value);
            }
            var cookies = item.HeaderMap.GetOrDefault(HttpConstants.Cookie);

            if (!cookies.IsNullOrEmpty())
            {
                _cookieContainer.SetCookies(request.RequestUri, cookies);
            }
            return(request);
        }
        /// <summary>
        /// Processes the specified request.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="processRequestHandler"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task <HttpResponseMessage> ProcessRequestAsync(HttpRequestMessage request, Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > processRequestHandler, CancellationToken cancellationToken)
        {
            if (RejectAllRequests())
            {
                // request cannot be queued or processed at this time,
                return(RejectRequest(request));
            }

            if (_requestQueue != null)
            {
                // enqueue the workitem
                var item = new HttpRequestItem
                {
                    Request = request,
                    ProcessRequestHandler = processRequestHandler,
                    CancellationToken     = cancellationToken,
                    CompletionSource      = new TaskCompletionSource <HttpResponseMessage>()
                };
                if (_requestQueue.Post(item))
                {
                    return(await item.CompletionSource.Task);
                }
                else
                {
                    TraceWriter.Info($"Http request queue limit of {Config.MaxOutstandingRequests} has been exceeded.");
                    return(RejectRequest(request));
                }
            }
            else
            {
                // queue is not enabled, so just dispatch the request directly
                return(await processRequestHandler(request, cancellationToken));
            }
        }
示例#8
0
        protected override HttpRequestItem BuildRequest()
        {
            var url = Session.SyncUrl;

            if (Session.SyncUrl == null)
            {
                var host = ApiUrls.SyncHosts[_hostIndex];
                url = $"https://{host}/cgi-bin/mmwebwx-bin/synccheck";
                Logger.LogDebug($"测试站点{_hostIndex + 1}: {host}");
            }
            else
            {
                Logger.LogInformation("Begin SyncCheck...");
            }
            var req = new HttpRequestItem(HttpMethodType.Get, url)
            {
                // 此处需要将key都变成小写,否则提交会失败
                StringData = Session.BaseRequest.ToDictionary(pair => pair.Key.ToLower(), pair => pair.Value).ToQueryString(),
            };

            req.AddQueryValue("r", Timestamp);
            req.AddQueryValue("synckey", Session.SyncKeyStr);
            req.AddQueryValue("_", Session.Seq++);

            return(req);
        }
示例#9
0
        protected override void ModifyRequest(HttpRequestItem req)
        {
            var qrsig = HttpService.GetCookie("qrsig", ApiUrls.CheckQRCode).Value;

            req.AddData("ptqrtoken", QQEncryptor.GetPtqrtoken(qrsig));
            req.AddData("webqq_type", "10");
            req.AddData("remember_uin", "1");
            req.AddData("login2qq", "1");
            req.AddData("aid", "501004106");
            req.AddData("u1", "http://w.qq.com/proxy.html?login2qq=1&webqq_type=10");
            req.AddData("ptredirect", "0");
            req.AddData("ptlang", "2052");
            req.AddData("daid", "164");
            req.AddData("from_ui", "1");
            req.AddData("pttype", "1");
            req.AddData("dumy", "");
            req.AddData("fp", "loginerroralert");
            req.AddData("action", "0-0-10194");
            req.AddData("mibao_css", "m_webqq");
            req.AddData("t", "1");
            req.AddData("g", "1");
            req.AddData("js_type", "0");
            req.AddData("js_ver", JsVer);
            req.AddData("login_sig", "");
            req.AddData("pt_randsalt", "0");
        }
示例#10
0
        public override HttpRequestItem BuildRequest()
        {
            var req = new HttpRequestItem(HttpMethodType.Get, ApiUrls.CheckQRCode);

            req.AddQueryValue("webqq_type", "10");
            req.AddQueryValue("remember_uin", "1");
            req.AddQueryValue("login2qq", "1");
            req.AddQueryValue("aid", "501004106");
            req.AddQueryValue("u1", "http://w.qq.com/proxy.html?login2qq=1&webqq_type=10");
            req.AddQueryValue("ptredirect", "0");
            req.AddQueryValue("ptlang", "2052");
            req.AddQueryValue("daid", "164");
            req.AddQueryValue("from_ui", "1");
            req.AddQueryValue("pttype", "1");
            req.AddQueryValue("dumy", "");
            req.AddQueryValue("fp", "loginerroralert");
            req.AddQueryValue("action", "0-0-205298");
            req.AddQueryValue("mibao_css", "m_webqq");
            req.AddQueryValue("t", "1");
            req.AddQueryValue("g", "1");
            req.AddQueryValue("js_type", "0");
            req.AddQueryValue("js_ver", JsVer);
            req.AddQueryValue("login_sig", "");
            req.AddQueryValue("pt_randsalt", "0");
            return(req);
        }
示例#11
0
        public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
        {
            bool   flag  = false;
            string uid   = request.QueryString.Get("uid");
            string token = request.QueryString.Get("token");

            if (string.IsNullOrWhiteSpace(uid))
            {
                return(flag);
            }
            //token 验证
            if (!string.IsNullOrWhiteSpace(token) && Tool.MD5Check(uid, token))
            {
                flag = true;
            }
            else
            {
                //接口验证
                HttpRequestItem req = new HttpRequestItem()
                {
                    URL      = Constant.AuthenUrl,
                    Postdata = string.Format("uid={0}", uid)
                };
                string resData = HttpHelp.SendHttpRequest(req);
                if (!string.IsNullOrWhiteSpace(resData))
                {
                    HttpResponseItem res = JsonUtil <HttpResponseItem> .Deserialize(resData);

                    flag = res.AckCode == ResultAckCodeEnum.Success && res.ResultCode == 1;
                }
            }

            return(flag ? base.AuthorizeHubConnection(hubDescriptor, request) : false);
        }
示例#12
0
 protected override void ModifyRequest(HttpRequestItem req)
 {
     req.AddData("gcode", _group.Code);
     req.AddData("vfwebqq", Session.Vfwebqq);
     req.AddData("t", Timestamp);
     req.Referrer = ApiUrls.ReferrerS;
 }
示例#13
0
        public async Task <HttpResponseMessage> RequestAsync(HttpRequestItem httpRequestItem)
        {
            _client.DefaultRequestHeaders.Authorization = httpRequestItem.AuthHeaderValue;

            HttpRequestMessage httpRequest = new HttpRequestMessage()
            {
                RequestUri = new Uri(httpRequestItem.Url),
                Method     = httpRequestItem.HttpMethod,
                Content    = httpRequestItem.HttpContent
            };

            if (httpRequestItem.Headers != null)
            {
                foreach (var header in httpRequestItem.Headers)
                {
                    httpRequest.Headers.Add(header.Item1, header.Item2);
                }
            }

            if (httpRequestItem.IfUnmodifiedSinceHeader != DateTime.MinValue)
            {
                httpRequest.Headers.IfUnmodifiedSince = httpRequestItem.IfUnmodifiedSinceHeader;
            }

            HttpResponseMessage httpResponseMessage = await _client.SendAsync(httpRequest);

            return(httpResponseMessage);
        }
        public async Task <bool> MoveFileAsync(string fileId, string newParentFolderId, string newFileName, bool overwriteFileWithTheSameName)
        {
            bool result = false;

            fileId = NormalizeId(fileId);
            string targetFileId = NormalizeId(string.Format("{0}/{1}", newParentFolderId, newFileName));

            if (fileId != null && targetFileId != null)
            {
                fileId = fileId.Replace("/copy", "/files");

                string url = string.Format("{0}{1}?path={2}&overwrite={3}", URL.RESTRoot, fileId, targetFileId, overwriteFileWithTheSameName.ToLowerString());

                HttpRequestItem httpRequestItem = CreateHttpRequestItem(url, HttpMethod.Put);

                HttpResponseMessage httpResponseMessage = await _httpRequestHandler.ExecuteAsync(httpRequestItem);

                if (httpResponseMessage.IsSuccessStatusCode)
                {
                    result = true;
                }
            }

            return(result);
        }
示例#15
0
        public async Task UpdateUserAsync(UserUpdate userUpdate)
        {
            string url = string.Format("{0}/{1}", URL.RESTRoot, "user");

            string authzHeader = AuthorizationHeader.CreateForREST(Config.ConsumerKey, Config.ConsumerSecret, AuthToken.Token, AuthToken.TokenSecret, url, "PUT");

            string serializeObject = JsonConvert.SerializeObject(userUpdate);

            HttpContent httpContent = new StringContent(serializeObject);

            HttpRequestItem httpRequestItem = new HttpRequestItem()
            {
                URL           = url,
                HttpMethod    = HttpMethod.Put,
                AuthzHeader   = authzHeader,
                HttpContent   = httpContent,
                IsDataRequest = true
            };

            HttpRequestHandler httpRequestHandler = new HttpRequestHandler();
            string             executeAsync       = await httpRequestHandler.ReadAsStringAsync(httpRequestItem);

            //TODO : Investigate
            //return JsonConvert.DeserializeObject<User>(executeAsync);
        }
示例#16
0
        public async Task <Validation <string> > Create(Expense expense)
        {
            IEnumerable <KeyValuePair <string, string> > dict = UrlFormEncoded.Encode(expense);

            HttpRequestItem httpRequestItem = new HttpRequestItem()
            {
                Url             = "https://api.toshl.com/expenses/",
                HttpMethod      = HttpMethod.Post,
                AuthHeaderValue = new AuthenticationHeaderValue("Bearer", AccessToken),
                HttpContent     = new FormUrlEncodedContent(dict)
            };

            HttpResponseMessage httpResponseMessage = await _requestHandler.RequestAsync(httpRequestItem);

            if (httpResponseMessage.IsSuccessStatusCode)
            {
                string id = httpResponseMessage.Headers.GetValues("Location").First();
                id = id.Split('/').Last();

                return(new Validation <string>()
                {
                    ErrorMessages = new string[0],
                    ReturnObject = id
                });
            }

            return(new Validation <string>()
            {
                ErrorMessages = new string[]
                {
                    httpResponseMessage.ReasonPhrase
                }
            });
        }
示例#17
0
        public async Task <HttpResponseMessage> ExecuteAsync(HttpRequestItem httpRequestItem, HttpCompletionOption httpCompletionOption = HttpCompletionOption.ResponseContentRead)
        {
            var httpRequest = new HttpRequestMessage
            {
                RequestUri = new Uri(httpRequestItem.URL),
                Method     = httpRequestItem.HttpMethod,
                Content    = httpRequestItem.HttpContent
            };

            httpRequest.Headers.Add("Authorization", httpRequestItem.AuthzHeader);

            if (httpRequestItem.IsDataRequest)
            {
                httpRequest.Headers.Add("X-Api-Version", "1");
                httpRequest.Headers.Add("Accept", "application/json");
            }

            if (httpRequestItem.Headers != null)
            {
                foreach (var kvp in httpRequestItem.Headers)
                {
                    httpRequest.Headers.Add(kvp.Key, kvp.Value);
                }
            }

            var client = httpRequestItem.IsFileUpload ? _uploadsClient : _client;

            HttpResponseMessage httpResponse = await client.SendAsync(httpRequest, httpCompletionOption).ConfigureAwait(false);

            return(httpResponse);
        }
示例#18
0
        public virtual async Task <HttpResponseItem> ExecuteHttpRequestAsync(HttpRequestItem requestItem, CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            var responseItem = new HttpResponseItem {
                RequestItem = requestItem
            };
            var httpRequest = GetHttpRequest(requestItem);
            HttpResponseMessage response = null;

            try
            {
                response = await _httpClient.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead, token).ConfigureAwait(false);

                while (response.StatusCode == HttpStatusCode.Redirect && response.Headers.Location != null)
                {
                    response = await _httpClient.GetAsync(response.Headers.Location, token).ConfigureAwait(false);
                }
                response.EnsureSuccessStatusCode();
                ReadHeader(response, responseItem);
                await ReadContentAsync(response, responseItem).ConfigureAwait(false);

                return(responseItem);
            }
            finally
            {
                response?.Dispose();
            }
        }
示例#19
0
        public override HttpRequestItem BuildRequest()
        {
            var req = HttpRequestItem.CreateGetRequest(ApiUrls.GetSelfInfo);

            req.AddQueryValue("t", Timestamp);
            req.Referrer = ApiUrls.Referrer;
            return(req);
        }
示例#20
0
 protected override void ModifyRequest(HttpRequestItem req)
 {
     req.AddData("ptwebqq", Session.Ptwebqq);
     req.AddData("clientid", Session.ClientId);
     req.AddData("psessionid", "");
     req.AddData("t", Timestamp);
     req.Referrer = ApiUrls.ReferrerS;
 }
 protected override void ModifyRequest(HttpRequestItem req)
 {
     req.AddData("clientid", Session.ClientId);
     req.AddData("psessionid", Session.SessionId);
     req.AddData("vfwebqq", Session.Vfwebqq);
     req.AddData("t", Timestamp);
     req.AddData("did", _discussion.Did);
     req.Referrer = ApiUrls.Referrer;
 }
示例#22
0
        protected override HttpRequestItem BuildRequest()
        {
            var req = new HttpRequestItem(HttpMethodType.Post, string.Format(ApiUrls.GetQRCode, Session.Uuid));

            req.AddQueryValue("t", "webwx");
            req.AddQueryValue("_", Session.Seq++);
            req.ResultType = HttpResultType.Stream;
            return(req);
        }
示例#23
0
        public override HttpRequestItem BuildRequest()
        {
            HttpRequestItem req = null;

            // req.AddQueryValue("tuin", _friend.Uin);
            req.AddQueryValue("vfwebqq", Session.Vfwebqq);
            req.AddQueryValue("t", Timestamp);
            return(req);
        }
示例#24
0
        protected override HttpRequestItem BuildRequest()
        {
            var req = new HttpRequestItem(HttpMethodType.Post, string.Format(ApiUrls.GetQRCode, Session.Uuid));

            req.AddData("t", "webwx");
            req.AddData("_", (Session.Seq++).ToString());
            req.ResultType = HttpResultType.Byte;
            return(req);
        }
示例#25
0
        public override HttpRequestItem BuildRequest()
        {
            var req = new HttpRequestItem(HttpMethodType.Post, ApiUrls.CheckQRCode);

            req.AddQueryValue("tip", _tip);
            req.AddQueryValue("uuid", Session.Uuid);
            req.AddQueryValue("_", Session.Seq++);
            return(req);
        }
示例#26
0
        public async Task <Link[]> GetAllLinksAsync()
        {
            string url = string.Format("{0}/links", URL.RESTRoot);

            HttpRequestItem httpRequestItem = CreateHttpRequestItem(url, HttpMethod.Get);

            string executeAsync = await _httpRequestHandler.ReadAsStringAsync(httpRequestItem);

            return(JsonConvert.DeserializeObject <Link[]>(executeAsync));
        }
        protected override HttpRequestItem BuildRequest()
        {
            var req = HttpRequestItem.CreateGetRequest(ApiUrls.GetGroupInfo);

            req.AddQueryValue("gcode", _group.Code);
            req.AddQueryValue("vfwebqq", Session.Vfwebqq);
            req.AddQueryValue("t", Timestamp);
            req.Referrer = ApiUrls.ReferrerS;
            return(req);
        }
示例#28
0
        protected override HttpRequestItem BuildRequest()
        {
            var req = new HttpRequestItem(HttpMethodType.Post, ApiUrls.GetUuid);

            req.AddQueryValue("appid", ApiUrls.Appid);
            req.AddQueryValue("fun", "new");
            req.AddQueryValue("lang", "zh_CN");
            req.AddQueryValue("_", Session.Seq++);
            return(req);
        }
示例#29
0
        public async Task <OAuthToken> GetRequestTokenAsync()
        {
            string url;

            if (Config.Scope != null)
            {
                string serializedScope = Newtonsoft.Json.JsonConvert.SerializeObject(Config.Scope);

                url = string.Format("{0}?scope={1}", Consts.RequestToken, System.Net.WebUtility.UrlEncode(serializedScope));
            }
            else
            {
                url = Consts.RequestToken;
            }

            string authzHeader = _authorizationHeader.CreateForRequest(Config.CallbackUrl, Config.ConsumerKey, Config.ConsumerSecret, url);

            var httpRequestItem = new HttpRequestItem
            {
                URL           = url,
                HttpMethod    = System.Net.Http.HttpMethod.Get,
                AuthzHeader   = authzHeader,
                HttpContent   = null,
                IsDataRequest = false
            };

            var response = await _httpRequestHandler.ExecuteAsync(httpRequestItem).ConfigureAwait(false);

            var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            if (!response.IsSuccessStatusCode)
            {
                throw new ServerException((int)response.StatusCode, result);
            }


            if (string.IsNullOrEmpty(result))
            {
                throw new ServerException((int)response.StatusCode, "Server returned an empty result");
            }

            string[] kvpairs = result.Split('&');
            System.Collections.Generic.Dictionary <string, string> parameters = System.Linq.Enumerable.ToDictionary(System.Linq.Enumerable.Select(kvpairs, pair => pair.Split('=')), kv => kv[0], kv => kv[1]);

            Config.Token       = parameters["oauth_token"];
            Config.TokenSecret = parameters["oauth_token_secret"];
            var authCodeUri = new Uri(string.Format("{0}?oauth_token={1}", Consts.Authorize, Config.Token));

            return(new OAuthToken
            {
                Token = Config.Token,
                TokenSecret = Config.TokenSecret,
                AuthCodeUri = authCodeUri
            });
        }
示例#30
0
        public override HttpRequestItem BuildRequest()
        {
            var req = HttpRequestItem.CreateGetRequest(ApiUrls.GetDiscuzList);

            req.AddQueryValue("clientid", Session.ClientId);
            req.AddQueryValue("psessionid", Session.SessionId);
            req.AddQueryValue("vfwebqq", Session.Vfwebqq);
            req.AddQueryValue("t", Timestamp);
            req.Referrer = ApiUrls.ReferrerS;
            return(req);
        }