File: DefaultHttpHandler.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (130 lines) | stat: -rw-r--r-- 5,103 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//------------------------------------------------------------------------------
// <copyright file="DefaultHttpHandler.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------

namespace System.Web {

    using System;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Globalization;
    using System.Text;
    using System.Web.Util;    
    using System.Security.Permissions;
    
    public class DefaultHttpHandler : IHttpAsyncHandler {

        private HttpContext _context;
        private NameValueCollection _executeUrlHeaders;

        public DefaultHttpHandler() {
        }

        protected HttpContext Context {
            get { return _context; }
        }

        // headers to provide to execute url        
        protected NameValueCollection ExecuteUrlHeaders {
            get {
                if (_executeUrlHeaders == null && _context != null) {
                    _executeUrlHeaders = new NameValueCollection(_context.Request.Headers);
                }

                return _executeUrlHeaders; 
            }
        }

        // called when we know a precondition for calling
        // execute URL has been violated
        public virtual void OnExecuteUrlPreconditionFailure() {
            // do nothing - the derived class might throw
        }

        // add a virtual method that provides the request target for the EXECUTE_URL call
        // if return null, the default calls EXECUTE_URL for the default target
        public virtual String OverrideExecuteUrlPath() {
            return null;
        }

        internal static bool IsClassicAspRequest(String filePath) {
            return StringUtil.StringEndsWithIgnoreCase(filePath, ".asp");
        }

        [FileIOPermission(SecurityAction.Assert, Unrestricted = true)]
        private static string MapPathWithAssert(HttpContext context, string virtualPath) {
            return context.Request.MapPath(virtualPath);
        }

        public virtual IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) {

           // DDB 168193: DefaultHttpHandler is obsolate in integrated mode
           if (HttpRuntime.UseIntegratedPipeline) {
                throw new PlatformNotSupportedException(SR.GetString(SR.Method_Not_Supported_By_Iis_Integrated_Mode, "DefaultHttpHandler.BeginProcessRequest"));
           }

            _context = context;
            HttpResponse response = _context.Response;

            if (response.CanExecuteUrlForEntireResponse) {
                // use ExecuteUrl
                String path = OverrideExecuteUrlPath();

                if (path != null && !HttpRuntime.IsFullTrust) {
                    // validate that an untrusted derived classes (not in GAC)
                    // didn't set the path to a place that CAS wouldn't let it access
                    if (!this.GetType().Assembly.GlobalAssemblyCache) {
                        HttpRuntime.CheckFilePermission(MapPathWithAssert(context, path));
                    }
                }

                return response.BeginExecuteUrlForEntireResponse(path, _executeUrlHeaders, callback, state);
            }
            else {
                // let the base class throw if it doesn't want static files handler
                OnExecuteUrlPreconditionFailure();

                // use static file handler
                _context = null; // don't keep request data alive in sync case

                HttpRequest request = context.Request;

                // refuse POST requests
                if (request.HttpVerb == HttpVerb.POST) {
                    throw new HttpException(405, SR.GetString(SR.Method_not_allowed, request.HttpMethod, request.Path));
                }

                // refuse .asp requests
                if (IsClassicAspRequest(request.FilePath)) {
                    throw new HttpException(403, SR.GetString(SR.Path_forbidden, request.Path));
                }

                // default to static file handler
                StaticFileHandler.ProcessRequestInternal(context, OverrideExecuteUrlPath());

                // return async result indicating completion
                return new HttpAsyncResult(callback, state, true, null, null);
            }
        }

        public virtual void EndProcessRequest(IAsyncResult result) {
            if (_context != null) {
                HttpResponse response = _context.Response;
                _context = null;
                response.EndExecuteUrlForEntireResponse(result);
            }
        }

        public virtual void ProcessRequest(HttpContext context) {
            // this handler should never be called synchronously
            throw new InvalidOperationException(SR.GetString(SR.Cannot_call_defaulthttphandler_sync));
        }

        public virtual bool IsReusable {
            get { return false; }
        }
    }
}