mirror of
https://github.com/cesanta/mongoose.git
synced 2024-11-24 19:19:00 +08:00
URI handler status code drives streaming behavior
This commit is contained in:
parent
3aaf47d4e4
commit
fc37b08139
47
examples/file.c
Normal file
47
examples/file.c
Normal file
@ -0,0 +1,47 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "mongoose.h"
|
||||
|
||||
|
||||
static int index_html(struct mg_connection *conn) {
|
||||
FILE *fp = (FILE *) conn->connection_param;
|
||||
char buf[200];
|
||||
size_t n = 0;
|
||||
|
||||
if (fp == NULL) {
|
||||
fp = fopen("../mongoose.c", "r");
|
||||
conn->connection_param = (void *) fp;
|
||||
}
|
||||
|
||||
if (fp != NULL) {
|
||||
n = fread(buf, 1, sizeof(buf), fp);
|
||||
mg_send_data(conn, buf, n);
|
||||
|
||||
if (n < sizeof(buf) || conn->wsbits != 0) {
|
||||
fclose(fp);
|
||||
conn->connection_param = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return n < sizeof(buf) ? 1 : 0;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
struct mg_server *server;
|
||||
|
||||
// Create and configure the server
|
||||
server = mg_create_server(NULL);
|
||||
mg_set_option(server, "listening_port", "8080");
|
||||
mg_add_uri_handler(server, "/", index_html);
|
||||
|
||||
// Serve request. Hit Ctrl-C to terminate the program
|
||||
printf("Starting on port %s\n", mg_get_option(server, "listening_port"));
|
||||
for (;;) {
|
||||
mg_poll_server(server, 1000);
|
||||
}
|
||||
|
||||
// Cleanup, and free server instance
|
||||
mg_destroy_server(&server);
|
||||
|
||||
return 0;
|
||||
}
|
31
mongoose.c
31
mongoose.c
@ -1896,6 +1896,19 @@ static void ping_idle_websocket_connection(struct connection *conn, time_t t) {
|
||||
#define ping_idle_websocket_connection(conn, t)
|
||||
#endif // !NO_WEBSOCKET
|
||||
|
||||
static void write_terminating_chunk(struct connection *conn) {
|
||||
mg_write(&conn->mg_conn, "0\r\n\r\n", 5);
|
||||
}
|
||||
|
||||
static void call_uri_handler(struct connection *conn) {
|
||||
if (conn->endpoint.uh->handler(&conn->mg_conn)) {
|
||||
if (conn->flags & CONN_HEADERS_SENT) {
|
||||
write_terminating_chunk(conn);
|
||||
}
|
||||
close_local_endpoint(conn);
|
||||
}
|
||||
}
|
||||
|
||||
static void write_to_client(struct connection *conn) {
|
||||
struct iobuf *io = &conn->remote_iobuf;
|
||||
int n = conn->ssl == NULL ? send(conn->client_sock, io->buf, io->len, 0) :
|
||||
@ -1915,6 +1928,12 @@ static void write_to_client(struct connection *conn) {
|
||||
io->len -= n;
|
||||
conn->num_bytes_sent += n;
|
||||
}
|
||||
|
||||
if (conn->endpoint_type == EP_USER) {
|
||||
conn->mg_conn.wsbits = conn->flags & CONN_CLOSE ? 1 : 0;
|
||||
call_uri_handler(conn);
|
||||
}
|
||||
|
||||
if (io->len == 0 && conn->flags & CONN_SPOOL_DONE) {
|
||||
conn->flags |= CONN_CLOSE;
|
||||
}
|
||||
@ -2163,10 +2182,6 @@ static void open_file_endpoint(struct connection *conn, const char *path,
|
||||
|
||||
#endif // NO_FILESYSTEM
|
||||
|
||||
static void write_terminating_chunk(struct connection *conn) {
|
||||
mg_write(&conn->mg_conn, "0\r\n\r\n", 5);
|
||||
}
|
||||
|
||||
static void call_uri_handler_if_data_is_buffered(struct connection *conn) {
|
||||
struct iobuf *loc = &conn->local_iobuf;
|
||||
struct mg_connection *c = &conn->mg_conn;
|
||||
@ -2177,12 +2192,8 @@ static void call_uri_handler_if_data_is_buffered(struct connection *conn) {
|
||||
do { } while (deliver_websocket_frame(conn));
|
||||
} else
|
||||
#endif
|
||||
if (loc->len >= c->content_len) {
|
||||
conn->endpoint.uh->handler(c);
|
||||
if (conn->flags & CONN_HEADERS_SENT) {
|
||||
write_terminating_chunk(conn);
|
||||
}
|
||||
close_local_endpoint(conn);
|
||||
if (loc->len >= c->content_len) {
|
||||
call_uri_handler(conn);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user