1. C# / Говнокод #13303

    +117

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    if (!authorized)
    {
        // No, "I'm a teapot" is not what we really want, but the BuildMaster security module will
        // replace it with a 401 (which we actually want)
        context.Response.StatusCode = 418;
        context.Response.Write("Not authorized");
        context.Response.AddHeader("WWW-Authenticate", "Basic realm=\"BuildMaster URL Trigger\"");
        context.ApplicationInstance.CompleteRequest();
        return;
    }
    
    ...
    
    context.EndRequest += (s,e) =>
    {
        HttpApplication app = (HttpApplication)s;
        if (app.Context.Response.StatusCode == 418)
            app.Context.Response.StatusCode = 401;
    }

    http://blog.inedo.com/2010/10/12/http-418-im-a-teapot-finally-a-%E2%80%9Clegitimate%E2%80%9D-use/

    Костыль для обхода "шибко умного" поведения ASP.NET Forms Authentication, который меняет код 401 на 302-перенаправление на форму логина. А разработчику нужен именно 401.

    Запостил: someone, 04 Июля 2013

    Комментарии (4) RSS

    • Ещё и IHttpModule для этого наваял...
      http://i1220.photobucket.com/albums/dd445/pimpamlacasitos/obama-not-bad.jpg
      Ответить
      • Мне особенно нравится, что тут сначала Write, а уже потом AddHeader. ASP.NET так умеет? Он что, буферизует выходной поток?
        Ответить
        • Да. Заголовки пишутся в NameValueCollection, а Write в TextWriter. И потом при вызове метода Flush уходят в ISAPI хендлер.
          Это в случае, если разработчик решит, скажем, ловить события завершения генерации всех классов наследующих IHttpHandler или IHttpModule.

          Но есть и более прямолинейные варианты, которые пишут сразу в исходящий поток.
          Ответить
    • Eks,yekj)
      Ответить

    Добавить комментарий