/// <summary> /// Tarea encargada de ejecutar el proceso HTTP /// </summary> /// <param name="context"></param> private void HttpListenerCallback(HttpListenerContext context) { byte[] respuesta = new byte[0]; String data_text = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding).ReadToEnd(); try { String[] ruta = context.Request.RawUrl.Split('/'); //La ruta es /fichero/{usuario} y es un POST if (ruta[1].CompareTo("fichero") == 0 && context.Request.HttpMethod.CompareTo("POST") == 0 && ruta.Length == 3) { Logger.Log("Servicio POST fichero iniciado"); byte[] fichero = Convert.FromBase64String(data_text); if (fichero.Length > 5 * 1024 * 1024) { context.Response.StatusCode = 413; context.Response.StatusDescription = "Request Entity Too Large"; RespuestaError re = new RespuestaError() { Error = "El fichero no puede ser más grande de 5 MB" }; respuesta = Funciones.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(re)); } else { FicheroMP3 ficheroMP3 = new FicheroMP3() { Usuario = ruta[2], FechaRecepcion = DateTime.UtcNow, Estado = FicheroMP3.EstadosFicheroMP3.Pendiente, FechaTranscripcion = null, Transcripcion = null }; BD.AddFicheroMP3(ficheroMP3); using (FileStream fs = new FileStream(System.AppDomain.CurrentDomain.BaseDirectory + ficheroMP3.Id + ".mp3", FileMode.Create, FileAccess.Write)) { fs.Write(fichero, 0, fichero.Length); } context.Response.StatusCode = 200; context.Response.StatusDescription = "Ok"; } } //La ruta es /ficheros/{usuario} y es un GET. Los parámetros desde y hasta al ser opcionales no van en formato Friendly, sino en Query Parameters else if (ruta[1].CompareTo("ficheros") == 0 && context.Request.HttpMethod.CompareTo("GET") == 0 && ruta.Length == 3) { Logger.Log("Servicio GET ficheros iniciado"); DateTime?desde = null; DateTime?hasta = null; Boolean paramsOK = true; if (context.Request.QueryString["desde"] != null) { desde = Funciones.CheckParamFecha(context.Request.QueryString["desde"], ref respuesta); if (desde == null) { paramsOK = false; } } if (context.Request.QueryString["hasta"] != null) { hasta = Funciones.CheckParamFecha(context.Request.QueryString["hasta"], ref respuesta); if (hasta == null) { paramsOK = false; } } if (paramsOK) { context.Response.StatusCode = 200; context.Response.StatusDescription = "Ok"; respuesta = Funciones.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(BD.GetLista(ruta[2].Split('?')[0], desde, hasta))); } else { context.Response.StatusCode = 400; context.Response.StatusDescription = "Bad Request"; } } //La ruta es /fichero/{usuario}/{id} y es un GET else if (ruta[1].CompareTo("fichero") == 0 && context.Request.HttpMethod.CompareTo("GET") == 0 && ruta.Length == 4) { Logger.Log("Servicio GET fichero iniciado"); Int32 id; if (Int32.TryParse(ruta[3], out id)) { RespuestaTranscripcion rt = BD.GetTranscripcion(ruta[2], id); if (rt.Codigo == 0) { context.Response.StatusCode = 200; context.Response.StatusDescription = "Ok"; respuesta = Funciones.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(rt)); } else if (rt.Codigo == -1) { context.Response.StatusCode = 404; context.Response.StatusDescription = "Not Found"; } else if (rt.Codigo == -2) { context.Response.StatusCode = 410; context.Response.StatusDescription = "Gone"; } else { context.Response.StatusCode = 204; context.Response.StatusDescription = "No Content"; } } else { context.Response.StatusCode = 400; context.Response.StatusDescription = "Bad Request"; } } //Cualquier otro caso la ruta no existe y se devuelve Not Found. else { context.Response.StatusCode = 404; context.Response.StatusDescription = "Not Found"; } } catch (System.Exception ex) { //Si se produce una excepción se devuelve un Internal Server Error (500) context.Response.StatusCode = 500; context.Response.StatusDescription = "Internal Server Error"; respuesta = Funciones.GetBytes(ex.ToString()); } context.Response.ContentLength64 = respuesta.Length; context.Response.OutputStream.Write(respuesta, 0, respuesta.Length); context.Response.Close(); }