e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
178 lines
5.4 KiB
C#
178 lines
5.4 KiB
C#
//----------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//----------------------------------------------------------------
|
|
|
|
namespace System
|
|
{
|
|
using System.Collections.ObjectModel;
|
|
using System.Collections.Specialized;
|
|
using System.Runtime;
|
|
using System.Runtime.CompilerServices;
|
|
using System.ServiceModel.Channels;
|
|
using System.Net;
|
|
|
|
[TypeForwardedFrom("System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
|
|
public class UriTemplateMatch
|
|
{
|
|
Uri baseUri;
|
|
NameValueCollection boundVariables;
|
|
object data;
|
|
NameValueCollection queryParameters;
|
|
Collection<string> relativePathSegments;
|
|
Uri requestUri;
|
|
UriTemplate template;
|
|
Collection<string> wildcardPathSegments;
|
|
int wildcardSegmentsStartOffset = -1;
|
|
Uri originalBaseUri;
|
|
HttpRequestMessageProperty requestProp;
|
|
|
|
public UriTemplateMatch()
|
|
{
|
|
}
|
|
|
|
public Uri BaseUri // the base address, untouched
|
|
{
|
|
get
|
|
{
|
|
if (this.baseUri == null && this.originalBaseUri != null)
|
|
{
|
|
this.baseUri = UriTemplate.RewriteUri(this.originalBaseUri, this.requestProp.Headers[HttpRequestHeader.Host]);
|
|
}
|
|
return this.baseUri;
|
|
}
|
|
set
|
|
{
|
|
this.baseUri = value;
|
|
this.originalBaseUri = null;
|
|
this.requestProp = null;
|
|
}
|
|
}
|
|
public NameValueCollection BoundVariables // result of TryLookup, values are decoded
|
|
{
|
|
get
|
|
{
|
|
if (this.boundVariables == null)
|
|
{
|
|
this.boundVariables = new NameValueCollection();
|
|
}
|
|
return this.boundVariables;
|
|
}
|
|
}
|
|
public object Data
|
|
{
|
|
get
|
|
{
|
|
return this.data;
|
|
}
|
|
set
|
|
{
|
|
this.data = value;
|
|
}
|
|
}
|
|
public NameValueCollection QueryParameters // the result of UrlUtility.ParseQueryString (keys and values are decoded)
|
|
{
|
|
get
|
|
{
|
|
if (this.queryParameters == null)
|
|
{
|
|
PopulateQueryParameters();
|
|
}
|
|
return this.queryParameters;
|
|
}
|
|
}
|
|
public Collection<string> RelativePathSegments // entire Path (after the base address), decoded
|
|
{
|
|
get
|
|
{
|
|
if (this.relativePathSegments == null)
|
|
{
|
|
this.relativePathSegments = new Collection<string>();
|
|
}
|
|
return this.relativePathSegments;
|
|
}
|
|
}
|
|
public Uri RequestUri // uri on the wire, untouched
|
|
{
|
|
get
|
|
{
|
|
return this.requestUri;
|
|
}
|
|
set
|
|
{
|
|
this.requestUri = value;
|
|
}
|
|
}
|
|
public UriTemplate Template // which one got matched
|
|
{
|
|
get
|
|
{
|
|
return this.template;
|
|
}
|
|
set
|
|
{
|
|
this.template = value;
|
|
}
|
|
}
|
|
public Collection<string> WildcardPathSegments // just the Path part matched by "*", decoded
|
|
{
|
|
get
|
|
{
|
|
if (this.wildcardPathSegments == null)
|
|
{
|
|
PopulateWildcardSegments();
|
|
}
|
|
return this.wildcardPathSegments;
|
|
}
|
|
}
|
|
|
|
internal void SetQueryParameters(NameValueCollection queryParameters)
|
|
{
|
|
this.queryParameters = new NameValueCollection(queryParameters);
|
|
}
|
|
internal void SetRelativePathSegments(Collection<string> segments)
|
|
{
|
|
Fx.Assert(segments != null, "segments != null");
|
|
this.relativePathSegments = segments;
|
|
}
|
|
internal void SetWildcardPathSegmentsStart(int startOffset)
|
|
{
|
|
Fx.Assert(startOffset >= 0, "startOffset >= 0");
|
|
this.wildcardSegmentsStartOffset = startOffset;
|
|
}
|
|
|
|
internal void SetBaseUri(Uri originalBaseUri, HttpRequestMessageProperty requestProp)
|
|
{
|
|
this.baseUri = null;
|
|
this.originalBaseUri = originalBaseUri;
|
|
this.requestProp = requestProp;
|
|
}
|
|
|
|
void PopulateQueryParameters()
|
|
{
|
|
if (this.requestUri != null)
|
|
{
|
|
this.queryParameters = UriTemplateHelpers.ParseQueryString(this.requestUri.Query);
|
|
}
|
|
else
|
|
{
|
|
this.queryParameters = new NameValueCollection();
|
|
}
|
|
}
|
|
void PopulateWildcardSegments()
|
|
{
|
|
if (wildcardSegmentsStartOffset != -1)
|
|
{
|
|
this.wildcardPathSegments = new Collection<string>();
|
|
for (int i = this.wildcardSegmentsStartOffset; i < this.RelativePathSegments.Count; ++i)
|
|
{
|
|
this.wildcardPathSegments.Add(this.RelativePathSegments[i]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.wildcardPathSegments = new Collection<string>();
|
|
}
|
|
}
|
|
}
|
|
}
|