2009-11-23 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web / HttpResponseHeader.cs
index 82e30af95db1a30fe72c15c6a0f76579603839eb..47cc9e760a6eda96980755657201276add3a7385 100644 (file)
@@ -6,7 +6,7 @@
 //
 
 //
-// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2005-2009 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 
 using System.Collections;
 using System.Text;
+using System.Web.Configuration;
 
-namespace System.Web {
-
-       internal abstract class BaseResponseHeader {
-               public string Value;
+namespace System.Web
+{
+       abstract class BaseResponseHeader
+       {
+               string headerValue;
+               
+               public string Value {
+                       get { return headerValue; }
+                       set { headerValue = EncodeHeader (value); }
+               }
          
+               static bool headerCheckingEnabled;
+               
+               static BaseResponseHeader ()
+               {
+                       HttpRuntimeSection section = WebConfigurationManager.GetWebApplicationSection ("system.web/httpRuntime") as HttpRuntimeSection;
+                       headerCheckingEnabled = section == null || section.EnableHeaderChecking;
+               }
+
+
                internal BaseResponseHeader (string val)
                {
                        Value = val;
                }
 
+               string EncodeHeader (string value)
+               {
+                       if (value == null || value.Length == 0)
+                               return value;
+                       
+                       if (headerCheckingEnabled) {
+                               StringBuilder ret = new StringBuilder ();
+                               int len = value.Length;
+
+                               for (int i = 0; i < len; i++) {
+                                       switch (value [i]) {
+                                               case '\r':
+                                                       ret.Append ("%0d");
+                                                       break;
+
+                                               case '\n':
+                                                       ret.Append ("%0a");
+                                                       break;
+
+                                               default:
+                                                       ret.Append (value [i]);
+                                                       break;
+                                       }
+                               }
+
+                               return ret.ToString ();
+                       } else
+                               return value;
+               }
+               
                internal abstract void SendContent (HttpWorkerRequest wr);
        }