コード例 #1
0
 /// <summary>
 /// After request is received
 /// </summary>
 public void AfterReceiveRequest(RestRequestMessage request)
 {
     try
     {
         // Handle compressed requests
         var compressionScheme = CompressionUtil.GetCompressionScheme(RestOperationContext.Current.IncomingRequest.Headers["Content-Encoding"]);
         if (compressionScheme != null)
         {
             request.Body = compressionScheme.CreateDecompressionStream(request.Body);
         }
     }
     catch (Exception e)
     {
         this.m_traceSource.TraceEvent(EventLevel.Error, e.ToString());
     }
 }
コード例 #2
0
        /// <summary>
        /// After receiving a request, do any message stuff here
        /// </summary>
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            try
            {
                // Handle compressed requests
                var compressionScheme = CompressionUtil.GetCompressionScheme(WebOperationContext.Current.IncomingRequest.Headers[System.Net.HttpRequestHeader.ContentEncoding]);
                if (compressionScheme != null)
                {
                    CompressionUtil.DeCompressMessage(ref request, compressionScheme, this.GetContentFormat(request));
                }

                return(null);
            }
            catch (Exception e)
            {
                this.m_traceSource.TraceEvent(TraceEventType.Error, e.HResult, e.ToString());
                return(null);
            }
        }
コード例 #3
0
        /// <summary>
        /// After receiving a request, do any message stuff here
        /// </summary>
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            try
            {
                this.m_traceSource.TraceEvent(TraceEventType.Verbose, 0, "Received request from {0} : {1} {2} ({3})", (OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty)?.Address.ToString(),
                                              WebOperationContext.Current.IncomingRequest.Method,
                                              WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri,
                                              WebOperationContext.Current.IncomingRequest.UserAgent);
                // Handle compressed requests
                var compressionScheme = CompressionUtil.GetCompressionScheme(WebOperationContext.Current.IncomingRequest.Headers[System.Net.HttpRequestHeader.ContentEncoding]);
                if (compressionScheme != null)
                {
                    CompressionUtil.DeCompressMessage(ref request, compressionScheme, this.GetContentFormat(request));
                }

                return(null);
            }
            catch (Exception e)
            {
                this.m_traceSource.TraceEvent(TraceEventType.Error, e.HResult, e.ToString());
                return(null);
            }
        }
コード例 #4
0
        /// <summary>
        /// Before sending a reply
        /// </summary>
        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            try
            {
                string encodings         = WebOperationContext.Current.IncomingRequest.Headers.Get("Accept-Encoding");
                string compressionScheme = String.Empty;

                if (!string.IsNullOrEmpty(encodings))
                {
                    encodings = encodings.ToLowerInvariant();

                    if (encodings.Contains("gzip"))
                    {
                        compressionScheme = "gzip";
                    }
                    else if (encodings.Contains("deflate"))
                    {
                        compressionScheme = "deflate";
                    }
                    else
                    {
                        WebOperationContext.Current.OutgoingResponse.Headers.Add("X-CompressResponseStream", "no-known-accept");
                    }
                }


                // TODO: Add a configuration option to disable this
                FhirCorsConfiguration config = null;
                String resourcePath          = "*";
                Dictionary <String, String> requiredHeaders = new Dictionary <string, string>();

                // CORS?
                if (this.m_configuration.CorsConfiguration.TryGetValue("*", out config))
                {
                    requiredHeaders = new Dictionary <string, string>()
                    {
                        { "Access-Control-Allow-Origin", config.Domain },
                        { "Access-Control-Request-Method", config.Actions },
                        { "Access-Control-Allow-Headers", config.Headers }
                    }
                }
                ;

                foreach (var kv in requiredHeaders)
                {
                    if (!WebOperationContext.Current.OutgoingResponse.Headers.AllKeys.Contains(kv.Key))
                    {
                        WebOperationContext.Current.OutgoingResponse.Headers.Add(kv.Key, kv.Value);
                    }
                }

                // Finally compress
                // Compress
                if (!String.IsNullOrEmpty(compressionScheme))
                {
                    try
                    {
                        WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-Encoding", compressionScheme);
                        WebOperationContext.Current.OutgoingResponse.Headers.Add("X-CompressResponseStream", compressionScheme);
                        byte[] messageContent = null;

                        // Read binary contents of the message
                        switch (this.GetContentFormat(reply))
                        {
                        case WebContentFormat.Default:
                        case WebContentFormat.Xml:
                            using (MemoryStream ms = new MemoryStream())
                            {
                                // Write out the XML
                                using (var xdr = XmlDictionaryWriter.CreateTextWriter(ms, Encoding.UTF8, false))
                                    reply.WriteBodyContents(xdr);
                                messageContent = ms.ToArray();     // original message content
                            }
                            break;

                        case WebContentFormat.Raw:
                        {
                            var xdr = reply.GetReaderAtBodyContents();
                            xdr.ReadStartElement("Binary");
                            messageContent = xdr.ReadContentAsBase64();
                            break;
                        }
                        }

                        Message compressedMessage = Message.CreateMessage(reply.Version, reply.Headers.Action, new CompressionBodyWriter(messageContent, CompressionUtil.GetCompressionScheme(compressionScheme)));
                        compressedMessage.Properties.CopyProperties(reply.Properties);
                        compressedMessage.Properties.Remove(WebBodyFormatMessageProperty.Name);
                        compressedMessage.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Raw));
                        reply = compressedMessage;
                    }
                    catch (Exception e)
                    {
                        this.m_traceSource.TraceEvent(TraceEventType.Error, e.HResult, e.ToString());
                    }
                }
            }
            catch (Exception e)
            {
                this.m_traceSource.TraceEvent(TraceEventType.Error, e.HResult, e.ToString());
            }
        }
コード例 #5
0
        /// <summary>
        /// Before sending the response
        /// </summary>
        public void BeforeSendResponse(RestResponseMessage response)
        {
            try
            {
                string encodings         = RestOperationContext.Current.IncomingRequest.Headers.Get("Accept-Encoding");
                string compressionScheme = String.Empty;

                if (!string.IsNullOrEmpty(encodings))
                {
                    encodings = encodings.ToLowerInvariant();

                    if (encodings.Contains("lzma"))
                    {
                        compressionScheme = "lzma";
                    }
                    else if (encodings.Contains("bzip2"))
                    {
                        compressionScheme = "bzip2";
                    }
                    else if (encodings.Contains("gzip"))
                    {
                        compressionScheme = "gzip";
                    }
                    else if (encodings.Contains("deflate"))
                    {
                        compressionScheme = "deflate";
                    }
                    else
                    {
                        response.Headers.Add("X-CompressResponseStream", "no-known-accept");
                    }
                }

                // No reply = no compress :)
                if (response.Body == null)
                {
                    return;
                }

                // Finally compress
                // Compress
                if (!String.IsNullOrEmpty(compressionScheme))
                {
                    try
                    {
                        response.Headers.Add("Content-Encoding", compressionScheme);
                        response.Headers.Add("X-CompressResponseStream", compressionScheme);

                        // Read binary contents of the message
                        var memoryStream = new MemoryStream();
                        using (var compressor = CompressionUtil.GetCompressionScheme(compressionScheme).CreateCompressionStream(memoryStream))
                            response.Body.CopyTo(compressor);
                        response.Body.Dispose();
                        memoryStream.Seek(0, SeekOrigin.Begin);
                        response.Body = memoryStream;
                    }
                    catch (Exception e)
                    {
                        this.m_traceSource.TraceEvent(EventLevel.Error, e.ToString());
                    }
                }
            }
            catch (Exception e)
            {
                this.m_traceSource.TraceEvent(EventLevel.Error, e.ToString());
            }
        }