#if NET462_OR_GREATER
#region Apache License
//
// Licensed to the Apache Software Foundation (ASF) under one or more 
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership. 
// The ASF licenses this file to you 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.
//
#endregion

using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Web;
using log4net.Core;
using log4net.Util;

namespace log4net.Layout.Pattern;

/// <summary>
/// Converter for items in the ASP.Net Cache.
/// </summary>
/// <remarks>
/// <para>
/// Outputs an item from the <see cref="HttpRuntime.Cache" />.
/// </para>
/// </remarks>
/// <author>Ron Grabowski</author>
[SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses", Justification = "Reflection")]
internal sealed class AspNetRequestPatternConverter : AspNetPatternLayoutConverter
{
  /// <summary>
  /// Write the ASP.Net Cache item to the output
  /// </summary>
  /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
  /// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
  /// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
  /// <remarks>
  /// <para>
  /// Writes out the value of a named property. The property name
  /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
  /// property.
  /// </para>
  /// </remarks>
  protected override void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext)
  {
    HttpRequest? request = null;
    try
    {
      request = httpContext.Request;
    }
    catch (HttpException)
    {
      // likely a case of running in IIS integrated mode
      // when inside an Application_Start event.
      // treat it like a case of the Request
      // property returning null
    }

    if (request is not null)
    {
      if (Option is not null)
      {
        WriteObject(writer, loggingEvent.Repository, httpContext.Request.Params[Option]);
      }
      else
      {
        WriteObject(writer, loggingEvent.Repository, httpContext.Request.Params);
      }
    }
    else
    {
      writer.Write(SystemInfo.NotAvailableText);
    }
  }
}

#endif // NET462_OR_GREATER