/// <summary> /// リクエスト処理スレッド /// </summary> /// <param name="context"></param> private void RequestWorker(object param) { HttpListenerContext httpContext = (HttpListenerContext)param; HttpListenerRequest httpRequest = httpContext.Request; HttpListenerResponse httpResponse = httpContext.Response; //生リクエストを表示 LogWrite("[request] " + httpRequest.RawUrl); string[] query = httpRequest.RawUrl.Split('/'); string externalResponseText = null; //メソッド呼び出しの場合はイベントを発生 if (query[1] == MethodNamespace && query.Length > 2 && ExternalAccessEnable) { ExternalMethodArgs e = new ExternalMethodArgs(); string[] methodQuery = new string[query.Length - 2]; for (int i = 2; i < query.Length; i++) { methodQuery[i - 2] = query[i]; } e.query = methodQuery; e.response = null; externalResponseText = OnExternalMethod(e); } //拡張メソッドの戻り値があればレスポンスを返す if (externalResponseText != null) { httpResponse.StatusCode = 200; byte[] httpResponseBytes = StringToBytes(externalResponseText); httpResponse.OutputStream.Write(httpResponseBytes, 0, httpResponseBytes.Length); } else { //拡張メソッド外応答 string path = DocumentRoot + httpRequest.RawUrl.Replace("/", pathSplitter); if (FileAccessEnable) { //ファイルが無ければ404 if (File.Exists(path)) { httpResponse.StatusCode = 200; } else { httpResponse.StatusCode = 404; path = TemplateDirectory + DEFAULT_404_PAGE; } } else { httpResponse.StatusCode = 403; path = TemplateDirectory + DEFAULT_403_PAGE; } //pathを確認し、ファイルが存在すればレスポンスを返す if (File.Exists(path)) { byte[] content = File.ReadAllBytes(path); httpResponse.OutputStream.Write(content, 0, content.Length); } else { httpResponse.StatusCode = 500; byte[] httpResponseBytes = StringToBytes(InternalServerErrorMessage.Replace("$SERVER_NAME",ServerName) ); httpResponse.OutputStream.Write(httpResponseBytes, 0, httpResponseBytes.Length); } } try{ httpResponse.Close(); }catch{ } }
protected virtual string OnExternalMethod(ExternalMethodArgs e) { if (ExternalMethod != null) { ExternalMethod(this, e); } return e.response; }