protected override void BuildRequestHeaders(StringStringKeyValuePairContainer kvpsContainer, Request req, MobileApplication app, bool ssl, bool redirect) { kvpsContainer.Put(HeaderKeys.Host, app.Domain); kvpsContainer.Put(HeaderKeys.Connection, HeaderValues.ConnectionKeepAlive); kvpsContainer.Put(HeaderKeys.Accept, req.ResponseEncType.AcceptValue); kvpsContainer.Put(HeaderKeys.UserAgent, BrowserCfg.UserAgent); if (app.HasReferer) { kvpsContainer.Put(HeaderKeys.Referer, app.Referer); } kvpsContainer.Put(HeaderKeys.AcceptEncoding, HeaderValues.AcceptEncoding); kvpsContainer.Put(HeaderKeys.AcceptLanguage, BrowserCfg.Language); if (req.RequestType == RequestType.Options) //Sets the request method for options request { kvpsContainer.Put(HeaderKeys.AccessControlRequestMethod, ((OptionsRequest)req).RequestTypeOption.Notation); //Sets the option request header } if (req.RequestType == RequestType.Options || req is ContentRequest) { kvpsContainer.Put(HeaderKeys.Origin, HttpUtil.GetBaseUrl(req.Url)); } if (req.RequestType == RequestType.Options || req is ContentRequest) { kvpsContainer.Put(HeaderKeys.Origin, HttpUtil.GetBaseUrl(req.Url)); } if (req.HasBody()) { ((ContentRequest)req).ContentBody.Prepare(kvpsContainer); } }
private static void PerformTunnelHandshake(HttpSocket httpSocket, Proxy proxy, string hostAddress, int port, BrowserConfig browserCfg) { StringStringKeyValuePairContainer headersContainer = new StringStringKeyValuePairContainer(); headersContainer.Put(HeaderKeys.Host, hostAddress + ":" + port); headersContainer.Put(HeaderKeys.UserAgent, browserCfg.UserAgent); headersContainer.Put(HeaderKeys.Connection, HeaderValues.ConnectionKeepAlive); if (proxy != null && proxy.HasAuthentication) { headersContainer.Put(HeaderKeys.ProxyConnection, HeaderValues.ConnectionKeepAlive); headersContainer.Put(HeaderKeys.ProxyAuthorization, "Basic " + proxy.ProxyCreds.GetBase64Auth()); } httpSocket.WriteLine(RequestType.Connect.Notation + " " + hostAddress + ":" + port + " " + browserCfg.HttpVersion.Notation); foreach (StringStringKeyValuePair kvp in headersContainer.Kvps) { httpSocket.WriteLine(kvp.Key + ": " + kvp.Value); } httpSocket.WriteLine(); httpSocket.FlushUnderlying(); HttpHeaderDecoder hd = new HttpHeaderDecoder(); hd.Decode(httpSocket.Stream); if (hd.ResponseStatus.HttpCode != HttpCode.Ok) { throw new IOException("Unable to tunnel through proxy => " + hd.ResponseStatus); } logger.Debug("Successfully tunneled through proxy"); }
public FormBody Add(string key, object value, bool noReplace = false) { if (!noReplace) { StringStringKeyValuePair exists = kvpContainer.Get(key); if (exists != null) { kvpContainer.Remove(exists); } } string stringVal = value is string?Encoding.UTF8.GetString(Encoding.Default.GetBytes((string)value)) : value.ToString(); kvpContainer.Put(new StringStringKeyValuePair(key, stringVal)); return(this); }
private void BuildSecFetchHeaders(StringStringKeyValuePairContainer reqHeaders, Request request, WebApplication app) { string lastNavigatedUrlDomain = app.LastNavigatedUrl is null ? null : HttpUtil.GetDomain(app.LastNavigatedUrl); reqHeaders.Put(HeaderKeys.SecFetchMode, request.HasProperty(RequestProperty.XMLHttpRequest) ? HeaderValues.SecFetchCors : HeaderValues.SecFetchNavigate); //request.getSecFetchMode() //TODO nested-navigate redirect to internal page by clicking button etc, no link? Form <<< //TODO same-origin/same-site/cross-site when called inside the page, like js scripts being called //boolean firstHostContact = !accessedHosts.contains(host) || (request.getRequestType() == RequestType.GET && ((GetRequest)request).isNoRef()); bool sameOrigin = IsSameOrigin(app.Domain, lastNavigatedUrlDomain); bool sameSite = !sameOrigin && IsSameSiteDifferentHost(app.Domain, lastNavigatedUrlDomain); bool crossSite = !sameOrigin && !sameSite; if (AccessedHosts.Count > 0 && !crossSite && RedirectionChain.Count > 1) { for (int i = 0; i < RedirectionChain.Count; i++) { Request prevReq = RedirectionChain[i]; string prevHost = HttpUtil.GetDomain(prevReq.Url); if (IsSameOrigin(app.Domain, prevHost)) { continue; } if (IsSameSiteDifferentHost(app.Domain, prevHost)) { sameSite = true; continue; } crossSite = true; break; } } if (AccessedHosts.Count == 0) { reqHeaders.Put(HeaderKeys.SecFetchSite, HeaderValues.SecFetchNone); } else if (crossSite) { reqHeaders.Put(HeaderKeys.SecFetchSite, HeaderValues.SecFetchCrossSite); } else if (sameSite) { reqHeaders.Put(HeaderKeys.SecFetchSite, HeaderValues.SecFetchSameSite); } else { reqHeaders.Put(HeaderKeys.SecFetchSite, HeaderValues.SecFetchSameOrigin); } if (!request.HasProperty(RequestProperty.XMLHttpRequest)) { reqHeaders.Put(HeaderKeys.SecFetchUser, HeaderValues.SecFetchUser); } }
protected override void SetContentHeaders(StringStringKeyValuePairContainer headers) { headers.Put(HeaderKeys.ContentType, raw ? EncType.ContentValue : MimeType.GetByFile(fileLink).Notation); headers.Put(HeaderKeys.ContentLength, ContentLength.ToString()); }
protected override void SetContentHeaders(StringStringKeyValuePairContainer headers) { base.SetContentHeaders(headers); headers.Put(HeaderKeys.ContentType, EncType.ContentValue + "; boundary=" + Boundary); }
protected override void BuildRequestHeaders(StringStringKeyValuePairContainer kvpsContainer, Request req, WebApplication app, bool ssl, bool redirect) { bool xmlHttpRequest = req.HasProperty(RequestProperty.XMLHttpRequest); kvpsContainer.Put(HeaderKeys.Host, app.Domain); kvpsContainer.Put(HeaderKeys.Connection, HeaderValues.ConnectionKeepAlive); if (ssl) { kvpsContainer.Put(HeaderKeys.Dpr, "1"); } kvpsContainer.Put(HeaderKeys.UserAgent, BrowserCfg.UserAgent); kvpsContainer.Put(HeaderKeys.Accept, req.ResponseEncType.AcceptValue); if ((req.RequestType == RequestType.Post && !xmlHttpRequest) || redirect || !string.IsNullOrEmpty(req.CachePolicy)) { kvpsContainer.Put(HeaderKeys.CacheControl, !string.IsNullOrEmpty(req.CachePolicy) ? req.CachePolicy : HeaderValues.MaxZeroCache); } if (!xmlHttpRequest) { kvpsContainer.Put(HeaderKeys.UpgradeInsecureRequests, "1"); } if (xmlHttpRequest) { kvpsContainer.Put(HeaderKeys.XRequestedWith, HeaderValues.XmlHttpRequest); } if (BrowserCfg.DoNotTrack) { kvpsContainer.Put(HeaderKeys.Dnt, "1"); } if (app.HasNavigated) { kvpsContainer.Put(HeaderKeys.Referer, app.LastNavigatedUrl); } kvpsContainer.Put(HeaderKeys.AcceptEncoding, HeaderValues.AcceptEncoding); kvpsContainer.Put(HeaderKeys.AcceptLanguage, BrowserCfg.Language); if (ssl) { BuildSecFetchHeaders(kvpsContainer, req, app); } if (req.RequestType == RequestType.Options) //Sets the request method for options request { kvpsContainer.Put(HeaderKeys.AccessControlRequestMethod, ((OptionsRequest)req).RequestTypeOption.Notation); //Sets the option request header } if (req.RequestType == RequestType.Options || xmlHttpRequest || req is ContentRequest) { kvpsContainer.Put(HeaderKeys.Origin, HttpUtil.GetBaseUrl(req.Url)); } if (req.RequestType != RequestType.Options && app.CookieJar != null && app.CookieJar.Cookies.Count > 0 && SessionPolicy != HttpSessionPolicy.NoData) { StringBuilder cookieSb = new StringBuilder(); for (int i = 0; i < app.CookieJar.Cookies.Count; i++) { cookieSb.Append(app.CookieJar.Cookies[i].Name + "=" + app.CookieJar.Cookies[i].Value); if (i < (app.CookieJar.Cookies.Count - 1)) { cookieSb.Append("; "); } } kvpsContainer.Put(HeaderKeys.Cookie, cookieSb.ToString()); } if (req.HasBody()) { ((ContentRequest)req).ContentBody.Prepare(kvpsContainer); } }
protected virtual void SetContentHeaders(StringStringKeyValuePairContainer headers) { headers.Put(HeaderKeys.ContentType, EncType.ContentValue); headers.Put(HeaderKeys.ContentLength, ContentLength.ToString()); }