You've already forked linux-packaging-mono
Imported Upstream version 4.2.0.179
Former-commit-id: 0a113cb3a6feb7873f632839b1307cc6033cd595
This commit is contained in:
committed by
Jo Shields
parent
183bba2c9a
commit
6992685b86
@@ -4,7 +4,8 @@ include ../../build/rules.make
|
||||
|
||||
LIBRARY = System.Net.Http.dll
|
||||
|
||||
LIB_MCS_FLAGS = -r:System.Core.dll -r:System.dll $(EXTRA_LIB_MCS_FLAGS)
|
||||
LIB_REFS = System.Core System
|
||||
LIB_MCS_FLAGS = $(EXTRA_LIB_MCS_FLAGS)
|
||||
|
||||
TEST_MCS_FLAGS = -r:System.dll -r:System.Core.dll
|
||||
|
||||
|
@@ -134,9 +134,11 @@ namespace System.Net.Http.Headers
|
||||
this.HeaderKind = headerKind;
|
||||
}
|
||||
|
||||
public static HeaderInfo CreateSingle<T> (string name, TryParseDelegate<T> parser, HttpHeaderKind headerKind)
|
||||
public static HeaderInfo CreateSingle<T> (string name, TryParseDelegate<T> parser, HttpHeaderKind headerKind, Func<object, string> toString = null)
|
||||
{
|
||||
return new HeaderTypeInfo<T, object> (name, parser, headerKind);
|
||||
return new HeaderTypeInfo<T, object> (name, parser, headerKind) {
|
||||
CustomToString = toString
|
||||
};
|
||||
}
|
||||
|
||||
//
|
||||
@@ -152,6 +154,10 @@ namespace System.Net.Http.Headers
|
||||
return CreateCollection (headers, this);
|
||||
}
|
||||
|
||||
public Func<object, string> CustomToString {
|
||||
get; private set;
|
||||
}
|
||||
|
||||
public virtual string Separator {
|
||||
get {
|
||||
// Needed for AllowsMany only
|
||||
|
@@ -48,7 +48,7 @@ namespace System.Net.Http.Headers
|
||||
|
||||
public readonly Func<object, string> CustomToString;
|
||||
|
||||
public HeaderBucket (object parsed, Func<object, string> converter = null)
|
||||
public HeaderBucket (object parsed, Func<object, string> converter)
|
||||
{
|
||||
this.Parsed = parsed;
|
||||
this.CustomToString = converter;
|
||||
@@ -104,18 +104,18 @@ namespace System.Net.Http.Headers
|
||||
HeaderInfo.CreateSingle<byte[]> ("Content-MD5", Parser.MD5.TryParse, HttpHeaderKind.Content),
|
||||
HeaderInfo.CreateSingle<ContentRangeHeaderValue> ("Content-Range", ContentRangeHeaderValue.TryParse, HttpHeaderKind.Content),
|
||||
HeaderInfo.CreateSingle<MediaTypeHeaderValue> ("Content-Type", MediaTypeHeaderValue.TryParse, HttpHeaderKind.Content),
|
||||
HeaderInfo.CreateSingle<DateTimeOffset> ("Date", Parser.DateTime.TryParse, HttpHeaderKind.Request | HttpHeaderKind.Response),
|
||||
HeaderInfo.CreateSingle<DateTimeOffset> ("Date", Parser.DateTime.TryParse, HttpHeaderKind.Request | HttpHeaderKind.Response, Parser.DateTime.ToString),
|
||||
HeaderInfo.CreateSingle<EntityTagHeaderValue> ("ETag", EntityTagHeaderValue.TryParse, HttpHeaderKind.Response),
|
||||
HeaderInfo.CreateMulti<NameValueWithParametersHeaderValue> ("Expect", NameValueWithParametersHeaderValue.TryParse, HttpHeaderKind.Request),
|
||||
HeaderInfo.CreateSingle<DateTimeOffset> ("Expires", Parser.DateTime.TryParse, HttpHeaderKind.Content),
|
||||
HeaderInfo.CreateSingle<DateTimeOffset> ("Expires", Parser.DateTime.TryParse, HttpHeaderKind.Content, Parser.DateTime.ToString),
|
||||
HeaderInfo.CreateSingle<string> ("From", Parser.EmailAddress.TryParse, HttpHeaderKind.Request),
|
||||
HeaderInfo.CreateSingle<Uri> ("Host", Parser.Uri.TryParse, HttpHeaderKind.Request),
|
||||
HeaderInfo.CreateSingle<string> ("Host", Parser.Host.TryParse, HttpHeaderKind.Request),
|
||||
HeaderInfo.CreateMulti<EntityTagHeaderValue> ("If-Match", EntityTagHeaderValue.TryParse, HttpHeaderKind.Request),
|
||||
HeaderInfo.CreateSingle<DateTimeOffset> ("If-Modified-Since", Parser.DateTime.TryParse, HttpHeaderKind.Request),
|
||||
HeaderInfo.CreateSingle<DateTimeOffset> ("If-Modified-Since", Parser.DateTime.TryParse, HttpHeaderKind.Request, Parser.DateTime.ToString),
|
||||
HeaderInfo.CreateMulti<EntityTagHeaderValue> ("If-None-Match", EntityTagHeaderValue.TryParse, HttpHeaderKind.Request),
|
||||
HeaderInfo.CreateSingle<RangeConditionHeaderValue> ("If-Range", RangeConditionHeaderValue.TryParse, HttpHeaderKind.Request),
|
||||
HeaderInfo.CreateSingle<DateTimeOffset> ("If-Unmodified-Since", Parser.DateTime.TryParse, HttpHeaderKind.Request),
|
||||
HeaderInfo.CreateSingle<DateTimeOffset> ("Last-Modified", Parser.DateTime.TryParse, HttpHeaderKind.Content),
|
||||
HeaderInfo.CreateSingle<DateTimeOffset> ("If-Unmodified-Since", Parser.DateTime.TryParse, HttpHeaderKind.Request, Parser.DateTime.ToString),
|
||||
HeaderInfo.CreateSingle<DateTimeOffset> ("Last-Modified", Parser.DateTime.TryParse, HttpHeaderKind.Content, Parser.DateTime.ToString),
|
||||
HeaderInfo.CreateSingle<Uri> ("Location", Parser.Uri.TryParse, HttpHeaderKind.Response),
|
||||
HeaderInfo.CreateSingle<int> ("Max-Forwards", Parser.Int.TryParse, HttpHeaderKind.Request),
|
||||
HeaderInfo.CreateMulti<NameValueHeaderValue> ("Pragma", NameValueHeaderValue.TryParsePragma, HttpHeaderKind.Request | HttpHeaderKind.Response),
|
||||
@@ -198,18 +198,18 @@ namespace System.Net.Http.Headers
|
||||
|
||||
if (headerInfo.AllowsMany) {
|
||||
if (bucket == null)
|
||||
bucket = new HeaderBucket (headerInfo.CreateCollection (this));
|
||||
bucket = new HeaderBucket (headerInfo.CreateCollection (this), headerInfo.CustomToString);
|
||||
|
||||
headerInfo.AddToCollection (bucket.Parsed, parsed_value);
|
||||
} else {
|
||||
if (bucket != null)
|
||||
throw new FormatException ();
|
||||
|
||||
bucket = new HeaderBucket (parsed_value);
|
||||
bucket = new HeaderBucket (parsed_value, headerInfo.CustomToString);
|
||||
}
|
||||
} else {
|
||||
if (bucket == null)
|
||||
bucket = new HeaderBucket (null);
|
||||
bucket = new HeaderBucket (null, null);
|
||||
|
||||
bucket.Values.Add (value ?? string.Empty);
|
||||
}
|
||||
@@ -343,29 +343,40 @@ namespace System.Net.Http.Headers
|
||||
return true;
|
||||
}
|
||||
|
||||
internal static string GetSingleHeaderString (string key, IEnumerable<string> values)
|
||||
{
|
||||
string separator = ",";
|
||||
HeaderInfo headerInfo;
|
||||
if (known_headers.TryGetValue (key, out headerInfo) && headerInfo.AllowsMany)
|
||||
separator = headerInfo.Separator;
|
||||
|
||||
var sb = new StringBuilder ();
|
||||
bool first = true;
|
||||
foreach (var v in values) {
|
||||
if (!first) {
|
||||
sb.Append (separator);
|
||||
if (separator != " ")
|
||||
sb.Append (" ");
|
||||
}
|
||||
|
||||
sb.Append (v);
|
||||
first = false;
|
||||
}
|
||||
|
||||
// Return null for empty values list
|
||||
if (first)
|
||||
return null;
|
||||
|
||||
return sb.ToString ();
|
||||
}
|
||||
|
||||
public override string ToString ()
|
||||
{
|
||||
var sb = new StringBuilder ();
|
||||
foreach (var entry in this) {
|
||||
sb.Append (entry.Key);
|
||||
sb.Append (": ");
|
||||
|
||||
string separator = ",";
|
||||
HeaderInfo headerInfo;
|
||||
if (known_headers.TryGetValue (entry.Key, out headerInfo) && headerInfo.AllowsMany)
|
||||
separator = headerInfo.Separator;
|
||||
|
||||
bool first = true;
|
||||
foreach (var v in entry.Value) {
|
||||
if (!first) {
|
||||
sb.Append (separator);
|
||||
sb.Append (" ");
|
||||
}
|
||||
|
||||
sb.Append (v);
|
||||
first = false;
|
||||
}
|
||||
|
||||
sb.Append (GetSingleHeaderString (entry.Key, entry.Value));
|
||||
sb.Append ("\r\n");
|
||||
}
|
||||
|
||||
@@ -466,7 +477,7 @@ namespace System.Net.Http.Headers
|
||||
|
||||
if (!headers.TryGetValue (name, out value)) {
|
||||
var hinfo = known_headers[name];
|
||||
value = new HeaderBucket (new HttpHeaderValueCollection<T> (this, hinfo));
|
||||
value = new HeaderBucket (new HttpHeaderValueCollection<T> (this, hinfo), hinfo.CustomToString);
|
||||
headers.Add (name, value);
|
||||
}
|
||||
|
||||
|
@@ -125,6 +125,17 @@ namespace System.Net.Http.Headers
|
||||
}
|
||||
}
|
||||
|
||||
public static class Host
|
||||
{
|
||||
public static bool TryParse (string input, out string result)
|
||||
{
|
||||
result = input;
|
||||
|
||||
System.Uri dummy;
|
||||
return System.Uri.TryCreate ("http://u@" + input + "/", UriKind.Absolute, out dummy);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Int
|
||||
{
|
||||
public static bool TryParse (string input, out int result)
|
||||
|
@@ -30,6 +30,7 @@ using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.Specialized;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Linq;
|
||||
|
||||
namespace System.Net.Http
|
||||
{
|
||||
@@ -274,9 +275,18 @@ namespace System.Net.Http
|
||||
// Add request headers
|
||||
var headers = wr.Headers;
|
||||
foreach (var header in request.Headers) {
|
||||
foreach (var value in header.Value) {
|
||||
headers.AddValue (header.Key, value);
|
||||
var values = header.Value;
|
||||
if (header.Key == "Transfer-Encoding") {
|
||||
// Chunked Transfer-Encoding is never set for HttpWebRequest. It's detected
|
||||
// from ContentLength by HttpWebRequest
|
||||
values = values.Where (l => l != "chunked");
|
||||
}
|
||||
|
||||
var values_formated = HttpRequestHeaders.GetSingleHeaderString (header.Key, values);
|
||||
if (values_formated == null)
|
||||
continue;
|
||||
|
||||
headers.AddValue (header.Key, values_formated);
|
||||
}
|
||||
|
||||
return wr;
|
||||
|
@@ -17,6 +17,7 @@ System.Net.Http.Headers/ContentRangeHeaderValueTest.cs
|
||||
System.Net.Http.Headers/EntityTagHeaderValueTest.cs
|
||||
System.Net.Http.Headers/HttpHeadersTest.cs
|
||||
System.Net.Http.Headers/HttpHeaderValueCollection.cs
|
||||
System.Net.Http.Headers/HttpRequestHeadersTest.cs
|
||||
System.Net.Http.Headers/MediaTypeHeaderValueTest.cs
|
||||
System.Net.Http.Headers/MediaTypeWithQualityHeaderValueTest.cs
|
||||
System.Net.Http.Headers/NameValueHeaderValueTest.cs
|
||||
|
@@ -0,0 +1,18 @@
|
||||
using NUnit.Framework;
|
||||
using System.Net.Http;
|
||||
|
||||
namespace MonoTests.System.Net.Http.Headers
|
||||
{
|
||||
[TestFixture]
|
||||
public class HttpRequestHeadersTest
|
||||
{
|
||||
[Test]
|
||||
public void AccessHostAfterAdding()
|
||||
{
|
||||
var requestMessage = new HttpRequestMessage ();
|
||||
requestMessage.Headers.TryAddWithoutValidation ("Host", "MyHost:90");
|
||||
|
||||
Assert.AreEqual ("MyHost:90", requestMessage.Headers.Host);
|
||||
}
|
||||
}
|
||||
}
|
@@ -572,6 +572,97 @@ namespace MonoTests.System.Net.Http
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Send_Complete_CustomHeaders_SpecialSeparators ()
|
||||
{
|
||||
bool? failed = null;
|
||||
|
||||
var listener = CreateListener (l => {
|
||||
var request = l.Request;
|
||||
|
||||
try {
|
||||
Assert.AreEqual ("MLK Android Phone 1.1.9", request.UserAgent, "#1");
|
||||
failed = false;
|
||||
} catch {
|
||||
failed = true;
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
var client = new HttpClient ();
|
||||
|
||||
client.DefaultRequestHeaders.Add("User-Agent", "MLK Android Phone 1.1.9");
|
||||
|
||||
var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
|
||||
|
||||
var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result;
|
||||
|
||||
Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100");
|
||||
Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101");
|
||||
Assert.AreEqual (false, failed, "#102");
|
||||
} finally {
|
||||
listener.Abort ();
|
||||
listener.Close ();
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Send_Transfer_Encoding_Chunked ()
|
||||
{
|
||||
bool? failed = null;
|
||||
|
||||
var listener = CreateListener (l => {
|
||||
var request = l.Request;
|
||||
|
||||
try {
|
||||
Assert.AreEqual (1, request.Headers.Count, "#1");
|
||||
failed = false;
|
||||
} catch {
|
||||
failed = true;
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
var client = new HttpClient ();
|
||||
client.DefaultRequestHeaders.TransferEncodingChunked = true;
|
||||
|
||||
client.GetAsync (LocalServer).Wait ();
|
||||
|
||||
Assert.AreEqual (false, failed, "#102");
|
||||
} finally {
|
||||
listener.Abort ();
|
||||
listener.Close ();
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Send_Transfer_Encoding_Custom ()
|
||||
{
|
||||
bool? failed = null;
|
||||
|
||||
var listener = CreateListener (l => {
|
||||
failed = true;
|
||||
});
|
||||
|
||||
try {
|
||||
var client = new HttpClient ();
|
||||
client.DefaultRequestHeaders.TransferEncoding.Add (new TransferCodingHeaderValue ("chunked2"));
|
||||
|
||||
var request = new HttpRequestMessage (HttpMethod.Get, LocalServer);
|
||||
|
||||
try {
|
||||
client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Wait ();
|
||||
Assert.Fail ("#1");
|
||||
} catch (AggregateException e) {
|
||||
Assert.AreEqual (typeof (ProtocolViolationException), e.InnerException.GetType (), "#2");
|
||||
}
|
||||
Assert.IsNull (failed, "#102");
|
||||
} finally {
|
||||
listener.Abort ();
|
||||
listener.Close ();
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Send_Complete_Content ()
|
||||
{
|
||||
|
@@ -133,6 +133,16 @@ namespace MonoTests.System.Net.Http
|
||||
Assert.AreEqual (other, m.First (), "#4");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Add_ParseCustomToString ()
|
||||
{
|
||||
var m = new MultipartContent ("a", "b");
|
||||
|
||||
m.Headers.Add ("Expires", "Mon, 30 Nov 2020 19:55:22 GMT");
|
||||
|
||||
Assert.AreEqual ("Mon, 30 Nov 2020 19:55:22 GMT", m.Headers.Skip (1).First().Value.First ());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Add_Resursive ()
|
||||
{
|
||||
|
@@ -1,54 +0,0 @@
|
||||
../../build/common/Consts.cs
|
||||
Assembly/AssemblyInfo.cs
|
||||
System.Net.Http/ByteArrayContent.cs
|
||||
System.Net.Http/ClientCertificateOption.cs
|
||||
System.Net.Http/DelegatingHandler.cs
|
||||
System.Net.Http/FormUrlEncodedContent.cs
|
||||
System.Net.Http/HttpClient.cs
|
||||
System.Net.Http/HttpClientHandler.cs
|
||||
System.Net.Http/HttpCompletionOption.cs
|
||||
System.Net.Http/HttpContent.cs
|
||||
System.Net.Http/HttpMessageHandler.cs
|
||||
System.Net.Http/HttpMessageInvoker.cs
|
||||
System.Net.Http/HttpMethod.cs
|
||||
System.Net.Http/HttpRequestException.cs
|
||||
System.Net.Http/HttpRequestMessage.cs
|
||||
System.Net.Http/HttpResponseMessage.cs
|
||||
System.Net.Http/MessageProcessingHandler.cs
|
||||
System.Net.Http/MultipartContent.cs
|
||||
System.Net.Http/MultipartFormDataContent.cs
|
||||
System.Net.Http/StreamContent.cs
|
||||
System.Net.Http/StringContent.cs
|
||||
System.Net.Http.Headers/AuthenticationHeaderValue.cs
|
||||
System.Net.Http.Headers/CacheControlHeaderValue.cs
|
||||
System.Net.Http.Headers/CollectionExtensions.cs
|
||||
System.Net.Http.Headers/CollectionParser.cs
|
||||
System.Net.Http.Headers/ContentDispositionHeaderValue.cs
|
||||
System.Net.Http.Headers/ContentRangeHeaderValue.cs
|
||||
System.Net.Http.Headers/EntityTagHeaderValue.cs
|
||||
System.Net.Http.Headers/HashCodeCalculator.cs
|
||||
System.Net.Http.Headers/HeaderInfo.cs
|
||||
System.Net.Http.Headers/HttpContentHeaders.cs
|
||||
System.Net.Http.Headers/HttpHeaderKind.cs
|
||||
System.Net.Http.Headers/HttpHeaders.cs
|
||||
System.Net.Http.Headers/HttpHeaderValueCollection.cs
|
||||
System.Net.Http.Headers/HttpRequestHeaders.cs
|
||||
System.Net.Http.Headers/HttpResponseHeaders.cs
|
||||
System.Net.Http.Headers/Lexer.cs
|
||||
System.Net.Http.Headers/MediaTypeHeaderValue.cs
|
||||
System.Net.Http.Headers/MediaTypeWithQualityHeaderValue.cs
|
||||
System.Net.Http.Headers/NameValueHeaderValue.cs
|
||||
System.Net.Http.Headers/NameValueWithParametersHeaderValue.cs
|
||||
System.Net.Http.Headers/Parser.cs
|
||||
System.Net.Http.Headers/ProductHeaderValue.cs
|
||||
System.Net.Http.Headers/ProductInfoHeaderValue.cs
|
||||
System.Net.Http.Headers/QualityValue.cs
|
||||
System.Net.Http.Headers/RangeConditionHeaderValue.cs
|
||||
System.Net.Http.Headers/RangeHeaderValue.cs
|
||||
System.Net.Http.Headers/RangeItemHeaderValue.cs
|
||||
System.Net.Http.Headers/RetryConditionHeaderValue.cs
|
||||
System.Net.Http.Headers/StringWithQualityHeaderValue.cs
|
||||
System.Net.Http.Headers/TransferCodingHeaderValue.cs
|
||||
System.Net.Http.Headers/TransferCodingWithQualityHeaderValue.cs
|
||||
System.Net.Http.Headers/ViaHeaderValue.cs
|
||||
System.Net.Http.Headers/WarningHeaderValue.cs
|
Reference in New Issue
Block a user