예제 #1
0
        // 通信処理(File_GET)
        internal void Connect(HttpClientFileDataCallback callback)
        {
            HttpWebRequest req = _returnRequest();

            _Connection(req, null, callback);
        }
예제 #2
0
        private void _Connection(HttpWebRequest req, HttpClientCallback callback, HttpClientFileDataCallback fileCallback)
        {
            //SSLサイトにアクセス
            ServicePointManager.ServerCertificateValidationCallback = delegate {
                return(true);
            };

            int           statusCode   = 0;
            string        responseData = null;
            NCMBException error        = null;

            //Post,Put時のコンテントデータ書き込み
            if (_method == ConnectType.POST || _method == ConnectType.PUT)
            {
                if (_file != null)
                {
                    // File
                    req = this._sendRequestForFile(req, ref error);
                }
                else
                {
                    // 通常
                    req = this._sendRequest(req, ref error);
                }

                //書き込みでエラーがあれば終了
                if (error != null)
                {
                    callback(statusCode, responseData, error);
                    return;
                }
            }

            HttpWebResponse httpResponse   = null;
            Stream          streamResponse = null;
            StreamReader    streamRead     = null;

            byte[] responseByte = null;
            try {
                // 通信結果取得
                httpResponse   = (HttpWebResponse)req.GetResponse();
                streamResponse = httpResponse.GetResponseStream();
                statusCode     = (int)httpResponse.StatusCode;
                streamRead     = new StreamReader(streamResponse);
                if (fileCallback != null)
                {
                    // File_GET
                    MemoryStream memoryStream = new MemoryStream(0x10000);
                    byte[]       buffer       = new byte[0x1000];
                    int          bytes;
                    while ((bytes = streamResponse.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        memoryStream.Write(buffer, 0, bytes);
                    }
                    responseByte = memoryStream.ToArray();
                }
                else
                {
                    // 通常
                    responseData = streamRead.ReadToEnd();
                }
            } catch (WebException ex) {
                // 通信失敗
                using (WebResponse webResponse = ex.Response) {
                    error = new NCMBException();
                    error.ErrorMessage = ex.Message;

                    // mBaaSエラー
                    if (webResponse != null)
                    {
                        // エラーのJSON書き出し
                        streamResponse = webResponse.GetResponseStream();
                        streamRead     = new StreamReader(streamResponse);
                        responseData   = streamRead.ReadToEnd();
                        var jsonData      = MiniJSON.Json.Deserialize(responseData) as Dictionary <string, object>;
                        var hashtableData = new Hashtable(jsonData);

                        // エラー内容の設定
                        error.ErrorCode    = (hashtableData ["code"].ToString());
                        error.ErrorMessage = (hashtableData ["error"].ToString());
                        httpResponse       = (HttpWebResponse)webResponse;
                        statusCode         = (int)httpResponse.StatusCode;
                    }
                }
            } finally {
                if (httpResponse != null)
                {
                    httpResponse.Close();
                }
                if (streamResponse != null)
                {
                    streamResponse.Close();
                }
                if (streamRead != null)
                {
                    streamRead.Close();
                }
                //check if session token error have or not
                if (error != null)
                {
                    _checkInvalidSessionToken(error.ErrorCode);
                }

                //レスポンスデータにエスケープシーケンスがあればアンエスケープし、mobile backend上と同一にします
                var unescapeResponseData = responseData;
                if (unescapeResponseData != null && unescapeResponseData != Regex.Unescape(unescapeResponseData))
                {
                    unescapeResponseData = Regex.Unescape(unescapeResponseData);
                }

                //レスポンスシグネチャのチェック
                if (NCMBSettings._responseValidationFlag && httpResponse != null)
                {
                    //レスポンスシグネチャが無い場合はE100001エラー
                    if (httpResponse.Headers.GetValues(RESPONSE_SIGNATURE) != null)
                    {
                        string responseSignature = httpResponse.Headers.GetValues(RESPONSE_SIGNATURE) [0];
                        _signatureCheck(responseSignature, ref statusCode, ref unescapeResponseData, ref responseByte, ref error);
                    }
                    else
                    {
                        statusCode         = 100;
                        responseData       = "{}";
                        error              = new NCMBException();
                        error.ErrorCode    = "E100001";
                        error.ErrorMessage = "Authentication error by response signature incorrect.";
                    }
                }


                if (fileCallback != null)
                {
                    fileCallback(statusCode, responseByte, error);
                }
                else
                {
                    callback(statusCode, responseData, error);
                }
            }
        }
예제 #3
0
 // 通信処理(File_GET)
 internal void Connect(HttpClientFileDataCallback callback)
 {
     _Connection(callback);
 }