/// <summary> /// Creates HTTP Request for well defined remote host /// </summary> private byte[] CreateRequest(DnsInfo dns) { using (SHA1 sha1 = SHA1.Create()) { byte[] hash = sha1.ComputeHash(Guid.NewGuid().ToByteArray()); WebSocketKey = Convert.ToBase64String(hash); } string request = HttpHeaders.HTTP_GET + " " + dns.Path + " " + HttpHeaders.HTTP_VERSION + "\r\n" + HttpHeaders.Create(HttpHeaders.HOST, dns.Hostname) + HttpHeaders.Create(HttpHeaders.CONNECTION, HttpHeaders.UPGRADE) + HttpHeaders.Create(HttpHeaders.PRAGMA, HttpHeaders.VALUE_NO_CACHE) + HttpHeaders.Create(HttpHeaders.CACHE_CONTROL, HttpHeaders.VALUE_NO_CACHE) + HttpHeaders.Create(HttpHeaders.UPGRADE, HttpHeaders.VALUE_WEBSOCKET) + HttpHeaders.Create(HttpHeaders.WEBSOCKET_VERSION, HttpHeaders.VALUE_WEBSOCKET_VERSION) + HttpHeaders.Create(HttpHeaders.ACCEPT_ENCODING, HttpHeaders.VALUE_GZIP_DEFLATE_BR) + HttpHeaders.Create(HttpHeaders.ACCEPT_LANGUAGE, HttpHeaders.VALUE_ACCEPT_EN) + HttpHeaders.Create(HttpHeaders.WEBSOCKET_KEY, WebSocketKey) + HttpHeaders.Create(HttpHeaders.WEBSOCKET_EXTENSIONS, HttpHeaders.VALUE_WEBSOCKET_EXTENSIONS); lock (Data) foreach (var kv in Data.Properties) { request += HttpHeaders.Create(kv.Key, kv.Value); } request += "\r\n"; return(Encoding.UTF8.GetBytes(request)); }
public HttpClientResponse TryDispatch(HttpClientRequest request) { HttpClient.SetAuthorizationHeader(request.Header, "Authorization", this.UserName, this.Password); String lHostname = request.URL.Host; Int32 lPort = request.URL.Port; Boolean lSslConnection = request.URL.Scheme?.ToLower() == "https"; // Settings for connection thru Http Proxy // Note that Request should think that it uses direct connection when SSL is enabled because // proxy server tunnels SSL data AS IS, without adjusting its HTTP headers request.UseProxy = this.ProxySettings.UseProxy && !lSslConnection; if (this.ProxySettings.UseProxy) { lHostname = this.ProxySettings.ProxyHost; lPort = this.ProxySettings.ProxyPort; HttpClient.SetAuthorizationHeader(request.Header, "Proxy-Authorization", this.ProxySettings.UserName, this.ProxySettings.Password); } Connection lConnection = this.GetHttpConnection(lSslConnection, request.URL.Host, request.URL.Port, lHostname, lPort); try { request.WriteHeaderToConnection(lConnection); } catch (ObjectDisposedException) { lConnection = this.GetNewHttpConnection(lHostname, lPort); request.WriteHeaderToConnection(lConnection); } catch (ConnectionClosedException) { lConnection = this.GetNewHttpConnection(lHostname, lPort); request.WriteHeaderToConnection(lConnection); } catch (SocketException) { lConnection = this.GetNewHttpConnection(lHostname, lPort); request.WriteHeaderToConnection(lConnection); } request.WriteBodyToConnection(lConnection); HttpClientResponse lResponse; do { HttpHeaders lHeaders = HttpHeaders.Create(lConnection); if (lHeaders == null) { throw new ConnectionClosedException(); } lResponse = new HttpClientResponse(lConnection, lHeaders); }while (lResponse.Header.HttpCode == HttpStatusCode.Continue); // 100 CONTINUE means useless response. if (!lResponse.KeepAlive) { this.fConnectionUrl = null; this.fConnection = null; } if (lResponse.HttpCode == HttpStatusCode.ProxyAuthenticationRequired) { throw new HttpException("Proxy authorization failed", lResponse); } return(lResponse); }