Ejemplo n.º 1
0
        /// <summary>
        /// 复制请求头
        /// </summary>
        /// <param name="context"></param>
        /// <param name="webRequest"></param>
        protected virtual void CopyRequestHeaders(HttpContext context, HttpWebRequest webRequest)
        {
            // 扩展点:允许替换默认实现方式

            // 复制请求头
            foreach (string name in context.Request.Headers.AllKeys)
            {
                // 过滤不允许直接指定的请求头
                if (s_IgnoreRequestHeaders.FirstOrDefault(x => x.Equals(name, StringComparison.OrdinalIgnoreCase)) != null)
                {
                    continue;
                }


                string value = context.Request.Headers[name];
                SetRequestHeader(context, webRequest, name, value);
            }

            // 增加一个特殊的标记,在 StreamResult.cs 中会有对应的处理逻辑
            webRequest.Headers.Add("x-HttpProxyHandler", "1");

            webRequest.Headers.Add("x-UserHostAddress", context.Request.UserHostAddress);
            //webRequest.Headers.Remove("Cache-Control");

            if (string.Equals(context.Request.Headers["Connection"], "keep-alive", StringComparison.OrdinalIgnoreCase))
            {
                webRequest.KeepAlive = true;
            }


            string referer = context.Request.Headers["Referer"];

            if (string.IsNullOrEmpty(referer) == false)
            {
                if (referer.IndexOf("://") > 0)
                {
                    string refererRoot = UrlExtensions.GetWebSiteRoot(referer);
                    string requestRoot = UrlExtensions.GetWebSiteRoot(webRequest.RequestUri.AbsoluteUri);

                    string referer2 = requestRoot + referer.Substring(refererRoot.Length);
                    SetRequestHeader(context, webRequest, "Referer", referer2);
                }
            }
        }