public void Read(XRoadMessage target, bool isResponse = false) { if (stream.CanSeek && stream.Length == 0) { return; } if (stream.CanSeek) { stream.Position = 0; } streamPosition = 0; target.ContentEncoding = GetContentEncoding(); target.ContentStream = new MemoryStream(); target.IsMultipartContainer = ReadMessageParts(target); target.ContentStream.Position = 0; using (var reader = XmlReader.Create(target.ContentStream, new XmlReaderSettings { CloseInput = false })) { var protocol = DetectServiceManager(reader); ParseXRoadHeader(target, reader, protocol); target.RootElementName = ParseMessageRootElementName(reader); if (target.ServiceManager == null && target.RootElementName != null) { target.ServiceManager = serviceManagers.SingleOrDefault(p => p.IsHeaderNamespace(target.RootElementName.NamespaceName)); } target.MetaServiceMap = GetMetaServiceMap(target.RootElementName); } if (target.Header is IXRoadHeader40 xrh4 && xrh4.ProtocolVersion?.Trim() != "4.0") { throw XRoadException.InvalidQuery($"Unsupported X-Road v6 protocol version value `{xrh4.ProtocolVersion ?? string.Empty}`."); } if (target.IsMultipartContainer) { target.BinaryMode = BinaryMode.Attachment; } if (XRoadMessage.MULTIPART_CONTENT_TYPE_XOP.Equals(target.MultipartContentType)) { target.BinaryMode = BinaryMode.Xml; } if (isResponse) { return; } if (target.RootElementName == null || string.IsNullOrWhiteSpace(target.Header?.Service?.ServiceCode)) { return; } if (!Equals(target.RootElementName.LocalName, target.Header.Service.ServiceCode)) { throw XRoadException.InvalidQuery($"Teenuse nimi `{target.Header.Service.ServiceCode}` ei ole vastavuses päringu sisuga `{target.RootElementName}`."); } }
public void Read(XRoadMessage target, bool isResponse = false) { target.IsMultipartContainer = XRoadHelper.IsMultipartMsg(contentTypeHeader); if (target.IsMultipartContainer) { target.MultipartContentType = XRoadHelper.GetMultipartContentType(contentTypeHeader); } if (stream.CanSeek && stream.Length == 0) { return; } if (stream.CanSeek) { stream.Position = 0; } streamPosition = 0; target.ContentEncoding = GetContentEncoding(); target.ContentStream = new MemoryStream(); ReadMessageParts(target); target.ContentStream.Position = 0; using (var reader = XmlReader.Create(target.ContentStream, new XmlReaderSettings { CloseInput = false })) { var serviceManager = DetectServiceManager(reader, target); ParseXRoadHeader(target, reader, serviceManager); target.RootElementName = ParseMessageRootElementName(reader); if (target.ServiceManager == null && target.RootElementName != null) { target.ServiceManager = serviceManagers.SingleOrDefault(p => p.IsHeaderNamespace(target.RootElementName.NamespaceName)); } target.MetaServiceMap = GetMetaServiceMap(target.RootElementName); } if (target.Header is IXRoadHeader40 xrh4 && xrh4.ProtocolVersion?.Trim() != "4.0") { throw new InvalidQueryException($"Unsupported X-Road v6 protocol version value `{xrh4.ProtocolVersion ?? string.Empty}`."); } if (target.IsMultipartContainer) { target.BinaryMode = BinaryMode.Attachment; } if (ContentTypes.XOP.Equals(target.MultipartContentType)) { target.BinaryMode = BinaryMode.Xml; } if (isResponse) { return; } var serviceCode = (target.Header as IXRoadHeader)?.Service?.ServiceCode; if (target.RootElementName == null || string.IsNullOrWhiteSpace(serviceCode)) { return; } if (!Equals(target.RootElementName.LocalName, serviceCode)) { throw new InvalidQueryException($"X-Road operation name `{serviceCode}` does not match request wrapper element name `{target.RootElementName}`."); } }
private IServiceManager DetectServiceManager(XmlReader reader, XRoadMessage target) { messageFormatter.MoveToEnvelope(reader); return(target.ServiceManager ?? serviceManagers.SingleOrDefault(p => p.IsDefinedByEnvelope(reader))); }
/// <summary> /// Copy X-Road message parts from another message, which are required to be /// consistent across multiple possible protocol implementations or service /// versions. /// </summary> public void Copy(XRoadMessage message) { ServiceManager = message.ServiceManager; Header = message.Header; }
private void WriteContent(XRoadMessage source) { writer.Write(new StreamReader(source.ContentStream).ReadToEnd()); }
/// <summary> /// Intializes new X-Road message context. /// </summary> public XRoadContext(THttpContext httpContext) { HttpContext = httpContext; Request = new XRoadMessage(); Response = new XRoadMessage(new MemoryStream()); }