/// <summary> /// 引数(<paramref name="request"/>)に紐づくレスポンスデータ情報を取得する /// </summary> /// <param name="request">HTTPリクエスト</param> /// <exception cref="ArgumentNullException"> /// 引数の <paramref name="request"/> がNULLの場合に発生 /// </exception> /// <exception cref="RegexMatchTimeoutException"> /// 正規表現のマッチング処理にてタイムアウトが発生した場合に発生 /// </exception> /// <returns>レスポンスデータ情報</returns> private HttpResponseData GetTargetResponseData(HttpListenerRequest request) { // NULLチェック if (request == null) { throw new ArgumentNullException(nameof(request)); } // favicon.iconのリクエストかチェック if (request.HttpMethod.Equals( HttpMethod.Get.ToString(), StringComparison.OrdinalIgnoreCase) && request.RawUrl.Equals( LocalHttpServerResponseSetting.FaviconUrl, StringComparison.OrdinalIgnoreCase)) { // favicon.iconのリクエストの場合は、それfavicon.icon用のレスポンスデータ情報を返却 return(Setting?.FaviconResponse ?? LocalHttpServerCommon.EmptyDataResponse); } // HttpMethod、URLに紐づくレスポンスデータ情報を取得 LocalHttpServerResponceProcess responceProcess = Setting?.Find(request.HttpMethod, request.RawUrl); // 取得したレスポンスデータ情報を返却 // 取得できなかった場合はデフォルト用のレスポンスデータ情報を返却 HttpResponseData defaultProcess = Setting?.DefaultResponse ?? LocalHttpServerCommon.EmptyDataResponse; return(responceProcess?.ResponseData ?? defaultProcess); }
/// <summary> /// コンストラクタ /// 引数の情報でHttpレスポンスの処理設定の初期化を行う /// </summary> /// <param name="defaultProcess"> /// デフォルトで呼び出されるHttpレスポンスの処理の情報を格納したクラス /// (NULLを指定した場合は0byteのデータを返却する機能を持つクラスを設定) /// </param> /// <param name="faviconProcess"> /// GET favicon.icoのリクエスト処理で呼び出されるHttpレスポンスの処理の情報を格納したクラス /// (NULLを指定した場合は0byteのデータを返却する機能を持つクラスを設定) /// </param> /// <param name="responceProcesses"> /// Httpレスポンスの処理のクラスの配列 /// </param> public LocalHttpServer( HttpResponseData defaultProcess, HttpResponseData faviconProcess, params LocalHttpServerResponceProcess[] responceProcesses) { // Httpレスポンスの処理の設定クラスを生成しプロパティに設定する SetResponseProcessSetting(defaultProcess, faviconProcess, responceProcesses); }
/// <summary> /// Httpレスポンスの処理を行うデリゲートを設定する /// </summary> /// <param name="defaultProcess"> /// デフォルトで呼び出されるHttpレスポンスの処理の情報を格納したクラス /// (NULLを指定した場合は0byteのデータを返却する機能を持つクラスを設定) /// </param> /// <param name="faviconProcess"> /// GET favicon.icoのリクエスト処理で呼び出されるHttpレスポンスの処理の情報を格納したクラス /// (NULLを指定した場合は0byteのデータを返却する機能を持つクラスを設定) /// </param> /// <param name="responceProcesses"> /// Httpレスポンスの処理のクラスの配列 /// </param> public void SetResponseProcessSetting( HttpResponseData defaultProcess, HttpResponseData faviconProcess, params LocalHttpServerResponceProcess[] responceProcesses) { // Httpレスポンスの処理の設定クラスを生成しプロパティに設定する lock (lockSettingObject) { Setting = new LocalHttpServerResponseSetting( defaultProcess, faviconProcess, responceProcesses); } }
/// <summary> /// デフォルトコンストラクタ /// 各プロパティの初期化を行う /// </summary> /// <param name="method"> /// Httpメソッド /// </param> /// <param name="processName"> /// 処理名:URLのパスの部分の名称(正規表現で設定) /// </param> /// <param name="responseData"> /// Httpレスポンスの処理情報を格納したクラス /// (NULLを指定した場合は0byteのデータを返却する機能を持つクラスを設定) /// </param> /// <exception cref="ArgumentNullException"> /// 引数の <paramref name="method"/> 又は、<paramref name="processName"/> がNULLの場合に発生 /// </exception> /// <exception cref="ArgumentException"> /// 引数の <paramref name="processName"/> が正規表現として不正な値の場合に発生 /// </exception> public LocalHttpServerResponceProcess( HttpMethod method, string processName, HttpResponseData responseData) { // 各プロパティに値を設定 // Httpメソッド Method = method ?? throw new ArgumentNullException(nameof(method)); // Httpメソッドの文字列 MethodString = Method.ToString(); // URL(正規表現で設定) ProcessName = processName ?? throw new ArgumentNullException(nameof(processName)); // URLの正規表現オブジェクト ProcessNameRegex = new Regex(ProcessName); // レスポンスデータに対する処理情報を格納したクラス // 引数がNULLの場合は0byteのデータを返却する機能を持つクラスを設定する ResponseData = responseData ?? LocalHttpServerCommon.EmptyDataResponse; }
/// <summary> /// デフォルトコンストラクタ /// 各プロパティの初期化を行う /// </summary> /// <param name="defaultProcess"> /// デフォルトで呼び出されるHttpレスポンスの処理の情報を格納したクラス /// (NULLを指定した場合は0byteのデータを返却する機能を持つクラスを設定) /// </param> /// <param name="faviconProcess"> /// GET favicon.icoのリクエスト処理で呼び出されるHttpレスポンスの処理の情報を格納したクラス /// (NULLを指定した場合は0byteのデータを返却する機能を持つクラスを設定) /// </param> /// <param name="responceProcesses"> /// Httpレスポンスの処理のクラスの配列 /// </param> public LocalHttpServerResponseSetting( HttpResponseData defaultProcess, HttpResponseData faviconProcess, params LocalHttpServerResponceProcess[] responceProcesses) { // 各プロパティに値を設定 // デフォルトの処理 // 引数がNULLの場合は0byteのデータを返却する機能を持つクラスを設定 DefaultResponse = defaultProcess ?? LocalHttpServerCommon.EmptyDataResponse; // GET favicon.icoのリクエスト処理の処理 // 引数がNULLの場合は0byteのデータを返却する機能を持つクラスを設定 FaviconResponse = faviconProcess ?? LocalHttpServerCommon.EmptyDataResponse; // Httpレスポンスの処理のクラスの配列 // 引数がNULLの場合は要素0の配列を生成し設定 ResponceProcesses = responceProcesses == null ? new Collection <LocalHttpServerResponceProcess>() : new Collection <LocalHttpServerResponceProcess>(responceProcesses); }
private void SetResponseData( HttpListenerRequest request, Stream responseDataStream, out long dataSize, out string mimeType, out int statusCode) { try { // レスポンスデータを取得するためのデリゲート情報を取得する HttpResponseData responseData = GetTargetResponseData(request); dataSize = responseData.SetStream(responseDataStream, request); mimeType = responseData.MimeType; statusCode = 200; } catch (Exception ex) { // レスポンスデータ取得処理でエラーが発生した場合 // スタックトレース付きのエラーメッセージを取得 string errorMessage = ExceptionHandling.GetErrorMessageWithStackTrace(ex); // エラー用のHTMLレスポンスデータを生成 string errorResponse = string.Format( CultureInfo.InvariantCulture, ErrorMessage.LocalHttpServerErrorResponseHtmlFormat, errorMessage); byte[] responseData = System.Text.Encoding.UTF8.GetBytes(errorResponse); // 500:Internal Server Errorレスポンスを返却 LocalHttpServerCommon.SetDataToStream(responseDataStream, responseData); dataSize = responseData.LongLength; mimeType = "text/html"; statusCode = 500; } }