private async Task WriteResponseAsync(string request, ITcpSocketClient socket ) { Stream writeStream = socket.WriteStream; IGWClient client = null; Dictionary<string, string> parameters = null; const string C_REPTYPE = "reptype"; const string C_CONTENTTYPE_HTML = "text/html; charset=utf-8;"; const string C_REPTYPE_XML = "xml"; const string C_CONTENTTYPE_XML = "text/xml; charset=utf-8;"; #if JSON const string C_REPTYPE_JSON = "json"; const string C_CONTENTTYPE_JSON = "application/json"; #endif const string C_HTTP_CODE_OK = "200"; const string C_HTTP_CODE_BADREQUEST = "400"; const string C_HTTP_CODE_NOTFOUND = "404"; const string C_HTTP_CODE_INTERNAL_ERROR = "500"; string httpCode = C_HTTP_CODE_OK; string httpCodeTest = ""; string httpContent = ""; string httpContentType = C_CONTENTTYPE_XML; // default XML // parse request to get client and parametres items RequestParse(request, out client, out parameters); if (client != null) { // check response format to use if (parameters != null && parameters.ContainsKey(C_REPTYPE)) { if (parameters[C_REPTYPE] == C_REPTYPE_XML) httpContentType = C_CONTENTTYPE_XML; #if JSON else if (parameters[C_REPTYPE] == C_REPTYPE_JSON) httpContentType = C_CONTENTTYPE_JSON; #endif else { client = null; // bad => simulate 400 httpCode = C_HTTP_CODE_BADREQUEST; } } } else { httpCode = C_HTTP_CODE_NOTFOUND; } if (client != null) { // transfert request to client GWClientResult ret = await client.ExecuteAsync(parameters); if (ret!= null) { // contruct response XElement xresult = new XElement("Result"); XElement xrequest = new XElement("Request"); XElement xresponse = new XElement("Response"); xrequest.Add(new XElement("Uri", request)); xrequest.Add(new XElement("RemoteAddress", socket.RemoteAddress)); xrequest.Add(new XElement("RemotePort", socket.RemotePort)); XElement xparams = new XElement("Parameters"); if (parameters != null) { foreach (var parmeter in parameters) { XElement xparam = new XElement("Parameter"); xparam.Add(new XAttribute("Key", parmeter.Key)); xparam.Add(new XElement("Value", parmeter.Value)); xparams.Add(xparam); } } xrequest.Add(xparams); xresponse.Add(new XElement("Success", ret.Success ? "1" : "0")); xresponse.Add(new XElement("Message", ret.Message)); xresponse.Add(ret.Data); xresult.Add(xrequest); xresult.Add(xresponse); ret.Data.Add(new XAttribute("ClientName", client.Name)); if (httpContentType == C_CONTENTTYPE_XML) { XDeclaration decl = new XDeclaration("1.0", "UTF-8", null); httpContent = decl.ToString() + "\r\n" + xresult.ToString(); } #if JSON else if (httpContentType == C_CONTENTTYPE_JSON) { httpContent = JsonConvert.SerializeObject(xresult); } #endif } else { client = null; httpCode = C_HTTP_CODE_INTERNAL_ERROR; } } // bad request or client not found if (client == null) { switch (httpCode) { case C_HTTP_CODE_BADREQUEST: httpCodeTest = "BAD RESQUEST"; break; case C_HTTP_CODE_NOTFOUND: httpCodeTest = "NOT FOUND"; break; case C_HTTP_CODE_INTERNAL_ERROR: httpCodeTest = "INTERNAL SERVER ERROR"; break; default: httpCodeTest = "UNKNWON CODE"; break; } httpContentType = C_CONTENTTYPE_HTML; httpContent = string.Format("<html><body>{0} - {1} : {2}</body></html>", httpCode, httpCodeTest, request); } // write response byte[] bodyArray = Encoding.UTF8.GetBytes(httpContent); string header = String.Format("HTTP/1.1 {0} OK\r\n" + "Content-Length: {1}\r\n" + "Content-Type: {2} \r\n" + "Connection: close\r\n\r\n", httpCode, bodyArray.Length, httpContentType); byte[] headerArray = Encoding.UTF8.GetBytes(header); try { await writeStream.WriteAsync(headerArray, 0, headerArray.Length); if (bodyArray.Length > 0) { await writeStream.WriteAsync(bodyArray, 0, bodyArray.Length); } await writeStream.FlushAsync(); } catch (Exception ex) { _2BDebug.Output(ex); } }