Qiniu.Http.HttpManager.handleErrorWebResponse C# (CSharp) 메소드

handleErrorWebResponse() 개인적인 메소드

private handleErrorWebResponse ( HttpWebResponse pWebResp, CompletionHandler pCompletionHandler, Exception pExp ) : void
pWebResp System.Net.HttpWebResponse
pCompletionHandler CompletionHandler
pExp System.Exception
리턴 void
        private void handleErrorWebResponse(HttpWebResponse pWebResp, CompletionHandler pCompletionHandler, Exception pExp)
        {
            DateTime startTime = DateTime.Now;
            int statusCode = ResponseInfo.NetworkError;
            //parse self defined code from the error message
            string expMsg = pExp.Message;
            int indexStart = expMsg.IndexOf("(");
            if (indexStart != -1)
            {
                int indexEnd = expMsg.IndexOf(")", indexStart);
                if (indexStart != -1 && indexEnd != -1)
                {
                    string statusCodeStr = expMsg.Substring(indexStart + 1, indexEnd - indexStart - 1);
                    try
                    {
                        statusCode = Convert.ToInt32(statusCodeStr);
                    }
                    catch (Exception) { }
                }
            }
            //check for exception
            string reqId = null;
            string xlog = null;
            string ip = null;
            string xvia = null;
            string error = null;
            string host = null;
            string respData = null;
            int contentLength = -1;

            if (pWebResp != null)
            {
                if (pWebResp.Headers != null)
                {
                    WebHeaderCollection respHeaders = pWebResp.Headers;
                    foreach (string headerName in respHeaders.AllKeys)
                    {
                        if (headerName.Equals("X-Reqid"))
                        {
                            reqId = respHeaders[headerName].ToString();
                        }
                        else if (headerName.Equals("X-Log"))
                        {
                            xlog = respHeaders[headerName].ToString();
                        }
                        else if (headerName.Equals("X-Via"))
                        {
                            xvia = respHeaders[headerName].ToString();
                        }
                        else if (headerName.Equals("X-Px"))
                        {
                            xvia = respHeaders[headerName].ToString();
                        }
                        else if (headerName.Equals("Fw-Via"))
                        {
                            xvia = respHeaders[headerName].ToString();
                        }
                        else if (headerName.Equals("Host"))
                        {
                            host = respHeaders[headerName].ToString();
                        }
                        else if (headerName.Equals("Content-Length"))
                        {
                            contentLength = int.Parse(respHeaders[headerName].ToString());
                        }
                    }
                }

                if (contentLength > 0)
                {
                    Stream ps = pWebResp.GetResponseStream();
                    byte[] raw = new byte[contentLength];
                    int bytesRead = 0; // 已读取的字节数
                    int bytesLeft = contentLength; // 剩余字节数
                    while (bytesLeft > 0)
                    {
                        bytesRead = ps.Read(raw, contentLength - bytesLeft, bytesLeft);
                        bytesLeft -= bytesRead;
                    }

                    respData = Encoding.UTF8.GetString(raw);

                    try
                    {
                        /////////////////////////////////////////////////////////////
                        // 改进Response的error解析, 根据HttpStatusCode
                        // @fengyh 2016-08-17 18:29
                        /////////////////////////////////////////////////////////////
                        if (statusCode != (int)HCODE.OK)
                        {
                            bool isOtherCode = HttpCode.GetErrorMessage(statusCode, out error);

                            if (isOtherCode)
                            {
                                Dictionary<string, string> errorDict = JsonConvert.DeserializeObject<Dictionary<string, string>>(respData);
                                error = errorDict["error"];
                            }
                        }
                    }
                    catch (Exception) { }
                }
                else
                {
                    statusCode = -1;
                    error = "response err";
                }
            }
            else
            {
                error = pExp.Message;
            }

            double duration = DateTime.Now.Subtract(startTime).TotalSeconds;
            ResponseInfo respInfo = new ResponseInfo(statusCode, reqId, xlog, xvia, host, ip, duration, error);
            if (pCompletionHandler != null)
            {
                pCompletionHandler(respInfo, respData);
            }
        }