Jeff Hardy avatar Jeff Hardy committed 149efe7

Initial commit of HttpHandler for Owin.

Comments (0)

Files changed (13)

+glob:*.suo
+glob:*.user
+glob:obj/Debug

Example/Example.csproj

+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>
+    </ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{74A43F31-41EB-4354-B17E-B7CC106B72D4}</ProjectGuid>
+    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Example</RootNamespace>
+    <AssemblyName>Example</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Web.ApplicationServices" />
+    <Reference Include="System.Web.DynamicData" />
+    <Reference Include="System.Web.Entity" />
+    <Reference Include="System.Web.Extensions" />
+    <Reference Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Web.config">
+      <SubType>Designer</SubType>
+    </Content>
+    <Content Include="Web.Debug.config">
+      <DependentUpon>Web.config</DependentUpon>
+    </Content>
+    <Content Include="Web.Release.config">
+      <DependentUpon>Web.config</DependentUpon>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TestApp.cs" />
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <ProjectReference Include="..\Owin.AspNet\Owin.AspNet.csproj">
+      <Project>{15EE0B85-9687-40AD-B05F-F172B4AC2AD3}</Project>
+      <Name>Owin.AspNet</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
+        <WebProjectProperties>
+          <UseIIS>False</UseIIS>
+          <AutoAssignPort>True</AutoAssignPort>
+          <DevelopmentServerPort>11595</DevelopmentServerPort>
+          <DevelopmentServerVPath>/</DevelopmentServerVPath>
+          <IISUrl>
+          </IISUrl>
+          <NTLMAuthentication>False</NTLMAuthentication>
+          <UseCustomServer>False</UseCustomServer>
+          <CustomServerUrl>
+          </CustomServerUrl>
+          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
+        </WebProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

Example/Properties/AssemblyInfo.cs

+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Example")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Jeff Hardy")]
+[assembly: AssemblyProduct("Example")]
+[assembly: AssemblyCopyright("Copyright © Jeff Hardy 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("54695b8c-33e2-401c-aaf9-42a3474f40f3")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("0.0.1.0")]
+[assembly: AssemblyFileVersion("0.0.1.0")]

Example/TestApp.cs

+/* **************************************************************************
+ *
+ * Copyright 2011 Jeff Hardy
+ *
+ * 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.
+ *
+ * *************************************************************************/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Example
+{
+    public class TestApp
+    {
+        public void Run(IDictionary<string, object> environ,
+                Action<string, Dictionary<string, IList<string>>, IEnumerable<object>> response,
+                Action<Exception> error) {
+
+                response("200 OK",
+                    new Dictionary<string, IList<string>> {
+                        { "Content-Type", new [] { "text/plain" } }
+                    },
+                    new[] { Encoding.UTF8.GetBytes("Hello, World!") }
+                );
+        }
+    }
+}

Example/Web.Debug.config

+<?xml version="1.0"?>
+
+<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
+
+<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
+  <!--
+    In the example below, the "SetAttributes" transform will change the value of 
+    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
+    finds an atrribute "name" that has a value of "MyDB".
+    
+    <connectionStrings>
+      <add name="MyDB" 
+        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
+        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
+    </connectionStrings>
+  -->
+  <system.web>
+    <!--
+      In the example below, the "Replace" transform will replace the entire 
+      <customErrors> section of your web.config file.
+      Note that because there is only one customErrors section under the 
+      <system.web> node, there is no need to use the "xdt:Locator" attribute.
+      
+      <customErrors defaultRedirect="GenericError.htm"
+        mode="RemoteOnly" xdt:Transform="Replace">
+        <error statusCode="500" redirect="InternalError.htm"/>
+      </customErrors>
+    -->
+  </system.web>
+</configuration>

Example/Web.Release.config

+<?xml version="1.0"?>
+
+<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
+
+<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
+  <!--
+    In the example below, the "SetAttributes" transform will change the value of 
+    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
+    finds an atrribute "name" that has a value of "MyDB".
+    
+    <connectionStrings>
+      <add name="MyDB" 
+        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
+        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
+    </connectionStrings>
+  -->
+  <system.web>
+    <compilation xdt:Transform="RemoveAttributes(debug)" />
+    <!--
+      In the example below, the "Replace" transform will replace the entire 
+      <customErrors> section of your web.config file.
+      Note that because there is only one customErrors section under the 
+      <system.web> node, there is no need to use the "xdt:Locator" attribute.
+      
+      <customErrors defaultRedirect="GenericError.htm"
+        mode="RemoteOnly" xdt:Transform="Replace">
+        <error statusCode="500" redirect="InternalError.htm"/>
+      </customErrors>
+    -->
+  </system.web>
+</configuration>

Example/Web.config

+<?xml version="1.0"?>
+<configuration>
+    <configSections>
+        <section name="owin" type="Owin.AspNet.OwinConfig"/>
+    </configSections>
+    <appSettings/>
+    <connectionStrings/>
+    <system.web>
+        <compilation debug="true" targetFramework="4.0">
+        </compilation>
+        <authentication mode="Windows"/>
+        <httpHandlers>
+            <clear />
+            <add path="*" verb="*" type="Owin.AspNet.OwinHttpAsyncHandler" />
+        </httpHandlers>
+    </system.web>
+    <owin type="Example.TestApp, Example" method="Run"/>
+</configuration>
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Owin.AspNet", "Owin.AspNet\Owin.AspNet.csproj", "{15EE0B85-9687-40AD-B05F-F172B4AC2AD3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example", "Example\Example.csproj", "{74A43F31-41EB-4354-B17E-B7CC106B72D4}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{15EE0B85-9687-40AD-B05F-F172B4AC2AD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{15EE0B85-9687-40AD-B05F-F172B4AC2AD3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{15EE0B85-9687-40AD-B05F-F172B4AC2AD3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{15EE0B85-9687-40AD-B05F-F172B4AC2AD3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{74A43F31-41EB-4354-B17E-B7CC106B72D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{74A43F31-41EB-4354-B17E-B7CC106B72D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{74A43F31-41EB-4354-B17E-B7CC106B72D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{74A43F31-41EB-4354-B17E-B7CC106B72D4}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

Owin.AspNet/Owin.AspNet.csproj

+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{15EE0B85-9687-40AD-B05F-F172B4AC2AD3}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Owin.AspNet</RootNamespace>
+    <AssemblyName>Owin.AspNet</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Web" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="OwinHttpAsyncHandler.cs" />
+    <Compile Include="OwinConfig.cs" />
+    <Compile Include="OwinHttpHandler.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

Owin.AspNet/OwinConfig.cs

+/* **************************************************************************
+ *
+ * Copyright 2011 Jeff Hardy
+ *
+ * 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.
+ *
+ * *************************************************************************/
+
+using System.Configuration;
+
+namespace Owin.AspNet
+{
+    public class OwinConfig : ConfigurationSection
+    {
+        public static OwinConfig Load()
+        {
+            return (OwinConfig)ConfigurationManager.GetSection("owin") as OwinConfig;
+        }
+
+        [ConfigurationProperty("type")]
+        public string AppType {
+            get { return (string)this["type"]; }
+            set { this["type"] = value; }
+        }
+
+        [ConfigurationProperty("method")]
+        public string AppMethod {
+            get { return (string)this["method"]; }
+            set { this["method"] = value; }
+        }
+    }
+}

Owin.AspNet/OwinHttpAsyncHandler.cs

+/* **************************************************************************
+ *
+ * Copyright 2011 Jeff Hardy
+ *
+ * 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.
+ *
+ * *************************************************************************/
+
+using System;
+using System.Collections.Generic;
+using System.Web;
+
+namespace Owin.AspNet
+{
+    using AppAction = Action<
+                IDictionary<string, object>,
+                Action<string, Dictionary<string, IList<string>>, IEnumerable<object>>,
+                Action<Exception>>;
+
+    class OwinHttpAsyncHandler : OwinHttpHandler, IHttpAsyncHandler
+    {
+        private AppAction app;
+        
+        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) {
+            app = LoadApp();
+            var env = CreateEnvironment(context);
+
+            return app.BeginInvoke(
+                env,
+                (status, headers, body) => Response(context, status, headers, body),
+                (e) => Error(context, e),
+                cb,
+                extraData
+            );
+        }
+
+        public void EndProcessRequest(IAsyncResult result) {
+            app.EndInvoke(result);
+
+            if(error != null)
+                throw error;
+        }
+    }
+}

Owin.AspNet/OwinHttpHandler.cs

+/* **************************************************************************
+ *
+ * Copyright 2011 Jeff Hardy
+ *
+ * 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.
+ *
+ * *************************************************************************/
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Web;
+
+namespace Owin.AspNet
+{
+    using AppAction = Action<
+                IDictionary<string, object>,
+                Action<string, Dictionary<string, IList<string>>, IEnumerable<object>>,
+                Action<Exception>>;
+    using AsyncResponseAction = Action<Action<object>, Action<Exception>>;
+    using RequestBodyAction = Action<byte[], int, int, Action<int>, Action<Exception>>;
+
+    public class OwinHttpHandler : IHttpHandler
+    {
+        protected Exception error;
+        
+        public bool IsReusable {
+            get { return false; }
+        }
+
+        public void ProcessRequest(HttpContext context) {
+            var app = LoadApp();
+            var env = CreateEnvironment(context);
+
+            app(
+                env,
+                (status, headers, body) => Response(context, status, headers, body),
+                (e) => Error(context, e)
+            );
+
+            if(error != null)
+                throw error;
+        }
+
+        protected static AppAction LoadApp() {
+            var config = OwinConfig.Load();
+
+            var appType = Type.GetType(config.AppType);
+            var method = appType.GetMethod(config.AppMethod);
+            object obj = method.IsStatic ? null : Activator.CreateInstance(appType);
+            var app = (AppAction)AppAction.CreateDelegate(typeof(AppAction), obj, method);
+            return app;
+        }
+
+        protected static IDictionary<string, object> CreateEnvironment(HttpContext context)
+        {
+            var request = context.Request;
+
+            return new Dictionary<string, object>()
+            {
+                { "owin.RequestMethod", request.HttpMethod },
+                { "owin.RequestUri", string.Format("{0}?{1}", request.PathInfo, request.QueryString) },
+                { "owin.RequestHeaders", request.Headers.Keys.Cast<string>().ToDictionary(k => k, k => new List<string>(request.Headers.GetValues(k))) },
+                { "owin.RequestBody", new RequestBodyAction(
+                    (buffer, offset, count, result, appError) => Body(context, buffer, offset, count, result, appError)
+                ) },
+                { "owin.BaseUri", request.ApplicationPath },
+                { "owin.ServerName", request.ServerVariables["SERVER_NAME"] },
+                { "owin.ServerPort", request.ServerVariables["SERVER_PORT"] },
+                { "owin.UriScheme", request.Url.Scheme },
+                { "owin.RemoteEndpoint", null },    // TODO Find the IPEndpoint of the client
+                { "owin.Version", "1.0" }
+            };
+        }
+
+        private static void Body(HttpContext context, byte[] buffer, int offset, int count, Action<int> result, Action<Exception> appError) {
+            var request = context.Request;
+            
+            try
+            {
+                request.InputStream.BeginRead(buffer, offset, count, ar => {
+                    try
+                    {
+                        result(request.InputStream.EndRead(ar));
+                    }
+                    catch(Exception e)
+                    {
+                        appError(e);
+                    }
+                }, null);
+            }
+            catch(Exception e)
+            {
+                appError(e);
+            }
+        }
+
+        protected void Error(HttpContext context, Exception e)
+        {
+            this.error = e;
+        }
+
+        protected void Response(HttpContext context, string status, Dictionary<string, IList<string>> headers, IEnumerable<object> body)
+        {
+            var response = context.Response;
+
+            response.Status = status;
+            foreach (var header in headers) {
+                if(header.Value == null)
+                    continue;
+
+                foreach (var value in header.Value) {
+                    response.AddHeader(header.Key, value);
+                }
+            }
+
+            foreach (var item in body) {
+                ProcessItem(context, item);
+                if(error != null)
+                    return;
+            }
+        }
+
+        private void ProcessItem(HttpContext context, object item) {
+            if(ProcessItem(context, item as byte[]))
+                return;
+
+            if(item is ArraySegment<byte>)
+            {
+                ProcessItem(context, (ArraySegment<byte>)item);
+                return;
+            }
+
+            if(ProcessItem(context, item as FileInfo))
+                return;
+
+            if(ProcessItem(context, item as AsyncResponseAction))
+                return;
+        }
+
+        private bool ProcessItem(HttpContext context, byte[] item) {
+            if (item == null)
+                return false;
+            
+            context.Response.OutputStream.Write(item, 0, item.Length);
+            return true;
+        }
+
+        private void ProcessItem(HttpContext context, ArraySegment<byte> item) {
+            context.Response.OutputStream.Write(item.Array, item.Offset, item.Count);
+        }
+
+        private bool ProcessItem(HttpContext context, FileInfo item) {
+            if (item == null)
+                return false;
+            
+            context.Response.TransmitFile(item.FullName);
+            return true;
+        }
+
+        private bool ProcessItem(HttpContext context, AsyncResponseAction item) {
+            if(item == null)
+                return false;
+
+            item(nextItem => ProcessItem(context, nextItem), e => Error(context, e));
+            return true;
+        }
+    }
+}

Owin.AspNet/Properties/AssemblyInfo.cs

+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Owin.AspNet")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Jeff Hardy")]
+[assembly: AssemblyProduct("Owin.AspNet")]
+[assembly: AssemblyCopyright("Copyright © Jeff Hardy 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("ed163032-025d-44eb-8e34-eecff1a4e31d")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("0.0.1.0")]
+[assembly: AssemblyFileVersion("0.0.1.0")]
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.