Jakoś niedawno spotkałem się z ciekawym zachowaniem właściwości ContentType na obiekcie HttpRequest. Najlepiej pokaże to prosty przykład.

                private void ProcessResponse(object sender, EventArgs e)
                {
                    HttpContext context = ((HttpApplication)sender).Context;
                    string contentType = context.Response.ContentType;

                    if (context.Request.HttpMethod == "GET" && contentType.Equals("text/html") && context.Response.StatusCode == 200 && context.CurrentHandler != null)
                    {
                        context.Response.Filter = new RemoveWhitespaceFilterStream(context);
                    }
                }

Kod wydaje się być dość prosty (notabene wzorowany na WebOptimizer.NET). Bierzemy requesty, które przychodzą do naszej aplikacji i przepuszczamy je przez kawałek kodu. Przy takim prostym nawet przykładzie natknąłem się na jego dziwne działanie.
Dwa niemal identycznie requesty:

curl 'http://app.localtest.me' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Connection: keep-alive' -H 'Host: app.localtest.me' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0'

oraz

curl 'http:/app.localtest.me' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Connection: keep-alive' -H 'Host: app.localtest.me'

Zapytania nie różnią się wiele poza tym, że drugie nie ma nagłówka User-Agent, które (z grubsza) określa z jakiej przeglądarki przyszedł request. Pozostałe parametry takie same. Wyniki uruchomienia takich zapytań się różnią. W drugim przypadku spacje nie zostają usunięte!

WTF?

Po chwili z debuggerem okazuje się, że problem jest z wspomnianą w tytule właściwością ContentType. Okazuje się, że gdy mamy ustawiony nagłówek User-Agent zwraca ona text/html i spacje są usuwane. Gdy User-Agent’a brakuje zwracanym typem jest application/xml+html. WTFx2?

Czy to bug w implementacji czy może celowe zachowanie? Przy najbliższej okazji, trzeba będzie podłubać… a na razie pozostaje wykrywać i uważać, na takie dziwne zachowania.

dotnetomaniak.pl

Spodobał ci się ten artykuł?
Poleć go innym na http://dotnetomaniak.pl

Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl