IIS/Get-IisMimeMap.ps1

# Copyright 2012 Aaron Jensen
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

function Get-IisMimeMap
{
    <#
    .SYNOPSIS
    Gets the file extension to MIME type mappings.
     
    .DESCRIPTION
    IIS won't serve static content unless there is an entry for it in the web server or website's MIME map configuration. This function will return all the MIME maps for the current server. The objects returned are instances of the `Carbon.Iis.MimeMap` class, and contain the following properties:
     
     * `FileExtension`: the mapping's file extension
     * `MimeType`: the mapping's MIME type
     
    .OUTPUTS
    Carbon.Iis.MimeMap.
     
    .LINK
    Set-IisMimeMap
     
    .EXAMPLE
    Get-IisMimeMap
     
    Gets all the the file extension to MIME type mappings for the web server.
     
    .EXAMPLE
    Get-IisMimeMap -FileExtension .htm*
     
    Gets all the file extension to MIME type mappings whose file extension matches the `.htm*` wildcard.
     
    .EXAMPLE
    Get-IisMimeMap -MimeType 'text/*'
     
    Gets all the file extension to MIME type mappings whose MIME type matches the `text/*` wildcard.
     
    .EXAMPLE
    Get-IisMimeMap -SiteName DeathStar
     
    Gets all the file extenstion to MIME type mappings for the `DeathStar` website.
     
    .EXAMPLE
    Get-IisMimeMap -SiteName DeathStar -VirtualPath ExhaustPort
     
    Gets all the file extension to MIME type mappings for the `DeathStar`'s `ExhausePort` directory.
    #>

    [CmdletBinding(DefaultParameterSetName='ForWebServer')]
    [OutputType([Carbon.Iis.MimeMap])]
    param(
        [Parameter(Mandatory=$true,ParameterSetName='ForWebsite')]
        [string]
        # The website whose MIME mappings to return. If not given, returns the web server's MIME map.
        $SiteName,
        
        [Parameter(ParameterSetName='ForWebsite')]
        [Alias('Path')]
        [string]
        # The directory under the website whose MIME mappings to return. Optional.
        $VirtualPath = '',
        
        [string]
        # The name of the file extensions to return. Wildcards accepted.
        $FileExtension = '*',
        
        [string]
        # The name of the MIME type(s) to return. Wildcards accepted.
        $MimeType = '*'
    )

    Set-StrictMode -Version 'Latest'
    
    $getIisConfigSectionParams = @{ }
    if( $PSCmdlet.ParameterSetName -eq 'ForWebsite' )
    {
        $getIisConfigSectionParams['SiteName'] = $SiteName
        $getIisConfigSectionParams['VirtualPath'] = $VirtualPath
    }

    $staticContent = Get-IisConfigurationSection -SectionPath 'system.webServer/staticContent' @getIisConfigSectionParams
    $staticContent.GetCollection() | 
        Where-Object { $_['fileExtension'] -like $FileExtension -and $_['mimeType'] -like $MimeType } |
        ForEach-Object {
            New-Object 'Carbon.Iis.MimeMap' ($_['fileExtension'],$_['mimeType'])
        }
}