Roxen.git / server / etc / modules / PropertySet.pike

version» Context lines:

Roxen.git/server/etc/modules/PropertySet.pike:10: Inside #if defined(DAV_DEBUG)
     #ifdef DAV_DEBUG   #define DAV_WERROR(X...) werror(X)   #else /* !DAV_DEBUG */   #define DAV_WERROR(X...)   #endif /* DAV_DEBUG */      //! Path for which these properties apply.   string path;    - //! Status information about @[path] as returned by @[stat_file()]. - Stat st; -  +    //! The current request.   RequestID id;      //! Create a new property set.   //!   //! Usually called via @[query_properties()]. - static void create(string path, Stat st, RequestID id) + static void create(string path, RequestID id)   {    global::path = path; -  global::st = st; +     global::id = id;   }      //! Destruction callback.   //!   //! Note that this function must unroll any uncommitted   //! property changes.   static void destroy()   {   }    -  + //! Return an @[Stdio.Stat] object for the resource. Its main use is + //! to tell collections (i.e. directories) from non-collections. + Stat get_stat(); +    //! Called by the default @[query_property] implementation to get the   //! response headers a GET or HEAD request on @[path] would yield.   //! It's used to fill in the properties that should reflect various   //! response headers.   mapping(string:string) get_response_headers();      private constant all_properties_common = (<    "DAV:getcontentlength",    "DAV:getcontenttype",    "DAV:displayname",
Roxen.git/server/etc/modules/PropertySet.pike:224:   //! @endstring   //!   //! Also, the MS DAV client requires a type argument to be able to   //! parse date/time fields correctly, even when they are formatted   //! according to the standard. @[XMLPropStatNode.add_property] has   //! special cases for this for @tt{DAV:creationdate@} and   //! @tt{DAV:getlastmodified@}.   multiset(string) query_all_properties()   {    multiset(string) props = -  (st->isreg ? all_properties_file : all_properties_dir) + (<>); +  (get_stat()->isreg ? all_properties_file : all_properties_dir) + (<>);       // This isn't necessary for the Content-Length and Content-Type    // headers since RequestID.make_response_headers always sets those.    mapping(string:string) hdrs = get_response_headers();    if (hdrs["Content-Language"]) props["DAV:getcontentlanguage"] = 1;    if (hdrs->ETag) props["DAV:getetag"] = 1;    if (hdrs["Last-Modified"]) props["DAV:getlastmodified"] = 1;       return props;   }
Roxen.git/server/etc/modules/PropertySet.pike:253:   //! Returning a string is shorthand for returning an array   //! with a single text node.   string|array(Parser.XML.Tree.Node)|mapping(string:mixed)    query_property(string prop_name)   {    switch(prop_name) {   #if 0    // We don't really have any idea of the creation time in a unix    // style file system.    case "DAV:creationdate": // RFC2518 13.1 -  int t = st->ctime; -  if (t > st->atime) t = st->atime; -  if (t > st->mtime) t = st->mtime; +  Stdio.Stat stat = get_stat(); +  int t = stat->ctime; +  if (t > stat->atime) t = stat->atime; +  if (t > stat->mtime) t = stat->mtime;    return Roxen.iso8601_date_time(t); // MS kludge.   #endif       case "DAV:displayname": // RFC2518 13.2    if ((path == "") || (path == "/")) return "/";    if (path[-1] == '/') return basename(path[..sizeof(path)-2]);    return basename(path);       case "DAV:getcontentlanguage":// RFC2518 13.3    return get_response_headers()["Content-Language"];
Roxen.git/server/etc/modules/PropertySet.pike:280:    case "DAV:getcontenttype": // RFC2518 13.5    return get_response_headers()["Content-Type"];       case "DAV:getetag": // RFC2518 13.6    return get_response_headers()->ETag;       case "DAV:getlastmodified": // RFC2518 13.7    return get_response_headers()["Last-Modified"];       case "DAV:resourcetype": // RFC2518 13.9 -  if (st->isdir) { +  if (get_stat()->isdir) {    return ({    Parser.XML.Tree.ElementNode("DAV:collection", ([])), // 12.2    });    }    return 0;       case "DAV:supportedlock": // RFC2518 13.11    return "";       case "http://apache.org/dav/props/executable":
Roxen.git/server/etc/modules/PropertySet.pike:303:    // Name: executable    // Namespace: http://apache.org/dav/props/    // Purpose: Describes the executable status of the resource.    // Value: "T" | "F" (case is significant)    // Description: This property is defined by mod_dav's default    // repository, the "filesystem" repository. It    // corresponds to the "executable" permission flag    // in most filesystems.    //    // This property is not defined on collections. -  if (st->isreg) { -  if (st->mode & 0111) return "T"; +  Stdio.Stat stat = get_stat(); +  if (stat->isreg) { +  if (stat->mode & 0111) return "T";    return "F";    }    break;      #if 0    // Need more interaction with directory listing modules to handle    // this.    case "DAV:defaultdocument": // draft-hopmann-collection-props-00 1.3    return "";   
Roxen.git/server/etc/modules/PropertySet.pike:326: Inside #if 0
   case "DAV:ishidden": // draft-hopmann-collection-props-00 1.6    return "0";       // Absence means not a structured document.    case "DAV:isstructureddocument": // draft-hopmann-collection-props-00 1.7    return "0";   #endif       case "DAV:iscollection": // draft-ietf-dasl-protocol-00 5.18    case "DAV:isfolder": // draft-hopmann-collection-props-00 1.5 -  if (st->isdir) { +  if (get_stat()->isdir) {    return "1";    }    return "0";      #if 0    // The following are properties in the DAV namespace    // that Microsoft has stolen.    case "DAV:isreadonly": // MS -  if (!(st->mode & 0222)) { +  if (!(get_stat()->mode & 0222)) {    return "1";    }    return "0";    case "DAV:isroot": // MS    if (path == "") return "1";    return "0";    case "DAV:lastaccessed": // MS -  return Roxen.iso8601_date_time(st->atime); +  return Roxen.iso8601_date_time(get_stat()->atime);    case "DAV:href": // MS    return sprintf("%s://%s%s%s%s",    id->port_obj->prot_name,    id->misc->host || id->port_obj->ip ||    gethostname(),    (id->port_obj->port == id->port_obj->port)?    "":(":"+(string)id->port_obj->port),    id->port_obj->path||"",    combine_path(query_location(), path));    case "DAV:contentclass": // MS