2016-08-01 24 views
1

Ich spiele mit HTTP-Servern und laufe auf ein Problem. Ich muss der Antwort ContentType-Header hinzufügen, aber wenn ich das tue, erhält der Client ERR_EMPTY_RESPONSE.Hinzufügen von Content-Type-Headern zu Java HTTP-Echo-Server

Wenn ich entfernen:

headers.add("Content-Type", "text/html"); 

Dann wird der Server funktioniert gut, aber ich brauche die CType-Header für meine Anwendung zu übergeben. Was gibt? Wie schließe ich Content-Type-Header ein?

/* 
* EchoServer.java 
* 
* Accept an HTTP request and echo it back as the HTTP response. 
* 
* Copyright (c) 2005 Sun Microsystems, Inc 
* Copyright (c) 2008 Operational Dynamics Consulting, Pty Ltd 
* 
* The code in this file is made available to you by its authors under the 
* terms of the "GNU General Public Licence, version 2" See the LICENCE file 
* for the terms governing usage and redistribution. 
*/ 

/* 
* This code is a simple derivation of the example in the package 
* documentation for com.sun.net.httpserver, as found in file 
* jdk/src/share/classes/com/sun/net/httpserver/package-info.java as shipped 
* with the openjdk 1.6 b08 code drop. Used under the terms of the GPLv2. 
*/ 

import static java.net.HttpURLConnection.HTTP_OK; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.InetSocketAddress; 
import java.net.URLDecoder; 
import java.util.List; 

import com.sun.net.httpserver.Headers; 
import com.sun.net.httpserver.HttpExchange; 
import com.sun.net.httpserver.HttpExchange.*; 
import com.sun.net.httpserver.HttpHandler; 
import com.sun.net.httpserver.HttpServer; 

/** 
* Echo the body of an HTTP request back as the HTTP response. This is merely 
* a simple exercise of the Secret Sun Web Server. As configured, the URL to 
* access it is http://localhost:8000/echo. 
* 
* @author Andrew Cowie 
*/ 
public final class Test { 
    public static void main(String[] args) throws IOException { 
     final InetSocketAddress addr; 
     final HttpServer server; 

     addr = new InetSocketAddress(8000); 

     server = HttpServer.create(addr, 10); 
     server.createContext("/echo", new EchoHandler()); 
     server.start(); 
    } 
} 

class EchoHandler implements HttpHandler { 
    public void handle(HttpExchange t) throws IOException { 
     final InputStream is; 
     final OutputStream os; 
     StringBuilder buf; 
     int b; 
     final String request, response; 

     buf = new StringBuilder(); 

    /* 
    * Get the request body and decode it. Regardless of what you are 
    * actually doing, it is apparently considered correct form to consume 
    * all the bytes from the InputStream. If you don't, closing the 
    * OutputStream will cause that to occur 
    */ 

     is = t.getRequestBody(); 

     while ((b = is.read()) != -1) { 
      buf.append((char) b); 
     } 

     is.close(); 

     if (buf.length() > 0) { 
      request = URLDecoder.decode(buf.toString(), "UTF-8"); 
     } else { 
      request = null; 
     } 

    /* 
    * Construct our response: 
    */ 

     buf = new StringBuilder(); 
     buf.append("<html><head><title>HTTP echo server</title></head><body>"); 
     buf.append("<p><pre>"); 
     buf.append(t.getRequestMethod() + " " + t.getRequestURI() + " " + t.getProtocol() + "\n"); 

    /* 
    * Process the request headers. This is a bit involved due to the 
    * complexity arising from the fact that headers can be repeated. 
    */ 

     Headers headers = t.getRequestHeaders(); 

     for (String name : headers.keySet()) { 
      List<String> values = headers.get(name); 

      for (String value : values) { 
       buf.append(name + ": " + value + "\n"); 
      } 
     } 

    /* 
    * If there was an actual body to the request, add it: 
    */ 

     if (request != null) { 
      buf.append("\n"); 
      buf.append(request); 
     } 

     buf.append("</pre></p>"); 
     buf.append("</body></html>\n"); 

     response = buf.toString(); 
     System.out.println(response); 

    /* 
    * And now send the response. We could have instead done this 
    * dynamically, using 0 as the response size (forcing chunked 
    * encoding) and writing the bytes of the response directly to the 
    * OutputStream, but building the String first allows us to know the 
    * exact length so we can send a response with a known size. Better :) 
    */ 

     headers.add("Content-Type", "text/html"); 
     t.sendResponseHeaders(HTTP_OK, response.length()); 

     os = t.getResponseBody(); 

     os.write(response.getBytes()); 

    /* 
    * And we're done! 
    */ 

     os.close(); 
     t.close(); 
    } 
} 

Antwort

0

Sie extrahieren die Header aus dem request und Header Anfrage Wechsel keinen Sinn machen. Sie müssen die Antwortheader ändern. Sie können dies tun, indem Sie die folgenden

t.getResponseHeaders().add("Content-Type", "text/html"); 
+1

hinzufügen Mein Held! Das hat funktioniert! : D Ich werde dies auf die Antwort setzen, wenn es mich lässt. – Alias