public WopiAppHelper(string discoveryXml)
        {
            var xr = XmlReader.Create(new StringReader(discoveryXml));

            var reader = new XmlSerializer(typeof(wopidiscovery));
            var wd     = reader.Deserialize(xr) as wopidiscovery;

            _wopiDiscovery = wd;

            //_discoveryFile = discoveryXml;

            //using (StreamReader file = new StreamReader(discoveryXml))
            //{
            //    XmlSerializer reader = new XmlSerializer(typeof(WopiHost.wopidiscovery));
            //    var wopiDiscovery = reader.Deserialize(file) as WopiHost.wopidiscovery;
            //    _wopiDiscovery = wopiDiscovery;
            //}
        }
        /// <summary>
        /// Parse the HTTP payload to WOPI message.
        /// </summary>
        /// <param name="requestHeaders">The HTTP request header.</param>
        /// <param name="responseHeaders">The HTTP response header.</param>
        /// <param name="url">url for a HTTP message.</param>
        /// <param name="bytesFromHTTP">The raw data from HTTP layer.</param>
        /// <param name="direction">The direction of the traffic.</param>
        /// <returns>The object parsed result</returns>
        public object ParseHTTPPayloadForWOPI(HTTPHeaders requestHeaders, HTTPHeaders responseHeaders, string url, byte[] bytesFromHTTP, out string binaryStructureRopName, TrafficDirection direction)
        {
            object objectOut = null;

            binaryStructureRopName = string.Empty;
            try
            {
                if (direction == TrafficDirection.Out && responseHeaders.Exists("Transfer-Encoding") && responseHeaders["Transfer-Encoding"] == "chunked")
                {
                    bytesFromHTTP = Utilities.GetPaylodFromChunkedBody(bytesFromHTTP);
                }

                Stream         stream    = new MemoryStream(bytesFromHTTP);
                StreamReader   reader    = new StreamReader(stream);
                string         text      = reader.ReadToEnd();
                WOPIOperations operation = GetWOPIOperationName(requestHeaders, url);
                if (direction == TrafficDirection.In)
                {
                    switch (operation)
                    {
                    case WOPIOperations.PutRelativeFile:
                        objectOut = bytesFromHTTP;
                        binaryStructureRopName = "PutRelativeFile";
                        break;

                    case WOPIOperations.PutFile:
                        objectOut = bytesFromHTTP;
                        binaryStructureRopName = "PutFile";
                        break;

                    case WOPIOperations.ExecuteCellStorageRelativeRequest:
                    case WOPIOperations.ExecuteCellStorageRequest:
                        byte[]       cellreq = bytesFromHTTP;
                        MemoryStream ms;
                        if (requestHeaders.Exists("Content-Encoding") && requestHeaders["Content-Encoding"] == "gzip")
                        {
                            cellreq = Fiddler.Utilities.GzipExpand(cellreq);
                            ms      = new MemoryStream(cellreq);
                        }
                        else
                        {
                            ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text ?? ""));
                        }
                        XmlSerializer   serializer     = new XmlSerializer(typeof(RequestEnvelope));
                        RequestEnvelope requestEnvelop = (RequestEnvelope)serializer.Deserialize(ms);
                        objectOut = requestEnvelop.Body;

                        if (requestEnvelop.Body.RequestCollection != null)
                        {
                            TryParseFSSHTTPBRequestMessage(requestEnvelop.Body.RequestCollection.Request, bytesFromHTTP);
                        }
                        break;

                    case WOPIOperations.PutUserInfo:
                        objectOut = text;
                        break;

                    case WOPIOperations.Discovery:
                    case WOPIOperations.CheckFileInfo:
                    case WOPIOperations.Lock:
                    case WOPIOperations.RefreshLock:
                    case WOPIOperations.RevokeRestrictedLink:
                    case WOPIOperations.Unlock:
                    case WOPIOperations.UnlockAndRelock:
                    case WOPIOperations.GetLock:
                    case WOPIOperations.DeleteFile:
                    case WOPIOperations.ReadSecureStore:
                    case WOPIOperations.RenameFile:
                    case WOPIOperations.GetRestrictedLink:
                    case WOPIOperations.CheckFolderInfo:
                    case WOPIOperations.GetFile:
                    case WOPIOperations.EnumerateChildren:
                        objectOut = string.Format("{0} operation's request body is null", operation.ToString());
                        break;

                    default:
                        throw new Exception("The WOPI operations type is not right.");
                    }
                }
                else
                {
                    string status = this.session.ResponseHeaders.HTTPResponseStatus.Replace(" " + this.session.ResponseHeaders.StatusDescription, string.Empty);
                    if (Convert.ToUInt32(status) != 200)// the status is not success
                    {
                        return(null);
                    }

                    ResponseBodyBase responseBody = new ResponseBodyBase();
                    switch (operation)
                    {
                    case WOPIOperations.Discovery:
                        MemoryStream  discoveryms         = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text ?? ""));
                        XmlSerializer discoverySerializer = new XmlSerializer(typeof(wopidiscovery));
                        wopidiscovery discoveryres        = (wopidiscovery)discoverySerializer.Deserialize(discoveryms);
                        objectOut = discoveryres;
                        break;

                    case WOPIOperations.CheckFileInfo:
                        objectOut = WOPISerilizer.JsonToObject <CheckFileInfo>(text);
                        break;

                    case WOPIOperations.CheckFolderInfo:
                        objectOut = WOPISerilizer.JsonToObject <CheckFolderInfo>(text);
                        break;

                    case WOPIOperations.PutRelativeFile:
                        objectOut = WOPISerilizer.JsonToObject <PutRelativeFile>(text);
                        break;

                    case WOPIOperations.ReadSecureStore:
                        objectOut = WOPISerilizer.JsonToObject <ReadSecureStore>(text);
                        break;

                    case WOPIOperations.EnumerateChildren:
                        objectOut = WOPISerilizer.JsonToObject <EnumerateChildren>(text);
                        break;

                    case WOPIOperations.RenameFile:
                        objectOut = WOPISerilizer.JsonToObject <RenameFile>(text);
                        break;

                    case WOPIOperations.ExecuteCellStorageRelativeRequest:
                    case WOPIOperations.ExecuteCellStorageRequest:
                    {
                        byte[]       cellres = bytesFromHTTP;
                        MemoryStream ms;
                        string       res;
                        if (responseHeaders.Exists("Content-Encoding") && responseHeaders["Content-Encoding"] == "gzip")
                        {
                            cellres = Fiddler.Utilities.GzipExpand(cellres);
                            string res_sub = System.Text.Encoding.UTF8.GetString(cellres);
                            res = string.Format("{0}{1}{2}", @"<Body>", res_sub, "</Body>");
                        }
                        else
                        {
                            res = string.Format("{0}{1}{2}", @"<Body>", text, "</Body>");
                        }
                        ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(res ?? ""));
                        XmlSerializer        serializer = new XmlSerializer(typeof(ResponseEnvelopeBody));
                        ResponseEnvelopeBody body       = (ResponseEnvelopeBody)serializer.Deserialize(ms);
                        objectOut = body;

                        // if SubResponseData has fsshttpb messages do parser.
                        if (body.ResponseCollection != null)
                        {
                            TryParseFSSHTTPBResponseMessage(body.ResponseCollection.Response, bytesFromHTTP);
                        }
                        break;
                    }

                    case WOPIOperations.GetFile:
                        objectOut = bytesFromHTTP;
                        binaryStructureRopName = "GetFile";
                        break;

                    case WOPIOperations.DeleteFile:
                    case WOPIOperations.Lock:
                    case WOPIOperations.GetRestrictedLink:
                    case WOPIOperations.PutFile:
                    case WOPIOperations.RefreshLock:
                    case WOPIOperations.RevokeRestrictedLink:
                    case WOPIOperations.Unlock:
                    case WOPIOperations.UnlockAndRelock:
                    case WOPIOperations.GetLock:
                    case WOPIOperations.PutUserInfo:
                        objectOut = string.Format("{0} operation's response body is null", operation.ToString());
                        break;

                    default:
                        throw new Exception("The WOPI operations type is not right.");
                    }
                }
                return(objectOut);
            }
            catch (Exception ex)
            {
                objectOut = ex.ToString();
                return(objectOut);
            }
        }