示例#1
0
        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)));
 }
示例#4
0
 /// <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;
 }
示例#5
0
 private void WriteContent(XRoadMessage source)
 {
     writer.Write(new StreamReader(source.ContentStream).ReadToEnd());
 }
示例#6
0
 /// <summary>
 /// Intializes new X-Road message context.
 /// </summary>
 public XRoadContext(THttpContext httpContext)
 {
     HttpContext = httpContext;
     Request     = new XRoadMessage();
     Response    = new XRoadMessage(new MemoryStream());
 }