New test.
[mono.git] / mcs / class / Mono.Http / Mono.Http.Configuration / AcceptEncodingConfig.cs
1 //
2 // AcceptEncodingConfig.cs
3 //
4 // Authors:
5 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 //
7 // (c) 2003 Ximian, Inc (http://www.ximian.com)
8 //
9
10 //
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:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
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.
29 //
30
31 using System;
32 using System.Collections;
33 using System.Collections.Specialized;
34 using System.IO;
35 using System.Web;
36
37 namespace Mono.Http.Configuration
38 {
39         public class AcceptEncodingConfig
40         {
41                 Hashtable tbl = CollectionsUtil.CreateCaseInsensitiveHashtable ();
42
43                 public AcceptEncodingConfig () : this (null)
44                 {
45                 }
46                 
47                 public AcceptEncodingConfig (AcceptEncodingConfig parent)
48                 {
49                         if (parent == null)
50                                 return;
51
52                         // FIXME: copy parent's config
53                 }
54
55                 public void Add (string encoding, string type)
56                 {
57                         tbl [encoding] = Type.GetType (type);
58                 }
59
60                 public bool SetFilter (HttpResponse response, string acceptEncoding)
61                 {
62                         if (acceptEncoding == null)
63                                 return false;
64
65                         acceptEncoding = acceptEncoding.Trim ();
66                         if (acceptEncoding == "")
67                                 return false;
68                                 
69                         string [] parts = null;
70                         if (acceptEncoding.IndexOf (';') != -1)
71                                 parts = acceptEncoding.Split (';');
72                         else
73                                 parts = acceptEncoding.Split (',');
74
75                         string encoding;
76                         float weight = 0.0f;
77                         float current = 0.0f;
78                         Type type = null;
79                         string name = null;
80                         int i = 0;
81                         foreach (string s in parts) {
82                                 encoding = null;
83                                 ParseValue (s, ref encoding, ref weight);
84                                 if (encoding != null && weight > current && tbl.Contains (encoding)) {
85                                         type = tbl [encoding] as Type;
86                                         current = weight;
87                                         name = encoding;
88                                 }
89                                 i++;
90                         }
91
92                         if (type == null)
93                                 return false;
94
95                         Stream filter = response.Filter;
96                         response.Filter = (Stream) Activator.CreateInstance (type, new object [] {filter});
97                         response.AppendHeader ("Content-Encoding", name);
98                         return true;
99                 }
100
101                 public void Clear ()
102                 {
103                         tbl.Clear ();
104                 }
105                 
106                 static void ParseValue (string s, ref string encoding, ref float weight)
107                 {
108                         //FIXME: make it more spec compliant
109                         string [] parts = s.Trim ().Split (',');
110                         if (parts.Length == 1) {
111                                 encoding = parts [0].Trim ();
112                                 weight = 1.0f;
113                         } else if (parts.Length == 2) {
114                                 encoding = parts [0].Trim ();
115                                 try {
116                                         int i = parts [1].IndexOf ('=');
117                                         if (i != -1)
118                                                 weight = Convert.ToSingle (parts [1].Substring (i + 1));
119                                 } catch {
120                                         weight = 0.0f;
121                                 }
122                         } else {
123                                 //ignore
124                         }
125                 }
126         }
127 }
128