public static async Task <bool> UrlExistsAsync(this HttpSource httpSource, string url, ILogger logger)
        {
            var nuGetLogger = logger.ToNuGetLogger();

            return(await httpSource.ProcessResponseAsync(
                       new HttpSourceRequest(() => HttpRequestMessageFactory.Create(HttpMethod.Head, url, nuGetLogger))
            {
                IgnoreNotFounds = true,
            },
                       response =>
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    return Task.FromResult(true);
                }
                else if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    return Task.FromResult(false);
                }

                throw new HttpRequestException(
                    $"The request to {url} return HTTP {(int)response.StatusCode} {response.ReasonPhrase}.");
            },
                       nuGetLogger,
                       CancellationToken.None));
        }
Example #2
0
        public async Task <int> GetCountAsync(ILogger log, CancellationToken token)
        {
            var uri = string.Format("{0}/Packages/$count", _baseAddress);

            return(await _httpSource.ProcessResponseAsync(
                       new HttpSourceRequest(
                           () =>
            {
                var request = HttpRequestMessageFactory.Create(HttpMethod.Get, uri, log);
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/atom+xml"));
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
                return request;
            }),
                       async response =>
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    var intString = await response.Content.ReadAsStringAsync();
                    return int.Parse(intString);
                }

                throw new FatalProtocolException(string.Format(
                                                     CultureInfo.CurrentCulture,
                                                     "The V2 feed at '{0}' returned an unexpected status code '{1} {2}'.",
                                                     uri,
                                                     (int)response.StatusCode,
                                                     response.ReasonPhrase));
            },
                       log,
                       token));
        }
Example #3
0
 // Pushes a package to the Http server.
 private async Task PushPackageToServer(string source,
                                        string apiKey,
                                        string pathToPackage,
                                        long packageSize,
                                        ILogger logger,
                                        CancellationToken token)
 {
     await _httpSource.ProcessResponseAsync(
         () => CreateRequest(source, pathToPackage, apiKey),
         response =>
     {
         response.EnsureSuccessStatusCode();
         return(Task.FromResult(0));
     },
         logger,
         token);
 }
Example #4
0
 // Pushes a package to the Http server.
 private async Task PushPackageToServer(string source,
                                        string apiKey,
                                        string pathToPackage,
                                        long packageSize,
                                        TimeSpan requestTimeout,
                                        ILogger logger,
                                        CancellationToken token)
 {
     var serviceEndpointUrl = GetServiceEndpointUrl(source, string.Empty);
     await _httpSource.ProcessResponseAsync(
         new HttpSourceRequest(() => CreateRequest(serviceEndpointUrl, pathToPackage, apiKey, logger))
     {
         RequestTimeout = requestTimeout
     },
         response =>
     {
         response.EnsureSuccessStatusCode();
         return(Task.FromResult(0));
     },
         logger,
         token);
 }
    public static async Task <ODataServiceDocumentResourceV2> CreateODataServiceDocumentResourceV2(
        string url,
        HttpSource client,
        DateTime utcNow,
        ILogger log,
        CancellationToken token)
    {
        // Get the service document and record the URL after any redirects.
        string lastRequestUri;

        try
        {
            lastRequestUri = await client.ProcessResponseAsync(
                new HttpSourceRequest(() => HttpRequestMessageFactory.Create(HttpMethod.Get, url, log)),
                response =>
            {
                if (response.RequestMessage == null)
                {
                    return(Task.FromResult(url));
                }

                return(Task.FromResult(response.RequestMessage.RequestUri.ToString()));
            },
                log,
                token);
        }
        catch (Exception ex) when(!(ex is FatalProtocolException) && (!(ex is OperationCanceledException)))
        {
            string message = String.Format(CultureInfo.CurrentCulture, Strings.Log_FailedToReadServiceIndex, url);

            throw new FatalProtocolException(message, ex);
        }

        // Trim the query string or any trailing slash.
        var builder = new UriBuilder(lastRequestUri)
        {
            Query = null
        };
        var baseAddress = builder.Uri.AbsoluteUri.Trim('/');

        return(new ODataServiceDocumentResourceV2(baseAddress, DateTime.UtcNow));
    }
        public async Task PushAsync(Stream packageStream, CancellationToken token)
        {
            await _httpSource.ProcessResponseAsync(
                new HttpSourceRequest(() =>
            {
                // Retries should seek the package stream to the beginning.
                packageStream.Position = 0;

                var packageContent = new StreamContent(packageStream)
                {
                    Headers =
                    {
                        ContentType = MediaTypeHeaderValue.Parse("application/octet-stream")
                    }
                };

                var content = new MultipartFormDataContent();
                content.Add(packageContent, "package", "package.nupkg");

                var request = HttpRequestMessageFactory.Create(
                    HttpMethod.Put,
                    _pushUrl,
                    new HttpRequestMessageConfiguration(logger: _logger, promptOn403: false));
                request.Content = content;
                request.Headers.TransferEncodingChunked = true;
                request.Headers.Add("X-NuGet-ApiKey", _destinationApiKey);

                return(request);
            }),
                response =>
            {
                response.EnsureSuccessStatusCode();
                return(Task.FromResult(0));
            },
                _logger,
                token);
        }
        // Pushes a package to the Http server.
        private async Task PushPackageToServer(string source,
                                               string apiKey,
                                               string pathToPackage,
                                               long packageSize,
                                               bool noServiceEndpoint,
                                               TimeSpan requestTimeout,
                                               ILogger logger,
                                               CancellationToken token)
        {
            var serviceEndpointUrl = GetServiceEndpointUrl(source, string.Empty, noServiceEndpoint);
            var useTempApiKey      = IsSourceNuGetSymbolServer(source);

            if (useTempApiKey)
            {
                var maxTries = 3;

                using (var packageReader = new PackageArchiveReader(pathToPackage))
                {
                    var packageIdentity = packageReader.GetIdentity();
                    var success         = false;
                    var retry           = 0;

                    while (retry < maxTries && !success)
                    {
                        try
                        {
                            retry++;
                            success = true;
                            // If user push to https://nuget.smbsrc.net/, use temp api key.
                            var tmpApiKey = await GetSecureApiKey(packageIdentity, apiKey, noServiceEndpoint, requestTimeout, logger, token);

                            await _httpSource.ProcessResponseAsync(
                                new HttpSourceRequest(() => CreateRequest(serviceEndpointUrl, pathToPackage, tmpApiKey, logger))
                            {
                                RequestTimeout = requestTimeout,
                                MaxTries       = 1
                            },
                                response =>
                            {
                                response.EnsureSuccessStatusCode();

                                return(Task.FromResult(0));
                            },
                                logger,
                                token);
                        }
                        catch (OperationCanceledException)
                        {
                            throw;
                        }
                        catch (Exception e)
                        {
                            if (retry == maxTries)
                            {
                                throw;
                            }

                            success = false;

                            logger.LogInformation(string.Format(
                                                      CultureInfo.CurrentCulture,
                                                      Strings.Log_RetryingHttp,
                                                      HttpMethod.Put,
                                                      source)
                                                  + Environment.NewLine
                                                  + ExceptionUtilities.DisplayMessage(e));
                        }
                    }
                }
            }
            else
            {
                await _httpSource.ProcessResponseAsync(
                    new HttpSourceRequest(() => CreateRequest(serviceEndpointUrl, pathToPackage, apiKey, logger))
                {
                    RequestTimeout = requestTimeout
                },
                    response =>
                {
                    response.EnsureSuccessStatusCode();

                    return(Task.FromResult(0));
                },
                    logger,
                    token);
            }
        }
Example #8
0
        /// <summary>
        /// Pushes a package to the Http server.
        /// </summary>
        /// <returns>Indicator of whether to show PushCommandPackagePushed message.</returns>
        private async Task <bool> PushPackageToServer(string source,
                                                      string apiKey,
                                                      string pathToPackage,
                                                      bool noServiceEndpoint,
                                                      bool skipDuplicate,
                                                      TimeSpan requestTimeout,
                                                      ILogger logger,
                                                      CancellationToken token)
        {
            Uri            serviceEndpointUrl           = GetServiceEndpointUrl(source, string.Empty, noServiceEndpoint);
            bool           useTempApiKey                = IsSourceNuGetSymbolServer(source);
            HttpStatusCode?codeNotToThrow               = ConvertSkipDuplicateParamToHttpStatusCode(skipDuplicate);
            bool           showPushCommandPackagePushed = true;

            if (useTempApiKey)
            {
                var maxTries = 3;

                using (var packageReader = new PackageArchiveReader(pathToPackage))
                {
                    PackageIdentity packageIdentity = packageReader.GetIdentity();
                    var             success         = false;
                    var             retry           = 0;

                    while (retry < maxTries && !success)
                    {
                        try
                        {
                            retry++;
                            success = true;
                            // If user push to https://nuget.smbsrc.net/, use temp api key.
                            string tmpApiKey = await GetSecureApiKey(packageIdentity, apiKey, noServiceEndpoint, requestTimeout, logger, token);

                            await _httpSource.ProcessResponseAsync(
                                new HttpSourceRequest(() => CreateRequest(serviceEndpointUrl, pathToPackage, tmpApiKey, logger))
                            {
                                RequestTimeout = requestTimeout,
                                MaxTries       = 1
                            },
                                response =>
                            {
                                HttpStatusCode?responseStatusCode = EnsureSuccessStatusCode(response, codeNotToThrow, logger);
                                bool logOccurred             = DetectAndLogSkippedErrorOccurrence(responseStatusCode, source, pathToPackage, response.ReasonPhrase, logger);
                                showPushCommandPackagePushed = !logOccurred;

                                return(Task.FromResult(0));
                            },
                                logger,
                                token);
                        }
                        catch (OperationCanceledException)
                        {
                            throw;
                        }
                        catch (Exception e)
                        {
                            if (retry == maxTries)
                            {
                                throw;
                            }

                            success = false;

                            logger.LogInformation(string.Format(
                                                      CultureInfo.CurrentCulture,
                                                      Strings.Log_RetryingHttp,
                                                      HttpMethod.Put,
                                                      source)
                                                  + Environment.NewLine
                                                  + ExceptionUtilities.DisplayMessage(e));
                        }
                    }
                }
            }
            else
            {
                await _httpSource.ProcessResponseAsync(
                    new HttpSourceRequest(() => CreateRequest(serviceEndpointUrl, pathToPackage, apiKey, logger))
                {
                    RequestTimeout = requestTimeout
                },
                    response =>
                {
                    HttpStatusCode?responseStatusCode = EnsureSuccessStatusCode(response, codeNotToThrow, logger);
                    bool logOccurred             = DetectAndLogSkippedErrorOccurrence(responseStatusCode, source, pathToPackage, response.ReasonPhrase, logger);
                    showPushCommandPackagePushed = !logOccurred;

                    return(Task.FromResult(0));
                },
                    logger,
                    token);
            }

            return(showPushCommandPackagePushed);
        }
        public static async Task <BlobMetadata> GetBlobMetadataAsync(this HttpSource httpSource, string url, ILogger logger)
        {
            var nuGetLogger = logger.ToNuGetLogger();

            // Try to get all of the information using a HEAD request.
            var blobMetadata = await httpSource.ProcessResponseAsync(
                new HttpSourceRequest(() => HttpRequestMessageFactory.Create(HttpMethod.Head, url, nuGetLogger)),
                response =>
            {
                if (response.StatusCode == HttpStatusCode.NotFound)
                {
                    return(Task.FromResult(new BlobMetadata(
                                               exists: false,
                                               hasContentMD5Header: false,
                                               contentMD5: null)));
                }

                response.EnsureSuccessStatusCode();

                var headerMD5Bytes = response.Content.Headers.ContentMD5;
                if (headerMD5Bytes != null)
                {
                    var contentMD5 = BytesToHex(headerMD5Bytes);
                    return(Task.FromResult(new BlobMetadata(
                                               exists: true,
                                               hasContentMD5Header: true,
                                               contentMD5: contentMD5)));
                }

                return(Task.FromResult <BlobMetadata>(null));
            },
                nuGetLogger,
                CancellationToken.None);

            if (blobMetadata != null)
            {
                return(blobMetadata);
            }

            // If no Content-MD5 header was found in the response, calculate the package hash by downloading the
            // package.
            return(await httpSource.ProcessStreamAsync(
                       new HttpSourceRequest(url, nuGetLogger),
                       async stream =>
            {
                var buffer = new byte[16 * 1024];
                using (var md5 = new MD5IncrementalHash())
                {
                    int read;
                    do
                    {
                        read = await stream.ReadAsync(buffer, 0, buffer.Length);
                        md5.AppendData(buffer, 0, read);
                    }while (read > 0);

                    var hash = md5.GetHashAndReset();
                    var contentMD5 = BytesToHex(hash);
                    return new BlobMetadata(
                        exists: true,
                        hasContentMD5Header: false,
                        contentMD5: contentMD5);
                }
            },
                       nuGetLogger,
                       CancellationToken.None));
        }