Skip to content
This repository was archived by the owner on Jul 31, 2022. It is now read-only.

Commit ff664ea

Browse files
committed
Added SSE (unstable and untested)
1 parent 9ae48ed commit ff664ea

File tree

6 files changed

+44
-26
lines changed

6 files changed

+44
-26
lines changed

.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,4 @@ out
44
*.iml
55
# Project ignore
66
.docs
7-
src/LICENSE.txt
8-
_ignore.java
7+
src/LICENSE.txt

src/ktt/lib/httpserver/handler/FileHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.io.*;
88
import java.util.*;
99

10+
// todo: documentation
1011
public class FileHandler extends SimpleHttpHandler {
1112

1213
private final FileHandlerAdapter adapter;

src/ktt/lib/httpserver/handler/PredicateHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class PredicateHandler extends SimpleHttpHandler {
2424
private final Predicate<SimpleHttpExchange> predicate;
2525

2626
/**
27-
* Creates a predicate handler
27+
* Creates a predicate handler.
2828
*
2929
* @param trueHandler handler to use if true
3030
* @param falseHandler handler to use if false

src/ktt/lib/httpserver/handler/SSEHandler.java

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
package ktt.lib.httpserver.handler;
22

33
import ktt.lib.httpserver.http.RequestMethod;
4-
import ktt.lib.httpserver.server.*;
4+
import ktt.lib.httpserver.server.SimpleHttpExchange;
5+
import ktt.lib.httpserver.server.SimpleHttpHandler;
56

67
import java.io.IOException;
78
import java.util.*;
89

10+
/**
11+
* This handler processes event-streams.
12+
*
13+
* @see SimpleHttpHandler
14+
* @see com.sun.net.httpserver.HttpHandler
15+
* @since 02.00.00
16+
* @version 02.00.00
17+
* @author Ktt Development
18+
*/
919
public class SSEHandler extends SimpleHttpHandler {
1020

11-
private final List<HttpSession> listeners = new ArrayList<>(); // listeners
21+
private final List<SimpleHttpExchange> listeners = new ArrayList<>(); // listeners
1222
private int id = -1;
1323
private final LinkedList<String> queue = new LinkedList<>(); // event queue
1424

@@ -24,13 +34,36 @@ public final void handle(final SimpleHttpExchange exchange) throws IOException{
2434
return;
2535
}
2636
exchange.getResponseHeaders().add("content-type","text/event-stream");
27-
final int latest = exchange.getRequestHeaders().getFirst("Last-Event-ID")
28-
exchange.send(200);
37+
int latest = 0;
38+
try{
39+
latest = Integer.parseInt(exchange.getRequestHeaders().getFirst("Last-Event-ID"));
40+
}catch(final NumberFormatException | NullPointerException ignored){ }
41+
42+
for(int index = latest; index < queue.size(); index++)
43+
exchange.send(queue.get(index));
44+
45+
listeners.add(exchange);
2946
}
3047

31-
public final void addToEventQueue(final String s){
48+
/**
49+
* Pushes an event to the event stream.
50+
*
51+
* @param s event data
52+
*
53+
* @since 02.00.00
54+
* @author Ktt Development
55+
*/
56+
public final void push(final String s){
3257
id++;
3358
queue.add(s);
59+
listeners.forEach(exchange -> {
60+
final StringBuilder OUT = new StringBuilder();
61+
OUT.append("id: ").append(id).append("\n");
62+
OUT.append("data: ").append(s).append("\n\n");
63+
try{
64+
exchange.send(OUT.toString());
65+
}catch(final IOException ignored){}
66+
});
3467
}
3568

3669
}

src/ktt/lib/httpserver/server/SimpleHttpExchange.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
/**
1414
* <i>This class is a simplified implementation of {@link HttpExchange}</i>. <br>
15-
* This class provides methods to process requests from the client and send a response back. Each request can only send a single response. <br><br>
15+
* This class provides methods to process requests from the client and send a response back. <br><br>
1616
* Get/post type requests for <code>application/x-www-form-urlencoded</code> (default) will be a simple key/value map. <br>
1717
* Get/post type requests for <code>multipart/form-data</code> will use an expanded map. <br>
1818
* Example:

src/ktt/lib/httpserver/server/SimpleHttpExchangeImpl.java

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,6 @@ static SimpleHttpExchange createSimpleHttpExchange(final HttpExchange exchange){
6262

6363
private final HashMap<String,String> cookies;
6464

65-
private boolean closed = false;
66-
6765
//
6866

6967
private final Function<String,HashMap<String,String>> parseWwwFormEnc = s -> {
@@ -368,9 +366,7 @@ public synchronized final HttpSession getHttpSession(){
368366

369367
@Override
370368
public synchronized final void sendResponseHeaders(final int code, final long length) throws IOException{
371-
if(closed) return;
372369
httpExchange.sendResponseHeaders(code, length);
373-
close();
374370
}
375371

376372
@Override
@@ -395,8 +391,6 @@ public synchronized final void send(final byte[] response, final int responseCod
395391

396392
@Override
397393
public void send(final byte[] response, final int responseCode, final boolean gzip) throws IOException{
398-
if(closed) return;
399-
400394
if(gzip){
401395
exchange.getResponseHeaders().set("Accept-Encoding","gzip");
402396
exchange.getResponseHeaders().set("Content-Encoding","gzip");
@@ -405,17 +399,11 @@ public void send(final byte[] response, final int responseCode, final boolean gz
405399
GZIPOutputStream OUT = new GZIPOutputStream(exchange.getResponseBody());
406400
OUT.write(response);
407401
OUT.finish();
408-
OUT.close();
409-
exchange.getResponseBody().close();
410-
411-
close();
412402
}else{
413403
sendResponseHeaders(responseCode,response.length);
414404
final OutputStream OUT = exchange.getResponseBody();
415405
OUT.write(response);
416-
OUT.close();
417-
418-
close();
406+
OUT.flush();
419407
}
420408
}
421409

@@ -443,10 +431,7 @@ public void send(final String response, final int responseCode, final boolean gz
443431

444432
@Override
445433
public synchronized final void close(){
446-
if(!closed){
447-
exchange.close();
448-
closed = true;
449-
}
434+
exchange.close();
450435
}
451436

452437
//

0 commit comments

Comments
 (0)