aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common/Net/HttpRequestOptions.cs
blob: dadac5e03d195667a531b619f34d9becae5e1347 (plain)
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

namespace MediaBrowser.Common.Net
{
    /// <summary>
    /// Class HttpRequestOptions
    /// </summary>
    public class HttpRequestOptions
    {
        /// <summary>
        /// Gets or sets the URL.
        /// </summary>
        /// <value>The URL.</value>
        public string Url { get; set; }

        public CompressionMethod? DecompressionMethod { get; set; }

        /// <summary>
        /// Gets or sets the accept header.
        /// </summary>
        /// <value>The accept header.</value>
        public string AcceptHeader
        {
            get => GetHeaderValue("Accept");
            set => RequestHeaders["Accept"] = value;
        }
        /// <summary>
        /// Gets or sets the cancellation token.
        /// </summary>
        /// <value>The cancellation token.</value>
        public CancellationToken CancellationToken { get; set; }

        /// <summary>
        /// Gets or sets the resource pool.
        /// </summary>
        /// <value>The resource pool.</value>
        public SemaphoreSlim ResourcePool { get; set; }

        /// <summary>
        /// Gets or sets the user agent.
        /// </summary>
        /// <value>The user agent.</value>
        public string UserAgent
        {
            get => GetHeaderValue("User-Agent");
            set => RequestHeaders["User-Agent"] = value;
        }

        /// <summary>
        /// Gets or sets the referrer.
        /// </summary>
        /// <value>The referrer.</value>
        public string Referer { get; set; }

        /// <summary>
        /// Gets or sets the host.
        /// </summary>
        /// <value>The host.</value>
        public string Host { get; set; }

        /// <summary>
        /// Gets or sets the progress.
        /// </summary>
        /// <value>The progress.</value>
        public IProgress<double> Progress { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether [enable HTTP compression].
        /// </summary>
        /// <value><c>true</c> if [enable HTTP compression]; otherwise, <c>false</c>.</value>
        public bool EnableHttpCompression { get; set; }

        public Dictionary<string, string> RequestHeaders { get; private set; }

        public string RequestContentType { get; set; }

        public string RequestContent { get; set; }
        public byte[] RequestContentBytes { get; set; }

        public bool BufferContent { get; set; }

        public bool LogRequest { get; set; }
        public bool LogRequestAsDebug { get; set; }
        public bool LogErrors { get; set; }
        public bool LogResponse { get; set; }
        public bool LogResponseHeaders { get; set; }

        public bool LogErrorResponseBody { get; set; }
        public bool EnableKeepAlive { get; set; }

        public CacheMode CacheMode { get; set; }
        public TimeSpan CacheLength { get; set; }

        public int TimeoutMs { get; set; }
        public bool EnableDefaultUserAgent { get; set; }

        public bool AppendCharsetToMimeType { get; set; }
        public string DownloadFilePath { get; set; }

        private string GetHeaderValue(string name)
        {
            RequestHeaders.TryGetValue(name, out var value);

            return value;
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="HttpRequestOptions"/> class.
        /// </summary>
        public HttpRequestOptions()
        {
            EnableHttpCompression = true;

            RequestHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

            LogRequest = true;
            LogErrors = true;
            CacheMode = CacheMode.None;

            TimeoutMs = 20000;
        }

        public void SetPostData(IDictionary<string, string> values)
        {
            var strings = values.Keys.Select(key => string.Format("{0}={1}", key, values[key]));
            var postContent = string.Join("&", strings.ToArray());

            RequestContent = postContent;
            RequestContentType = "application/x-www-form-urlencoded";
        }
    }

    public enum CacheMode
    {
        None = 0,
        Unconditional = 1
    }

    public enum CompressionMethod
    {
        Deflate,
        Gzip
    }
}