-
Notifications
You must be signed in to change notification settings - Fork 691
/
ConnectionOptions.cs
149 lines (132 loc) · 6.33 KB
/
ConnectionOptions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Globalization;
using NuGet.Common;
using NuGet.Versioning;
namespace NuGet.Protocol.Plugins
{
/// <summary>
/// Plugin connection options.
/// </summary>
public sealed class ConnectionOptions
{
/// <summary>
/// Gets the plugin handshake timeout.
/// </summary>
public TimeSpan HandshakeTimeout { get; }
/// <summary>
/// Gets the minimum plugin protocol version.
/// </summary>
public SemanticVersion MinimumProtocolVersion { get; }
/// <summary>
/// Gets the plugin protocol version.
/// </summary>
public SemanticVersion ProtocolVersion { get; }
/// <summary>
/// Gets the plugin request timeout.
/// </summary>
public TimeSpan RequestTimeout { get; private set; }
/// <summary>
/// Instantiates a new <see cref="ConnectionOptions" /> class.
/// </summary>
/// <param name="protocolVersion">The plugin protocol version.</param>
/// <param name="minimumProtocolVersion">The minimum plugin protocol version.</param>
/// <param name="handshakeTimeout">The plugin handshake timeout.</param>
/// <param name="requestTimeout">The plugin request timeout.</param>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="protocolVersion" />
/// is <see langword="null" />.</exception>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="minimumProtocolVersion" />
/// is <see langword="null" />.</exception>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="protocolVersion" />
/// is <see langword="null" />.</exception>
/// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="protocolVersion" />
/// is less than <paramref name="minimumProtocolVersion" />.</exception>
/// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="handshakeTimeout" />
/// is either less than <see cref="ProtocolConstants.MinTimeout" /> or greater than
/// <see cref="ProtocolConstants.MaxTimeout" />.</exception>
/// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="requestTimeout" />
/// is either less than <see cref="ProtocolConstants.MinTimeout" /> or greater than
/// <see cref="ProtocolConstants.MaxTimeout" />.</exception>
public ConnectionOptions(
SemanticVersion protocolVersion,
SemanticVersion minimumProtocolVersion,
TimeSpan handshakeTimeout,
TimeSpan requestTimeout)
{
if (protocolVersion == null)
{
throw new ArgumentNullException(nameof(protocolVersion));
}
if (minimumProtocolVersion == null)
{
throw new ArgumentNullException(nameof(minimumProtocolVersion));
}
if (minimumProtocolVersion > protocolVersion)
{
throw new ArgumentOutOfRangeException(
nameof(protocolVersion),
protocolVersion,
string.Format(
CultureInfo.CurrentCulture,
Strings.Plugin_ProtocolVersionOutOfRange,
nameof(protocolVersion),
nameof(minimumProtocolVersion)));
}
if (!TimeoutUtilities.IsValid(handshakeTimeout))
{
throw new ArgumentOutOfRangeException(
nameof(handshakeTimeout),
handshakeTimeout,
Strings.Plugin_TimeoutOutOfRange);
}
if (!TimeoutUtilities.IsValid(requestTimeout))
{
throw new ArgumentOutOfRangeException(
nameof(requestTimeout),
requestTimeout,
Strings.Plugin_TimeoutOutOfRange);
}
ProtocolVersion = protocolVersion;
MinimumProtocolVersion = minimumProtocolVersion;
HandshakeTimeout = handshakeTimeout;
RequestTimeout = requestTimeout;
}
/// <summary>
/// Sets a new request timeout.
/// </summary>
/// <param name="requestTimeout">The new request timeout.</param>
/// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="requestTimeout" />
/// is either less than <see cref="ProtocolConstants.MinTimeout" /> or greater than
/// <see cref="ProtocolConstants.MaxTimeout" />.</exception>
public void SetRequestTimeout(TimeSpan requestTimeout)
{
if (!TimeoutUtilities.IsValid(requestTimeout))
{
throw new ArgumentOutOfRangeException(
nameof(requestTimeout),
requestTimeout,
Strings.Plugin_TimeoutOutOfRange);
}
RequestTimeout = requestTimeout;
}
/// <summary>
/// Instantiates a <see cref="ConnectionOptions" /> class with default values.
/// </summary>
/// <param name="reader">An environment variable reader.</param>
/// <returns>A <see cref="ConnectionOptions" />.</returns>
public static ConnectionOptions CreateDefault(IEnvironmentVariableReader reader = null)
{
reader = reader ?? EnvironmentVariableWrapper.Instance;
var handshakeTimeoutInSeconds = reader.GetEnvironmentVariable(EnvironmentVariableConstants.HandshakeTimeout);
var requestTimeoutInSeconds = reader.GetEnvironmentVariable(EnvironmentVariableConstants.RequestTimeout);
var handshakeTimeout = TimeoutUtilities.GetTimeout(handshakeTimeoutInSeconds, ProtocolConstants.HandshakeTimeout);
var requestTimeout = TimeoutUtilities.GetTimeout(requestTimeoutInSeconds, ProtocolConstants.RequestTimeout);
return new ConnectionOptions(
protocolVersion: ProtocolConstants.CurrentVersion,
minimumProtocolVersion: ProtocolConstants.Version100,
handshakeTimeout: handshakeTimeout,
requestTimeout: requestTimeout);
}
}
}