/// <summary>
 /// In order to capture the full set of data during a HTTP request this OWIN plugin must be the first plugin in the chain.
 /// 
 /// Configure OWIN to trace HTTP requests and responses. Note that capturing request query parameters and request and response data could cause
 /// data security issues - potentially sensitive data will be logged to Azure table storage.
 /// 
 /// Therefore by default none of this is captured.
 /// 
 /// </summary>
 /// <param name="appBuilder">The OWIN app builder</param>
 /// <param name="loggerRepository">The repository to use for storing http logs</param>
 /// <param name="captureRequestParams">True if you wish to capture query parameters, false if not.</param>
 /// <param name="captureRequestData">True if you wish to capture request data, false if not.</param>
 /// <param name="captureResponseData">True if you wish to capture response data, falise if not.</param>
 /// <param name="captureRequestHeaders">To capture all request headers set a single array element of "*" otherwise specify the headers you wish to capture.</param>
 /// <param name="captureResponseHeaders">To capture all response headers set a single array element of "*" otherwise specify the headers you wish to capture.</param>
 /// <param name="httpCorrelationHeaderKey">
 /// It can be helpful when calling across http boundaries to be able to tie together the flow of events with a correlation ID and by default the logger
 /// looks for a correlation ID in the header correlation-id. If the header is missing then no correlation ID is used but the logger will work. If you
 /// wish to disable this behaviour then set this to null or if you want to use a different header then set the header name here.
 /// 
 /// The HttpCorrelator middleware also in this assembly can be used to add a correlation ID if none is present and should be placed before the logger middleware
 /// in the pipeline.
 /// </param>
 /// <returns></returns>
 public static IAppBuilder UseHttpLogger(this IAppBuilder appBuilder,
     IHttpLoggerRepository loggerRepository,
     bool captureRequestParams = false,
     bool captureRequestData = false,
     bool captureResponseData = false,
     string[] captureRequestHeaders = null,
     string[] captureResponseHeaders = null,
     string httpCorrelationHeaderKey = "correlation-id")
 {
     appBuilder.Use<HttpLogger>(
         loggerRepository,
         captureRequestParams,
         captureRequestData,
         captureResponseData,
         captureRequestHeaders,
         captureResponseHeaders,
         httpCorrelationHeaderKey);
     return appBuilder;
 }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="next">The next piece of middleware to call</param>
 /// <param name="httpLoggerRepository">The repository to store the http information in</param>
 /// <param name="captureRequestParams">True if query parameters should be captured, false if they should be removed</param>
 /// <param name="captureRequestData">True if request data should be persisted to storage, false if not. Currently true is unsupported.</param>
 /// <param name="captureResponseData">True if response data should be persisted to storage, false if not. Currently true is unsupported.</param>
 /// <param name="captureRequestHeaders">The set of request headers to capture, a single item of "*" for all headers</param>
 /// <param name="captureResponseHeaders">The set of response headers to capture, a single item of "*" for all headers</param>
 /// <param name="httpCorrelationHeaderKey">The name of the header to use for a correlation ID</param>
 public HttpLogger(OwinMiddleware next,
     IHttpLoggerRepository httpLoggerRepository,
     bool captureRequestParams,
     bool captureRequestData,
     bool captureResponseData,
     IEnumerable<string> captureRequestHeaders,
     IEnumerable<string> captureResponseHeaders,
     string httpCorrelationHeaderKey) : base(next)
 {
     if (captureRequestData || captureResponseData)
     {
         throw new NotSupportedException("Not yet supported - arriving in v1");
     }
     
     _httpLoggerRepository = httpLoggerRepository;
     _captureRequestParams = captureRequestParams;
     _httpCorrelationHeaderKey = httpCorrelationHeaderKey;
     //_captureRequestData = captureRequestData;
     //_captureResponseData = captureResponseData;
     _captureRequestHeaders = captureRequestHeaders.ToArray();
     _captureResponseHeaders = captureResponseHeaders.ToArray();
 }