Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
 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);
 }
Ejemplo n.º 3
0
        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();
        }
Ejemplo n.º 4
0
        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;
            }
        }
Ejemplo n.º 5
0
 public ReadOnlyHttpHeaders Sign(Uri uri, HttpMethod method, ReadOnlyHttpHeaders headers)
 {
     return(headers);
 }