<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[12936] trunk: improvements to custom content dir support, props nacin,
  see #11742</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.wordpress.org/changeset/12936">12936</a></dd>
<dt>Author</dt> <dd>wpmuguru</dd>
<dt>Date</dt> <dd>2010-02-03 18:19:56 +0000 (Wed, 03 Feb 2010)</dd>
</dl>

<h3>Log Message</h3>
<pre>improvements to custom content dir support, props nacin, see <a href="http://trac.wordpress.org/ticket/11742">#11742</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkwpadminincludeshtaccessms">trunk/wp-admin/includes/htaccess.ms</a></li>
<li><a href="#trunkwpincludesmsdefaultconstantsphp">trunk/wp-includes/ms-default-constants.php</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkwpincludesmsfilesphp">trunk/wp-includes/ms-files.php</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkwpcontentblogsphp">trunk/wp-content/blogs.php</a></li>
<li><a href="#trunkwpincludesblogsphp">trunk/wp-includes/blogs.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwpadminincludeshtaccessms"></a>
<div class="modfile"><h4>Modified: trunk/wp-admin/includes/htaccess.ms (12935 => 12936)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/includes/htaccess.ms        2010-02-03 17:37:15 UTC (rev 12935)
+++ trunk/wp-admin/includes/htaccess.ms        2010-02-03 18:19:56 UTC (rev 12936)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> #uploaded files
</span><span class="cx"> RewriteRule ^(.*/)?files/$ index.php [L]
</span><span class="cx"> RewriteCond %{REQUEST_URI} !.*wp-content/plugins.*
</span><del>-RewriteRule ^(.*/)?files/(.*) wp-includes/blogs.php?file=$2 [L]
</del><ins>+RewriteRule ^(.*/)?files/(.*) wp-includes/ms-files.php?file=$2 [L]
</ins><span class="cx"> 
</span><span class="cx"> # add a trailing slash to /wp-admin
</span><span class="cx"> RewriteCond %{REQUEST_URI} ^.*/wp-admin$
</span></span></pre></div>
<a id="trunkwpcontentblogsphp"></a>
<div class="delfile"><h4>Deleted: trunk/wp-content/blogs.php (12935 => 12936)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-content/blogs.php        2010-02-03 17:37:15 UTC (rev 12935)
+++ trunk/wp-content/blogs.php        2010-02-03 18:19:56 UTC (rev 12936)
</span><span class="lines">@@ -1,130 +0,0 @@
</span><del>-&lt;?php
-if ( !defined( 'SHORTINIT' ) ) {
-        define( 'SHORTINIT', true ); // this prevents most of WP from being loaded
-        require_once( dirname( dirname( __FILE__) ) . '/wp-load.php' ); // absolute includes are faster
-}
-
-if ( $current_blog-&gt;archived == '1' || $current_blog-&gt;spam == '1' || $current_blog-&gt;deleted == '1' ) {
-        status_header( 404 );
-        die('404 &amp;#8212; File not found.');
-}
-
-if ( !function_exists('wp_check_filetype') ) :
-function wp_check_filetype($filename, $mimes = null) {
-        // Accepted MIME types are set here as PCRE unless provided.
-        $mimes = is_array($mimes) ? $mimes : array (
-                'jpg|jpeg|jpe' =&gt; 'image/jpeg',
-                'gif' =&gt; 'image/gif',
-                'png' =&gt; 'image/png',
-                'bmp' =&gt; 'image/bmp',
-                'tif|tiff' =&gt; 'image/tiff',
-                'ico' =&gt; 'image/x-icon',
-                'asf|asx|wax|wmv|wmx' =&gt; 'video/asf',
-                'avi' =&gt; 'video/avi',
-                'mov|qt' =&gt; 'video/quicktime',
-                'mpeg|mpg|mpe' =&gt; 'video/mpeg',
-                'txt|c|cc|h' =&gt; 'text/plain',
-                'rtx' =&gt; 'text/richtext',
-                'css' =&gt; 'text/css',
-                'htm|html' =&gt; 'text/html',
-                'mp3|mp4' =&gt; 'audio/mpeg',
-                'ra|ram' =&gt; 'audio/x-realaudio',
-                'wav' =&gt; 'audio/wav',
-                'ogg' =&gt; 'audio/ogg',
-                'mid|midi' =&gt; 'audio/midi',
-                'wma' =&gt; 'audio/wma',
-                'rtf' =&gt; 'application/rtf',
-                'js' =&gt; 'application/javascript',
-                'pdf' =&gt; 'application/pdf',
-                'doc' =&gt; 'application/msword',
-                'pot|pps|ppt' =&gt; 'application/vnd.ms-powerpoint',
-                'wri' =&gt; 'application/vnd.ms-write',
-                'xla|xls|xlt|xlw' =&gt; 'application/vnd.ms-excel',
-                'mdb' =&gt; 'application/vnd.ms-access',
-                'mpp' =&gt; 'application/vnd.ms-project',
-                'swf' =&gt; 'application/x-shockwave-flash',
-                'class' =&gt; 'application/java',
-                'tar' =&gt; 'application/x-tar',
-                'zip' =&gt; 'application/zip',
-                'gz|gzip' =&gt; 'application/x-gzip',
-                'exe' =&gt; 'application/x-msdownload'
-        );
-
-        $type = false;
-        $ext = false;
-
-        foreach ( (array)$mimes as $ext_preg =&gt; $mime_match ) {
-                $ext_preg = '!\.(' . $ext_preg . ')$!i';
-                if ( preg_match($ext_preg, $filename, $ext_matches) ) {
-                        $type = $mime_match;
-                        $ext = $ext_matches[1];
-                        break;
-                }
-        }
-
-        return compact('ext', 'type');
-}
-endif;
-
-$file = BLOGUPLOADDIR . str_replace( '..', '', $_GET[ 'file' ] );
-if ( !is_file( $file ) ) {
-        status_header( 404 );
-        die('404 &amp;#8212; File not found.');
-}
-
-$mime = wp_check_filetype( $_SERVER[ 'REQUEST_URI' ] );
-if( $mime[ 'type' ] === false &amp;&amp; function_exists( 'mime_content_type' ) )
-                $mime[ 'type' ] = mime_content_type( $file );
-
-if( $mime[ 'type' ] != false ) {
-        $mimetype = $mime[ 'type' ];
-} else {
-        $ext = substr( $_SERVER[ 'REQUEST_URI' ], strrpos( $_SERVER[ 'REQUEST_URI' ], '.' ) + 1 );
-        $mimetype = &quot;image/$ext&quot;;
-}
-@header( 'Content-type: ' . $mimetype ); // always send this
-if ( false === strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) )
-        @header( 'Content-Length: ' . filesize( $file ) );
-
-// Optional support for X-Sendfile and X-Accel-Redirect
-if ( defined('WPMU_ACCEL_REDIRECT') &amp;&amp; WPMU_ACCEL_REDIRECT ) {
-        @header( 'X-Accel-Redirect: ' . str_replace( WP_CONTENT_DIR, '', $file ) );
-        exit;
-} elseif ( defined('WPMU_SENDFILE') &amp;&amp; WPMU_SENDFILE ) {
-        @header( 'X-Sendfile: ' . $file );
-        exit;
-}
-
-$last_modified = gmdate('D, d M Y H:i:s', filemtime( $file ));
-$etag = '&quot;' . md5($last_modified) . '&quot;';
-@header( &quot;Last-Modified: $last_modified GMT&quot; );
-@header( 'ETag: ' . $etag );
-@header( 'Expires: ' . gmdate('D, d M Y H:i:s', time() + 100000000) . ' GMT' );
-
-// Support for Conditional GET
-if (isset($_SERVER['HTTP_IF_NONE_MATCH']))
-        $client_etag = stripslashes($_SERVER['HTTP_IF_NONE_MATCH']);
-else
-        $client_etag = false;
-
-if( !isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) )
-        $_SERVER['HTTP_IF_MODIFIED_SINCE'] = false;
-$client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE']);
-// If string is empty, return 0. If not, attempt to parse into a timestamp
-$client_modified_timestamp = $client_last_modified ? strtotime($client_last_modified) : 0;
-
-// Make a timestamp for our most recent modification...
-$modified_timestamp = strtotime($last_modified);
-
-if ( ($client_last_modified &amp;&amp; $client_etag) ?
-         (($client_modified_timestamp &gt;= $modified_timestamp) &amp;&amp; ($client_etag == $etag)) :
-         (($client_modified_timestamp &gt;= $modified_timestamp) || ($client_etag == $etag)) ) {
-        status_header( 304 );
-        exit;
-}
-
-// If we made it this far, just serve the file
-
-readfile( $file );
-
-?&gt;
</del></span></pre></div>
<a id="trunkwpincludesblogsphp"></a>
<div class="delfile"><h4>Deleted: trunk/wp-includes/blogs.php (12935 => 12936)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/blogs.php        2010-02-03 17:37:15 UTC (rev 12935)
+++ trunk/wp-includes/blogs.php        2010-02-03 18:19:56 UTC (rev 12936)
</span><span class="lines">@@ -1,14 +0,0 @@
</span><del>-&lt;?php
-/**
- * Load mulitsite uploaded media
- *
- * @since 3.0.0
- *
- * @package WordPress
- * @subpackage Multisite
- */
-
-define( 'SHORTINIT', true );
-require_once( dirname( dirname( __FILE__) ) . '/wp-load.php' ); // absolute includes are faster
-require_once( WP_CONTENT_DIR . '/blogs.php' );
-exit();
</del></span></pre></div>
<a id="trunkwpincludesmsdefaultconstantsphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/ms-default-constants.php (12935 => 12936)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/ms-default-constants.php        2010-02-03 17:37:15 UTC (rev 12935)
+++ trunk/wp-includes/ms-default-constants.php        2010-02-03 18:19:56 UTC (rev 12936)
</span><span class="lines">@@ -54,6 +54,20 @@
</span><span class="cx">                         if ( !defined('COOKIE_DOMAIN') )
</span><span class="cx">                                         define('COOKIE_DOMAIN', '.' . $current_site-&gt;cookie_domain);
</span><span class="cx">                         break;
</span><ins>+                case 'ms-files' :
+                        /**
+                         * Optional support for X-Sendfile header
+                         * @since 3.0.0
+                         */
+                        if ( !defined( 'WPMU_SENDFILE' ) )
+                                define( 'WPMU_SENDFILE', false );
+                        /**
+                         * Optional support for X-Accel-Redirect header
+                         * @since 3.0.0
+                         */
+                        if ( !defined( 'WPMU_ACCEL_REDIRECT' ) )
+                                define( 'WPMU_ACCEL_REDIRECT', false );
+                        break;
</ins><span class="cx">         }
</span><span class="cx"> }
</span><span class="cx"> ?&gt;
</span><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkwpincludesmsfilesphpfromrev12935trunkwpincludesblogsphp"></a>
<div class="copfile"><h4>Copied: trunk/wp-includes/ms-files.php (from rev 12935, trunk/wp-includes/blogs.php) (0 => 12936)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/ms-files.php                                (rev 0)
+++ trunk/wp-includes/ms-files.php        2010-02-03 18:19:56 UTC (rev 12936)
</span><span class="lines">@@ -0,0 +1,137 @@
</span><ins>+&lt;?php
+/**
+ * Load mulitsite uploaded media
+ *
+ * @since 3.0.0
+ *
+ * @package WordPress
+ * @subpackage Multisite
+ */
+
+define( 'SHORTINIT', true );
+require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
+ms_default_constants( 'ms-files' );
+
+error_reporting(0);
+
+if ( $current_blog-&gt;archived == '1' || $current_blog-&gt;spam == '1' || $current_blog-&gt;deleted == '1' ) {
+        status_header( 404 );
+        die( '404 &amp;#8212; File not found.' );
+}
+
+if ( !function_exists('wp_check_filetype') ) :
+function wp_check_filetype($filename, $mimes = null) {
+        // Accepted MIME types are set here as PCRE unless provided.
+        $mimes = is_array($mimes) ? $mimes : array (
+                'jpg|jpeg|jpe' =&gt; 'image/jpeg',
+                'gif' =&gt; 'image/gif',
+                'png' =&gt; 'image/png',
+                'bmp' =&gt; 'image/bmp',
+                'tif|tiff' =&gt; 'image/tiff',
+                'ico' =&gt; 'image/x-icon',
+                'asf|asx|wax|wmv|wmx' =&gt; 'video/asf',
+                'avi' =&gt; 'video/avi',
+                'mov|qt' =&gt; 'video/quicktime',
+                'mpeg|mpg|mpe' =&gt; 'video/mpeg',
+                'txt|c|cc|h' =&gt; 'text/plain',
+                'rtx' =&gt; 'text/richtext',
+                'css' =&gt; 'text/css',
+                'htm|html' =&gt; 'text/html',
+                'mp3|mp4' =&gt; 'audio/mpeg',
+                'ra|ram' =&gt; 'audio/x-realaudio',
+                'wav' =&gt; 'audio/wav',
+                'ogg' =&gt; 'audio/ogg',
+                'mid|midi' =&gt; 'audio/midi',
+                'wma' =&gt; 'audio/wma',
+                'rtf' =&gt; 'application/rtf',
+                'js' =&gt; 'application/javascript',
+                'pdf' =&gt; 'application/pdf',
+                'doc' =&gt; 'application/msword',
+                'pot|pps|ppt' =&gt; 'application/vnd.ms-powerpoint',
+                'wri' =&gt; 'application/vnd.ms-write',
+                'xla|xls|xlt|xlw' =&gt; 'application/vnd.ms-excel',
+                'mdb' =&gt; 'application/vnd.ms-access',
+                'mpp' =&gt; 'application/vnd.ms-project',
+                'swf' =&gt; 'application/x-shockwave-flash',
+                'class' =&gt; 'application/java',
+                'tar' =&gt; 'application/x-tar',
+                'zip' =&gt; 'application/zip',
+                'gz|gzip' =&gt; 'application/x-gzip',
+                'exe' =&gt; 'application/x-msdownload'
+        );
+
+        $type = false;
+        $ext = false;
+
+        foreach ( (array) $mimes as $ext_preg =&gt; $mime_match ) {
+                $ext_preg = '!\.(' . $ext_preg . ')$!i';
+                if ( preg_match($ext_preg, $filename, $ext_matches) ) {
+                        $type = $mime_match;
+                        $ext = $ext_matches[1];
+                        break;
+                }
+        }
+
+        return compact('ext', 'type');
+}
+endif;
+
+$file = BLOGUPLOADDIR . str_replace( '..', '', $_GET[ 'file' ] );
+if ( !is_file( $file ) ) {
+        status_header( 404 );
+        die( '404 &amp;#8212; File not found.' );
+}
+
+$mime = wp_check_filetype( $_SERVER[ 'REQUEST_URI' ] );
+if( false === $mime[ 'type' ] &amp;&amp; function_exists( 'mime_content_type' ) )
+        $mime[ 'type' ] = mime_content_type( $file );
+
+if( $mime[ 'type' ] )
+        $mimetype = $mime[ 'type' ];
+else
+        $mimetype = 'image/' . substr( $_SERVER[ 'REQUEST_URI' ], strrpos( $_SERVER[ 'REQUEST_URI' ], '.' ) + 1 );
+
+header( 'Content-type: ' . $mimetype ); // always send this
+if ( false === strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) )
+        header( 'Content-Length: ' . filesize( $file ) );
+
+// Optional support for X-Sendfile and X-Accel-Redirect
+if ( WPMU_ACCEL_REDIRECT ) {
+        header( 'X-Accel-Redirect: ' . str_replace( WP_CONTENT_DIR, '', $file ) );
+        exit;
+} elseif ( WPMU_SENDFILE ) {
+        header( 'X-Sendfile: ' . $file );
+        exit;
+}
+
+$last_modified = gmdate( 'D, d M Y H:i:s', filemtime( $file ) );
+$etag = '&quot;' . md5( $last_modified ) . '&quot;';
+header( &quot;Last-Modified: $last_modified GMT&quot; );
+header( 'ETag: ' . $etag );
+header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 100000000 ) . ' GMT' );
+
+// Support for Conditional GET
+$client_etag = isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ? stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] ) : false;
+
+if( ! isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) )
+        $_SERVER['HTTP_IF_MODIFIED_SINCE'] = false;
+
+$client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
+// If string is empty, return 0. If not, attempt to parse into a timestamp
+$client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0;
+
+// Make a timestamp for our most recent modification...
+$modified_timestamp = strtotime($last_modified);
+
+if ( ( $client_last_modified &amp;&amp; $client_etag )
+        ? ( ( $client_modified_timestamp &gt;= $modified_timestamp) &amp;&amp; ( $client_etag == $etag ) )
+        : ( ( $client_modified_timestamp &gt;= $modified_timestamp) || ( $client_etag == $etag ) )
+        ) {
+        status_header( 304 );
+        exit;
+}
+
+// If we made it this far, just serve the file
+readfile( $file );
+
+?&gt;
</ins></span></pre></div>
<a id="trunkwpincludesmsfilesphp"></a>
<div class="propset"><h4>Property changes: trunk/wp-includes/ms-files.php</h4>
<pre class="diff"><span>
<span class="cx">Name: svn:mergeinfo
</span><span class="cx">   + 
</span></span></pre>
</div>
</div>

</body>
</html>