Браузер не определяет заголовок ответа HTTP? - PullRequest
0 голосов
/ 23 октября 2019
import java.io.*;
import java.net.*;

public class WebServer{

    private void run(){
        try {
            ServerSocket serverSocket = new ServerSocket(5520);
            while(true){
                try {
                    Socket serverClient = serverSocket.accept();
                    WebServerThread wst = new WebServerThread(serverClient);
                    wst.start();
                } catch (IOException evt) {
                    System.out.println("Error");
                }
            }
        } catch (IOException evt) {
            System.out.println("error");
        }
    }

    public static void main(String[] args) {
        WebServer ws = new WebServer();
        System.out.println("Server is up and running.");
        ws.run();

    }
}
import java.io.*;
import java.net.*;
import java.lang.*;

class WebServerThread extends Thread {

    Socket serverClient;
    BufferedReader in = null;

    public WebServerThread(Socket clientSocket) {
        serverClient = clientSocket;
    }

    public void run() {
        try {
            in = new BufferedReader(new InputStreamReader(serverClient.getInputStream()));
            //System.out.println(in.readLine());
            HTTP http = new HTTP(in.readLine(), serverClient);


            in.close();
            serverClient.close();
        } catch (IOException e) {
            System.out.println("Error");
        } catch (NullPointerException e){
            System.out.println("bad");
        }


    }

}
import java.io.*;
import java.nio.Buffer;
import java.util.StringTokenizer;
import java.net.*;

public class HTTP {

    String contentTypeLine;
    String file;
    String version = "HTTP/1.1";
    //String crlf = "\\r\\n";
    String statusLine;
    String responseHeader;
    String statusCodePhrase;
    String headerFieldName = "Content-type: ";
    String headerValue;
    String header;

    public HTTP(String request, Socket socket) throws IOException {

        StringTokenizer st = new StringTokenizer(request);
        st.nextToken();
        file = "." + st.nextToken();
        try {
            BufferedInputStream bin = new BufferedInputStream(new FileInputStream(file));
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            headerValue = contentType(file);
            statusLine = "HTML/1.0 200 OK\r\n";
            responseHeader = "Content-type: " + headerValue + "\r\n";
            dos.writeBytes(statusLine);
            dos.writeBytes(responseHeader);
            dos.writeBytes("\r\n");
            System.out.println(statusLine);
            System.out.println(responseHeader);
            System.out.println("Client requesting file: " + file);
            writeEntityBody(file, bin, dos);
            System.out.println("FIle: " + file + " sent successfully.");
        } catch (FileNotFoundException evt) {
            System.out.println(file + " not found.");
            System.out.println("Requested file does not exist.");
            statusCodePhrase = "404 Not Found";
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            dos.writeBytes("<HTML>" + "<HEAD><TITLE>Not Found</TITLE></HEAD>"
                + "<BODY>Not Found</BODY></HTML>");
        } catch (IOException evt) {
            System.out.println("Bad");
       }
    }

    private void writeEntityBody(String file, BufferedInputStream bin, DataOutputStream dos) throws IOException {

        int CHUNK_SIZE = 1024;
        byte[] buffer = new byte[CHUNK_SIZE];
        int len;
        while ((len = bin.read(buffer)) != -1) {
            dos.write(buffer, 0, len);
        }
        bin.close();
        dos.flush();
        dos.close();
    }

    private String contentType(String file){

        String extension = file.split("\\.")[2];
        if(extension.equals("htm") || extension.equals("html") || extension.equals("txt")){
            contentTypeLine =  "text/html";
        }
        else if(extension.equals("jpg") || extension.equals("gif") || extension.equals("png") || extension.equals("bmp") || extension.equals("pdf")) {
            contentTypeLine =  "image/bmp";
        }
        else{
            return "application/octet-stream";
        }
        return contentTypeLine;
    }
}

Таким образом, мой сервер прослушивает запрос от клиента, который является браузером, поэтому, если я наберу "127.0.0.1:5520/test.txt", он подключится к порту 5520 и запросит файл "test.txtMsgstr ".

С точки зрения прослушивания запросов и запуска потоков, это нормально. Но в классе HTTP, когда моя программа выполняет следующие строки:

  headerValue = contentType(file);
  statusLine = "HTML/1.0 200 OK\r\n";
  responseHeader = "Content-type: " + headerValue + "\r\n";
  dos.writeBytes(statusLine);
  dos.writeBytes(responseHeader);
  dos.writeBytes("\r\n");

В идеале это должно создать заголовок, а браузер должен это определить. Но браузер просто пишет все это, как если бы оно было частью тела сообщения.

Я пробовал это на нескольких разных браузерах, и это были результаты:

  • IE: отображает statusLine, responseHeader, как если бы он был частью тела сообщения, и отображает содержимое файла.

  • Firefox: выбрасывает statusLine, отображает responseHeader как часть сообщенияbody и отображает содержимое файла.

  • Chrome: ERR_INVALID_HTTP_RESPONSE

Я не уверен, почему браузер не может определить заголовок.

1 Ответ

2 голосов
/ 23 октября 2019

Подсказка: протокол называется «HTTP», а не «HTML».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...