Well, this is finally the patch to allow virtual resources, e.g.
remoting and http handlers, to serve content.

Who would like to experiment?  I only got as far as writing the patch
before I was blindsided by work/life stuff to address.

See http://httpd.apache.org/dev/dist/ for the .2003 build version in
about 2 hours from now (have to wait for the server to sync up.)

Looking at the bug reports, the only other feature to introduce is to
allow ASP.NET to push out the error bodies, instead of leaving that
up to Apache, as desired.  Probably we should add AspNet errors as the
flag to control that.

Bill

[EMAIL PROTECTED] wrote:
Author: wrowe
Date: Wed Sep 14 09:50:41 2005
New Revision: 280884

URL: http://svn.apache.org/viewcvs?rev=280884&view=rev
Log:

  Introduce the AspNet directive, to replace the test of Options ExecCGI.

  Now, to actually permit ASP.NET content, we need to test the following;

    To serve a real file       AspNet files
    To serve a directory       AspNet directories  (or simply dirs)
    To serve not-a-file        AspNet virtual

    To serve any URL           AspNet all          (or simply on)

  These can be combined, e.g. 'AspNet files virtual' would be valid, and
  Apache would continue to serve directories.

Modified:
    httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp

Modified: httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp
URL: 
http://svn.apache.org/viewcvs/httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp?rev=280884&r1=280883&r2=280884&view=diff
==============================================================================
--- httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp (original)
+++ httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp Wed Sep 14 09:50:41 2005
@@ -184,8 +184,75 @@
     return NULL;
 }
+
+typedef enum {
+    ASPNET_OFF     =   0,
+    ASPNET_UNSET   = 2^0, // Must be a value, better to avoid legal bits
+    ASPNET_FILES   = 2^1,
+    ASPNET_DIRS    = 2^2,
+    ASPNET_VIRTUAL = 2^3
+} asp_net_enable_t;
+
+typedef struct asp_net_dirconf_t {
+    int enable;  // Bit flags of asp_net_enable_t values
+} asp_net_dirconf_t;
+
+static void *create_asp_net_dirconf(apr_pool_t *p, char *dummy)
+{
+    asp_net_dirconf_t *dirconf;
+    dirconf = (asp_net_dirconf_t*)apr_palloc(p, sizeof(asp_net_dirconf_t));
+    dirconf->enable = ASPNET_UNSET;
+    return dirconf;
+}
+
+static void *merge_asp_net_dirconf(apr_pool_t *p, void *basev, void *addv)
+{
+    asp_net_dirconf_t *base = (asp_net_dirconf_t*)basev;
+    asp_net_dirconf_t *add = (asp_net_dirconf_t*)addv;
+ asp_net_dirconf_t *res = + (asp_net_dirconf_t*)apr_palloc(p, sizeof(asp_net_dirconf_t));
+    res->enable = (add->enable == ASPNET_UNSET) ? base->enable
+                                                : add->enable;
+    return add;
+}
+
+static const char *set_aspnet_enable(cmd_parms *cmd, void *dirconf_, + const char *enables)
+{
+    asp_net_dirconf_t *dirconf = (asp_net_dirconf_t *)dirconf_;
+
+    // Unset the AspNet flags before we toggle specific choices
+    dirconf->enable = ASPNET_OFF;
+
+    while (*enables) {
+        const char *enable = ap_getword_conf(cmd->pool, &enables);
+
+        if      (!strcasecmp(enable, "on")
+              || !strcasecmp(enable, "all"))
+            dirconf->enable = ASPNET_FILES | ASPNET_DIRS | ASPNET_VIRTUAL;
+ else if (!strcasecmp(enable, "off") + || !strcasecmp(enable, "none"))
+            dirconf->enable = ASPNET_OFF;
+ else if (!strcasecmp(enable, "files")) + dirconf->enable |= ASPNET_FILES;
+        else if (!strcasecmp(enable, "dirs")
+ || !strcasecmp(enable, "directories")) + dirconf->enable |= ASPNET_DIRS; + else if (!strcasecmp(enable, "virtual")) + dirconf->enable |= ASPNET_VIRTUAL;
+        else {
+ return apr_pstrcat(cmd->pool, "Unrecognized AspNet option ", + enable, NULL);
+        }
+    }
+    return NULL;
+}
+
+
 static const command_rec asp_net_cmds[] =
 {
+    AP_INIT_RAW_ARGS("AspNet", (cmd_func)set_aspnet_enable, NULL, OR_OPTIONS,
+        "Allow ASP.NET to serve 'Files', 'Dirs', 'Virtual', 'All', or 'None'"),
     AP_INIT_TAKE1("AspNetVersion", (cmd_func)version_cmd, NULL, RSRC_CONF,
         "Select a specific ASP.NET version in the format v#.#.####"),
     AP_INIT_TAKE2("AspNetMount", (cmd_func)mount_cmd, NULL, RSRC_CONF,
@@ -433,13 +500,6 @@
         return DECLINED;
     }
- if (r->finfo.filetype != APR_REG) { - ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r, - "mod_aspdotnet: File not found or unable to stat: %s",
-                r->filename);
-        return HTTP_NOT_FOUND;
-    }
-
     if (!r->uri || (r->uri[0] != '/')) {
ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r, "mod_aspdotnet: Forbidden, request URI was not absolute: %s",
@@ -447,12 +507,48 @@
         return HTTP_FORBIDDEN;
     }
- if (!(ap_allow_options(r) & OPT_EXECCGI)) - { + asp_net_dirconf_t *dirconf = + (asp_net_dirconf_t *)ap_get_module_config(r->per_dir_config,
+                                                      &aspdotnet_module);
+
+    if (r->finfo.filetype == APR_REG) {
+ if (!(dirconf->enable & ASPNET_FILES)) + { + ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r, + "mod_aspdotnet: Forbidden, 'AspNet Files' is not enabled for: %s"
+                    " (file %s)", r->uri, r->filename);
+            return HTTP_FORBIDDEN;
+        }
+    }
+    else if (r->finfo.filetype == APR_DIR) {
+ if (!(dirconf->enable & ASPNET_DIRS)) + { + ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r, + "mod_aspdotnet: Forbidden, 'AspNet Dirs' is not enabled for: %s"
+                    " (directory %s)", r->uri, r->filename);
+            return HTTP_FORBIDDEN;
+        }
+    }
+    else if (!r->finfo.filetype) {
+ if (!(dirconf->enable & ASPNET_VIRTUAL)) + { + ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r, + "mod_aspdotnet: Forbidden, 'AspNet Virtual'"
+                    "is not enabled for: %s", r->uri);
+ if (dirconf->enable & (ASPNET_FILES | ASPNET_DIRS)) + { + ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r, + "mod_aspdotnet: File not found or unable to stat: %s",
+                        r->filename);
+            }
+            return HTTP_NOT_FOUND;
+        }
+    }
+    else {
ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, r, - "mod_aspdotnet: Forbidden, Options ExecCGI is not set for: %s",
-                r->filename);
-        return HTTP_FORBIDDEN;
+                "mod_aspdotnet: Invalid file type for: %s (it is not "
+                "a recognized file or directory)", r->filename);
+        return HTTP_NOT_FOUND;
     }
if ((r->used_path_info == AP_REQ_REJECT_PATH_INFO) &&
@@ -705,10 +801,10 @@
 module AP_MODULE_DECLARE_DATA ::aspdotnet_module =
 {
     STANDARD20_MODULE_STUFF,
-    NULL,                       /* dir config */
-    NULL,                       /* merge dir config */
-    create_asp_net_srvconf,       /* server config */
-    merge_asp_net_srvconf,       /* merge server config */
+    create_asp_net_dirconf,     /* dir config */
+    merge_asp_net_dirconf,      /* merge dir config */
+    create_asp_net_srvconf,     /* server config */
+    merge_asp_net_srvconf,      /* merge server config */
     asp_net_cmds,               /* command apr_table_t */
     register_hooks              /* register hooks */
 };




Reply via email to