Author Topic: HttpServer JavaSE  (Read 313 times)

Jaia

  • Newbie
  • *
  • Posts: 8
  • Karma: 0
    • View Profile
HttpServer JavaSE
« on: Febrero 20, 2020, 03:11:11 am »
Hola:

Estoy realizando una aplicación que utiliza HttpServer. Más o menos funciona todo bien.

El cliente realiza peticiones a 127.0.0.1 en su puerto correspondiente y la respuesta HTML se lanza debidamente formateada. Éste documento HTML tiene que importar unas fuentes TTF, unos archivos CSS y tambíen JavaScript para que funcione correctamente.

Manda todos los datos sin problemas hasta que tiene que enviar los JavaScript. Tiene que enviar tres scripts claramente identificados en la aplicación y en el documento HTML generado, pero envía los datos mezclados.

Lo que hace es leer los tres archivos, los fusiona y los envía tres veces con los diferentes nombres. También tiene que leer varios archivos CSS y éstos no presentan ninguna alteración respecto a los originales.

La clase encargada del contexto JavaScript:

Code: [Select]
package controlador;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import comun.Prop;
import comun.RespuestaHTTP;
import java.io.IOException;
import java.util.Scanner;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.beans.Peticion;

public class Js implements HttpHandler {

    private Peticion p;
    private final StringBuilder doc = new StringBuilder();
    private String docFinal, ruta;

    @Override
    public void handle(HttpExchange he)
            throws IOException {
        boolean b = true;
        p = new Peticion(he);
        if (!p.getrAddress().equalsIgnoreCase(Prop.getProp(Prop.CONF, "uriBase"))) {
            new RespuestaHTTP().lanzarRespuestaHTTP(403, null, null, p);
            b = false;
        }
        if (b && p.getUri().length() > 255) {
            new RespuestaHTTP().lanzarRespuestaHTTP(413, null, null, p);
            b = false;
        }
        if (b && !p.getMetodo().equalsIgnoreCase("POST")
                && !p.getMetodo().equalsIgnoreCase("GET")) {
            new RespuestaHTTP().lanzarRespuestaHTTP(501, null, null, p);
            b = false;
        }
        ruta = Prop.getProp(Prop.MAPA, p.getUri());
        System.out.println("URI JS: " + ruta);
        if (b && ruta == null) {
            new RespuestaHTTP().lanzarRespuestaHTTP(404, null, null, p);
            b = false;
        }
        if (b) {
            Scanner sc = new Scanner(Js.class.getResourceAsStream(ruta));
            while (sc.hasNext()) {
                doc.append(sc.nextLine())
                        .append(System.getProperty("line.separator"));
            }
            docFinal = doc.toString();
            if (p.getUri().endsWith("/login.js")) {
                Set<Object> lista = Prop.getCadenasLogin();
                lista.forEach(c -> {
                    String s = (String) c;
                    try {
                        docFinal = docFinal.replaceAll("\\{" + s + "\\}", Prop.getProp(Prop.CADENAS, s));
                    } catch (IOException ex) {
                        Logger.getLogger(Js.class.getName()).log(Level.SEVERE, null, ex);
                    }
                });
                docFinal = docFinal.replaceAll("\\{puerto\\}", Prop.getProp(Prop.CONF, "puerto"));
            }
            new RespuestaHTTP().lanzarRespuestaHTTP(200, null, docFinal, p);
        }
    }

}
La clase encargada del contexto CSS:
Code: [Select]
package controlador;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import comun.Prop;
import comun.RespuestaHTTP;
import java.io.IOException;
import java.util.Scanner;
import modelo.beans.Peticion;

public class Css implements HttpHandler {

    private String docFinal, ruta;
    private Peticion p;

    @Override
    public void handle(HttpExchange he)
            throws IOException {
        boolean b = true;
        p = new Peticion(he);
        if (!p.getrAddress().equalsIgnoreCase(Prop.getProp(Prop.CONF, "uriBase"))) {
            new RespuestaHTTP().lanzarRespuestaHTTP(403, null, null, p);
            b = false;
        }
        if (b && p.getUri().length() > 255) {
            new RespuestaHTTP().lanzarRespuestaHTTP(413, null, null, p);
            b = false;
        }
        if (b && !p.getMetodo().equalsIgnoreCase("POST")
                && !p.getMetodo().equalsIgnoreCase("GET")) {
            new RespuestaHTTP().lanzarRespuestaHTTP(501, null, null, p);
            b = false;
        }
        ruta = Prop.getProp(Prop.MAPA, p.getUri());
//        System.out.println("URI CSS: " + ruta);
        if (b && ruta == null) {
            new RespuestaHTTP().lanzarRespuestaHTTP(404, null, null, p);
            b = false;
        }
        if (b) {
            StringBuilder doc = new StringBuilder();
            Scanner sc = new Scanner(Css.class.getResourceAsStream(ruta));
            while (sc.hasNext()) {
                doc.append(sc.nextLine())
                        .append(System.getProperty("line.separator"));
            }
            docFinal = doc.toString();
            new RespuestaHTTP().lanzarRespuestaHTTP(200, null, docFinal, p);
        }
    }

}
La clase RespuestaHTTP se encarga de enviar las cabeceras, los códigos pertinentes y en caso de error genera las respuestas automáticas.
La clase Prop contiene las propiedades generales de configuración y en el caso concreto de "Prop.getProp(Prop.MAPA, p.getUri())" realiza una búsqueda de la petición. Si la petición no se encuentra en la base de datos se genera un mensaje de error. Todas las rutas permitidas de la aplicación están especificadas en la base de datos, y éstas se encuentran bien diferenciadas.

Si tengo en el script1:
console.log("hola1");
...en el segundo:
console.log("hola2");
...y en el tercero:
console.log("hola3");
...el cliente recibe tres archivos con diferente nombre pero con contenido idéntico:
console.log("hola1");
console.log("hola2");
console.log("hola3");

No śe que puede estar sucediento. Alguna idea?

Siento la extensión del post. Gracias

 

ey