33import java .nio .charset .StandardCharsets ;
44import java .util .LinkedHashMap ;
55import java .util .Map ;
6+ import java .util .TreeMap ;
67
78public class HttpResponseBuilder {
89
910 private static final String PROTOCOL = "HTTP/1.1" ;
1011 private int statusCode = 200 ;
1112 private String body = "" ;
12- private Map <String , String > headers = new LinkedHashMap <>();
13+ private Map <String , String > headers = new TreeMap <>(String . CASE_INSENSITIVE_ORDER );
1314
1415 private static final String CRLF = "\r \n " ;
1516
@@ -41,34 +42,17 @@ public void setContentTypeFromFilename(String filename) {
4142 404 , "Not Found" ,
4243 500 , "Internal Server Error" );
4344
44- public String build () {
45+ public String build (){
4546 StringBuilder sb = new StringBuilder ();
4647 String reason = REASON_PHRASES .getOrDefault (statusCode , "OK" );
47-
48- // Status line
4948 sb .append (PROTOCOL ).append (" " ).append (statusCode ).append (" " ).append (reason ).append (CRLF );
50-
51- // User-defined headers
52- headers .forEach ((k , v ) -> sb .append (k ).append (": " ).append (v ).append (CRLF ));
53-
54- // Only append Content-Length if not already set
55- if (!headers .containsKey ("Content-Length" )) {
56- sb .append ("Content-Length: " )
57- .append (body .getBytes (StandardCharsets .UTF_8 ).length )
58- .append (CRLF );
59- }
60-
61- // Only append Connection if not already set
62- if (!headers .containsKey ("Connection" )) {
63- sb .append ("Connection: close" ).append (CRLF );
64- }
65-
66- // Blank line before body
49+ headers .forEach ((k ,v ) -> sb .append (k ).append (": " ).append (v ).append (CRLF ));
50+ sb .append ("Content-Length: " )
51+ .append (body .getBytes (StandardCharsets .UTF_8 ).length );
52+ sb .append (CRLF );
53+ sb .append ("Connection: close" ).append (CRLF );
6754 sb .append (CRLF );
68-
69- // Body
7055 sb .append (body );
71-
7256 return sb .toString ();
7357 }
7458}
0 commit comments