Examples/HttpListener/HttpListener.cdxml

<?xml version="1.0" encoding="utf-8"?>
<PowerShellMetadata xmlns="http://schemas.microsoft.com/cmdlets-over-objects/2009/11">
    <Class ClassName="System.Net.HttpListener" CmdletAdapter="PSAdapter">
        <Version>1.0</Version>
        <DefaultNoun>HttpListener</DefaultNoun>
        <InstanceCmdlets>
            <GetCmdletParameters>
                <QueryableProperties>
                    <Property PropertyName="IsListening">
                        <Type PSType="Switch" />
                        <RegularQuery AllowGlobbing="false">
                            <CmdletParameterMetadata ValueFromPipelineByPropertyName="true" />
                        </RegularQuery>
                    </Property>
                </QueryableProperties>
            </GetCmdletParameters>
            <Cmdlet>
                <CmdletMetadata Verb="Start" Noun="HttpListener"/>
                <Method MethodName="Start">
                    <ReturnValue>
                        <Type PSType='System.Void' />
                    </ReturnValue>
                </Method>
            </Cmdlet>
            <Cmdlet>
                <CmdletMetadata Verb="Stop" Noun="HttpListener"/>
                <Method MethodName="Stop">
                    <ReturnValue>
                        <Type PSType='System.Void' />
                    </ReturnValue>
                </Method>
            </Cmdlet>
            <Cmdlet>
                <CmdletMetadata Verb="Add" Noun="HttpListener"/>
                <Method MethodName="{param($prefix) $_.Prefixes.Add($Prefix)}">
                    <Parameters>
                        <Parameter ParameterName="Prefix">
                            <Type PSType="string" />
                            <CmdletParameterMetadata ValueFromPipelineByPropertyName="true" Position="0" />
                        </Parameter>
                    </Parameters>
                    <ReturnValue>
                        <Type PSType='System.Void' />
                    </ReturnValue>
                </Method>
            </Cmdlet>
            <Cmdlet>
                <CmdletMetadata Verb="Wait" Noun="HttpListener"/>
                <Method MethodName="GetContextAsync">
                    <ReturnValue>
                        <Type PSType='Net.HttpListenerContext' />
                    </ReturnValue>
                </Method>
            </Cmdlet>
            <Cmdlet>
                <CmdletMetadata Verb="Watch" Noun="HttpListener"/>
                <Method MethodName="Watch">
                    <Parameters>
                        <Parameter ParameterName="Handler">
                            <Type PSType="ScriptBlock" />
                            <CmdletParameterMetadata Aliases="OnRequest" ValueFromPipelineByPropertyName="true" Position="0" />
                        </Parameter>
                    </Parameters>
                    <ReturnValue>
                        <Type PSType='Management.Automation.Job' />
                    </ReturnValue>
                </Method>
            </Cmdlet>
        </InstanceCmdlets>
        <StaticCmdlets>
            <Cmdlet>
                <CmdletMetadata Verb="New" />
                <Method MethodName="new">
                    <ReturnValue>
                        <Type PSType="System.Net.HttpListener" />
                    </ReturnValue>
                </Method>
              </Cmdlet>
        </StaticCmdlets>
        <CmdletAdapterPrivateData>
            <Data Name="Watch-HttpListener.Watch">
                param($Handler)
                $httpListener = $_
                if (-not $httpListener.IsListening) {
                    $httpListener.Start()
                }
                if (-not $httpListener.IsListening) { return }
                Start-ThreadJob -ScriptBlock {
                    param([Collections.IDictionary]$Parameter)
                    foreach ($keyValue in $parameter.GetEnumerator()) {
                        $executionContext.SessionState.PSVariable.Set($keyValue.Key, $keyValue.Value)
                    }
                    while ($httpListener.IsListening) {
                        try {
                            $contextAsync = $httpListener.GetContextAsync()
                            $context = $contextAsync.Result
                            if ($handler) {
                                $handler.Invoke($context)
                            }
                        } catch {
                            Write-Error $_
                        }
                    }
                } -ArgumentList ([Ordered]@{
                    HttpListener = $HttpListener
                    Handler = $Handler
                }) -Name ($httpListener.Prefixes -join ';' -replace 'https?://' -replace 'localhost')
            </Data>
        </CmdletAdapterPrivateData>
    </Class>
</PowerShellMetadata>