static IReadOnlyHttpHeaders CreateTestHeader() { var source = @"Set-Cookie: Hoge Set-Cookie: Fuga "; Nekoxy2.ApplicationLayer.Entities.Http.HttpHeaders.TryParse(source, out var headers); return(ReadOnlyHttpHeaders.Convert(headers)); }
public RestClient(IRestTransport transport, string baseUrl = "", IRequestSigner signer = null, ReadOnlyHttpHeaders defaultHeaders = null, ReadOnlyHttpCookies defaultCookies = null) { Transport = transport; BaseUrl = baseUrl; Signer = signer ?? new UnitRequestSigner(); DefaultHeaders = defaultHeaders ?? new ReadOnlyDictionary <string, string>(NoHeaders); DefaultCookies = defaultCookies ?? new ReadOnlyDictionary <string, string>(NoCookies); }
public void HttpHeadersTest() { var source = @"Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36 Accept: image/webp,image/apng,image/*,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 "; Nekoxy2.ApplicationLayer.Entities.Http.HttpHeaders.TryParse(source, out var spiEntity); var apiEntity = ReadOnlyHttpHeaders.Convert(spiEntity); var apiEntity2 = ReadOnlyHttpHeaders.Convert(spiEntity); apiEntity.ToString().Is(spiEntity.ToString()); apiEntity.GetHashCode().Is(apiEntity2.GetHashCode()); apiEntity.Equals(apiEntity2).IsTrue(); (apiEntity is Spi.Entities.Http.IReadOnlyHttpHeaders).IsTrue(); (apiEntity is Nekoxy2.Entities.Http.IReadOnlyHttpHeaders).IsTrue(); }
public void MakeRequest <TContent>(Uri uri, HttpMethod method, HttpContent content, ReadOnlyHttpHeaders headers, ReadOnlyHttpCookies cookies, int maxRedirectCount, RestResponse <TContent> allocatedResult) { allocatedResult.RequestUri = uri; try { // TODO: Dispose this var request = new HttpRequestMessage(method, uri) { Content = content }; // Set headers foreach (var h in headers) { request.Headers.TryAddWithoutValidation(h.Key, h.Value); } // Set cookies var cookieHeaderValue = string.Join("; ", cookies.Select(x => $"{x.Key}={x.Value}")); request.Headers.TryAddWithoutValidation("Cookie", cookieHeaderValue); // Don't use .Result here but rather .GetAwaiter().GetResult() // It produces a nicer call stack and no AggregateException nonsense // https://stackoverflow.com/a/36427080/362938 // TODO: Dispose this? var response = _http.SendAsync(request).GetAwaiter().GetResult(); var responseCookies = ParseResponseCookies(response, uri); var allCookies = cookies.MergeCopy(responseCookies); // Redirect if still possible (HTTP Status 3XX) if ((int)response.StatusCode / 100 == 3 && maxRedirectCount > 0) { // Uri ctor should take care of both absolute and relative redirects. There have // been problems with Android in the past. // (see https://github.com/detunized/password-manager-access/issues/21) var newUri = new Uri(uri, response.Headers.Location); // Redirect always does a GET with no content MakeRequest(newUri, HttpMethod.Get, null, headers, allCookies, maxRedirectCount - 1, allocatedResult); return; } // Set up the result allocatedResult.StatusCode = response.StatusCode; allocatedResult.Cookies = allCookies; switch (allocatedResult) { case RestResponse <string> text: text.Content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); break; case RestResponse <byte[]> binary: binary.Content = response.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult(); break; default: throw new InternalErrorException($"Unsupported content type {typeof(TContent)}"); } // TODO: Here we're ignoring possible duplicated headers. See if we need to preserve those! allocatedResult.Headers = response.Headers.ToDictionary(x => x.Key, x => x.Value.FirstOrDefault() ?? ""); } catch (HttpRequestException e) { allocatedResult.Error = e; } }
public ReadOnlyHttpHeaders Sign(Uri uri, HttpMethod method, ReadOnlyHttpHeaders headers) { return(headers); }