private byte[] SerializeHeader(string method, HttpConnectionRequest request) { using (MemoryStream memoryStream = new MemoryStream()) { this._httpHeaderSerializer.WriteHeader((Stream)memoryStream, method, request); return(memoryStream.ToArray()); } }
public void WriteHeader(Stream stream, string method, HttpConnectionRequest request) { Uri url = request.Url; using (StreamWriter streamWriter = new StreamWriter(stream, this._headerEncoding, 1024, true)) { streamWriter.NewLine = "\r\n"; string requestTarget = HttpHeaderSerializer.GetRequestTarget(request); string host = HttpHeaderSerializer.GetHost(url); streamWriter.WriteLine(method.ToUpperInvariant() + " " + requestTarget + " HTTP/1.1"); streamWriter.WriteLine("Host: " + host); streamWriter.WriteLine(request.KeepAlive ? "Connection: Keep-Alive" : "Connection: Close"); if ((Uri)null != request.Referrer) { streamWriter.WriteLine("Referer:" + (object)request.Referrer); } long?nullable = request.RangeFrom; int num; if (!nullable.HasValue) { nullable = request.RangeTo; num = !nullable.HasValue ? 1 : 0; } else { num = 0; } if (num == 0) { streamWriter.WriteLine("Range: bytes={0}-{1}", new object[2] { (object)request.RangeFrom, (object)request.RangeTo }); } if (null != this._userAgentLine) { streamWriter.WriteLine(this._userAgentLine); } if (!string.IsNullOrWhiteSpace(request.Accept)) { streamWriter.WriteLine("Accept: " + request.Accept.Trim()); } if (null != request.Headers) { foreach (KeyValuePair <string, string> keyValuePair in request.Headers) { string str1 = keyValuePair.Value; string str2 = !string.IsNullOrWhiteSpace(str1) ? str1.Trim() : string.Empty; streamWriter.WriteLine(keyValuePair.Key.Trim() + ": " + str2); } } streamWriter.WriteLine(); streamWriter.Flush(); } }
private static string GetRequestTarget(HttpConnectionRequest request) { Uri url = request.Url; if (!((Uri)null != request.Proxy)) { return(url.PathAndQuery); } return(new UriBuilder(url) { Fragment = ((string)null) }.Uri.ToString()); }
public async Task <IHttpConnectionResponse> GetAsync(HttpConnectionRequest request, bool closeConnection, CancellationToken cancellationToken) { this.StartRequest(); if (closeConnection) { request.KeepAlive = false; } byte[] requestHeader = this.SerializeHeader("GET", request); Task <int> writeHeaderTask = this.WriteSocketAsync(requestHeader, 0, requestHeader.Length, cancellationToken); HttpReader httpReader = new HttpReader(new HttpReader.ReadAsyncDelegate(this.ReadSocketAsync), this._headerDecoding); IHttpConnectionResponse connectionResponse; try { string statusLine = await HttpReaderExtensions.ReadNonBlankLineAsync((IHttpReader)httpReader, cancellationToken).ConfigureAwait(false); this.ParseStatusLine(statusLine); await this.ReadHeadersAsync(httpReader, cancellationToken).ConfigureAwait(false); int num = await writeHeaderTask.ConfigureAwait(false); writeHeaderTask = (Task <int>)null; Stream stream = this._httpStatus.ChunkedEncoding ? (Stream) new ChunkedStream((IHttpReader)httpReader) : (Stream) new ContentLengthStream((IHttpReader)httpReader, this._httpStatus.ContentLength); HttpConnectionResponse response = new HttpConnectionResponse(request.Url, closeConnection ? (IHttpConnection)this : (IHttpConnection)null, (IHttpReader)httpReader, stream, Enumerable.ToLookup <Tuple <string, string>, string, string>((IEnumerable <Tuple <string, string> >) this._headers, (Func <Tuple <string, string>, string>)(kv => kv.Item1), (Func <Tuple <string, string>, string>)(kv => kv.Item2), (IEqualityComparer <string>)StringComparer.OrdinalIgnoreCase), (IHttpStatus)this._httpStatus); httpReader = (HttpReader)null; connectionResponse = (IHttpConnectionResponse)response; } finally { if (null != httpReader) { httpReader.Dispose(); } if (null != writeHeaderTask) { TaskCollector.Default.Add((Task)writeHeaderTask, "HttpConnection GetAsync writer"); } } return(connectionResponse); }