2 // AcceptEncodingConfig.cs
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 // (c) 2003 Ximian, Inc (http://www.ximian.com)
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System
.Collections
;
33 using System
.Collections
.Specialized
;
37 namespace Mono
.Http
.Configuration
39 public class AcceptEncodingConfig
41 Hashtable tbl
= CollectionsUtil
.CreateCaseInsensitiveHashtable ();
43 public AcceptEncodingConfig () : this (null)
47 public AcceptEncodingConfig (AcceptEncodingConfig parent
)
52 // FIXME: copy parent's config
55 public void Add (string encoding
, string type
)
57 tbl
[encoding
] = Type
.GetType (type
);
60 public bool SetFilter (HttpResponse response
, string acceptEncoding
)
62 if (acceptEncoding
== null)
65 acceptEncoding
= acceptEncoding
.Trim ();
66 if (acceptEncoding
== "")
69 string [] parts
= null;
70 if (acceptEncoding
.IndexOf (';') != -1)
71 parts
= acceptEncoding
.Split (';');
73 parts
= acceptEncoding
.Split (',');
81 foreach (string s
in parts
) {
83 ParseValue (s
, ref encoding
, ref weight
);
84 if (encoding
!= null && weight
> current
&& tbl
.Contains (encoding
)) {
85 type
= tbl
[encoding
] as Type
;
95 Stream filter
= response
.Filter
;
96 response
.Filter
= (Stream
) Activator
.CreateInstance (type
, new object [] {filter}
);
97 response
.AppendHeader ("Content-Encoding", name
);
106 static void ParseValue (string s
, ref string encoding
, ref float weight
)
108 //FIXME: make it more spec compliant
109 string [] parts
= s
.Trim ().Split (',');
110 if (parts
.Length
== 1) {
111 encoding
= parts
[0].Trim ();
113 } else if (parts
.Length
== 2) {
114 encoding
= parts
[0].Trim ();
116 int i
= parts
[1].IndexOf ('=');
118 weight
= Convert
.ToSingle (parts
[1].Substring (i
+ 1));