web-dev-qa-db-fra.com

Comment définir useUnsafeHeaderParsing dans le code

Je reçois l'exception suivante:

Le serveur a commis une violation de protocole. Section = ResponseHeader Detail = CR doit être suivi de LF

De cette question:

HttpWebRequestError: le serveur a commis une violation de protocole. Section = ResponseHeader Detail = CR doit être suivi de LF

Je comprends que je dois définir useUnsafeHeaderParsing sur True. 

Voici mon code:

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
WebResponse myResp = myReq.GetResponse(); //exception is thrown here

useUnsafeHeaderParsing est une propriété de la classe HttpWebRequestElement.

Comment puis-je l'intégrer dans le code ci-dessus?

17
Barka

Vous devez définir ceci dans votre section web.config, dans la section <system.net>, comme suit:

<system.net> 
  <settings> 
   <httpWebRequest useUnsafeHeaderParsing="true" /> 
  </settings> 
</system.net> 

Si, pour une raison quelconque, vous ne souhaitez pas le faire à partir de votre configuration, vous pouvez le faire à partir de code en définissant de manière pragmatique vos paramètres de configuration. Voir cette page pour un exemple.

31
Edwin de Koning

Comme Edwin l'a souligné, vous devez définir l'attribut useUnsafeHeaderParsing dans votre fichier web.config ou app.config. Si vous voulez vraiment changer la valeur de manière dynamique au moment de l'exécution, vous devrez alors recourir à la réflexion car la valeur est enterrée dans une instance de System.Net.Configuration.SettingsSectionInternal et n'est pas accessible au public.

Voici un exemple de code (basé sur l'info trouvée ici ) qui fait l'affaire:

using System;
using System.Net;
using System.Net.Configuration;
using System.Reflection;

namespace UnsafeHeaderParsingSample
{
    class Program
    {
        static void Main()
        {
            // Enable UseUnsafeHeaderParsing
            if (!ToggleAllowUnsafeHeaderParsing(true))
            {
                // Couldn't set flag. Log the fact, throw an exception or whatever.
            }

            // This request will now allow unsafe header parsing, i.e. GetResponse won't throw an exception.
            var request = (HttpWebRequest) WebRequest.Create("http://localhost:8000");
            var response = request.GetResponse();

            // Disable UseUnsafeHeaderParsing
            if (!ToggleAllowUnsafeHeaderParsing(false))
            {
                // Couldn't change flag. Log the fact, throw an exception or whatever.
            }

            // This request won't allow unsafe header parsing, i.e. GetResponse will throw an exception.
            var strictHeaderRequest = (HttpWebRequest)WebRequest.Create("http://localhost:8000");
            var strictResponse = strictHeaderRequest.GetResponse();
        }

        // Enable/disable useUnsafeHeaderParsing.
        // See http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline/
        public static bool ToggleAllowUnsafeHeaderParsing(bool enable)
        {
            //Get the Assembly that contains the internal class
            Assembly assembly = Assembly.GetAssembly(typeof(SettingsSection));
            if (Assembly != null)
            {
                //Use the Assembly in order to get the internal type for the internal class
                Type settingsSectionType = Assembly.GetType("System.Net.Configuration.SettingsSectionInternal");
                if (settingsSectionType != null)
                {
                    //Use the internal static property to get an instance of the internal settings class.
                    //If the static instance isn't created already invoking the property will create it for us.
                    object anInstance = settingsSectionType.InvokeMember("Section",
                    BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.NonPublic, null, null, new object[] { });
                    if (anInstance != null)
                    {
                        //Locate the private bool field that tells the framework if unsafe header parsing is allowed
                        FieldInfo aUseUnsafeHeaderParsing = settingsSectionType.GetField("useUnsafeHeaderParsing", BindingFlags.NonPublic | BindingFlags.Instance);
                        if (aUseUnsafeHeaderParsing != null)
                        {
                            aUseUnsafeHeaderParsing.SetValue(anInstance, enable);
                            return true;
                        }

                    }
                }
            }
            return false;
        }
    }
}
26
afrischke

Si vous ne voulez pas utiliser Reflection, vous pouvez essayer ce code (référence System.Configuration.dll):

using System.Configuration;
using System.Net.Configuration;

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var settings = (SettingsSection)config.GetSection("system.net/settings");
settings.HttpWebRequest.UseUnsafeHeaderParsing = true;
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("system.net/settings");
0
Geograph