bool parseRequest() { string request; if (!streamReadLine(stream, out request)) return false; string host = ""; string line; bool issocket = false; ESO so = ESO.Unknown; EBrowser br = EBrowser.Unknown; HttpAuth aut = null; Dictionary<string, string> headers = new Dictionary<string, string>(); while (streamReadLine(stream, out line)) { if (string.IsNullOrEmpty(line)) break; string name, val; SeparaEnDos(line, ':', out name, out val); string lname = name.ToLower(); val = val.TrimStart(' '); switch (lname) { case "connection": { if (_Server != null && _Server.AllowKeepAlive) _keep_alive = val.ToLower().Contains("keep-alive"); break; } case "accept-encoding": { _gzip = val.ToLower().Contains("gzip"); break; } case "host": { host = val; break; } case "upgrade": { issocket = val == "websocket"; break; } case "cookie": { string nc, vc; foreach (string s in val.Split(';')) { SeparaEnDos(s, '=', out nc, out vc); nc = HttpUtility.UrlDecode(nc.TrimStart(' ')); vc = HttpUtility.UrlDecode(vc); try { httpCookie.Add(nc, new HttpCookie(nc, vc)); } catch { } } break; } case "authorization": { string tp, vl; SeparaEnDos(val, ' ', out tp, out vl); if (tp.ToLower() == "basic") { byte[] dv = Convert.FromBase64String(vl); vl = codec_iso.GetString(dv); SeparaEnDos(vl, ':', out tp, out vl); aut = new HttpAuth(tp, vl); } break; } case "user-agent": { string tp, vl; SeparaEnDos(val, ' ', out tp, out vl); //SO vl = vl.ToLower(); if (vl.Contains("windows")) so = ESO.Windows; else { if (vl.Contains("android")) so = ESO.Android; else { if (vl.Contains("iphone")) so = ESO.Iphone; else { if (vl.Contains("ipad")) so = ESO.Ipad; else { if (vl.Contains("ipod")) so = ESO.Ipod; else { if (vl.Contains("mac")) so = ESO.Mac; else { if (vl.Contains("linux")) so = ESO.Linux; else { if (vl.Contains("x11")) so = ESO.Unix; } } } } } } } //Browser if (vl.Contains("chrome/")) br = EBrowser.Chrome; else { if (vl.Contains("firefox")) br = EBrowser.FireFox; else { if (vl.Contains("msie")) br = EBrowser.IExplorer; else { if (vl.Contains("konqueror")) br = EBrowser.Konqueror; else { if (vl.Contains("opera/")) br = EBrowser.Opera; else { if (vl.Contains("safari/")) br = EBrowser.Safari; else { tp = tp.ToLower(); if (tp.Contains("dalvik/")) br = EBrowser.Dalvik; } } } } } } break; } } headers.Add(name, val); } _req = new HttpRequest(request, host, _IP, headers, aut, so, br, issocket, _Server.GetAndPostNamesToLowerCase); return true; }
public HttpRequest(string request, string host, string ip, Dictionary <string, string> header, HttpAuth auth, ESO so, EBrowser br, bool is_socket, bool varsToLowerCase) { if (header == null) { http_method = EHttpMethod.Unknown; return; } int ixa = request.IndexOf(' '); if (ixa <= -1) { http_method = EHttpMethod.Unknown; return; } int ixb = request.LastIndexOf(' '); if (ixb <= -1 || ixa == ixb) { http_method = EHttpMethod.Unknown; return; } _VarsToLowerCase = varsToLowerCase; _IP = ip; _so = so; _br = br; _header = header; _auth = auth; _host = new HttpHost(host); switch (request.Substring(0, ixa).ToUpper()) { case "HEAD": http_method = EHttpMethod.HEAD; break; case "GET": http_method = EHttpMethod.GET; break; case "POST": http_method = EHttpMethod.POST; break; default: http_method = EHttpMethod.Unknown; break; } if (is_socket) { http_method = EHttpMethod.SOCKET; } http_url = request.Substring(ixa + 1, ixb - ixa - 1).Trim('/'); http_protocol_version = request.Substring(ixb + 1); int ix_h = http_url.IndexOf('?'); if (ix_h != -1) { foreach (string key in http_url.Remove(0, ix_h + 1).Split('&')) { try { string iz, dr; HttpProcessor.SeparaEnDos(key, '=', out iz, out dr); if (varsToLowerCase) { iz = iz.ToLowerInvariant(); } _get.Add(HttpServer.UrlDecode(iz), HttpServer.UrlDecode(dr)); } catch { } } http_url = http_url.Substring(0, ix_h); } }