/// <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()); } }
/// <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); } }
/// <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); } }
/// <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()); } }
/// <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()); } }