added HIO_SVC_HTTS_FILE_LIST_DIR
updated the file handler to list directory if the option is set
This commit is contained in:
parent
8ea676d337
commit
85616b1658
@ -146,7 +146,8 @@ enum hio_svc_htts_cgi_option_t
|
||||
enum hio_svc_htts_file_option_t
|
||||
{
|
||||
HIO_SVC_HTTS_FILE_NO_100_CONTINUE = (1 << 0),
|
||||
HIO_SVC_HTTS_FILE_READ_ONLY = (1 << 1)
|
||||
HIO_SVC_HTTS_FILE_READ_ONLY = (1 << 1),
|
||||
HIO_SVC_HTTS_FILE_LIST_DIR = (1 << 2)
|
||||
};
|
||||
|
||||
enum hio_svc_htts_thr_option_t
|
||||
|
@ -33,6 +33,8 @@
|
||||
#include <errno.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <dirent.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define FILE_ALLOW_UNLIMITED_REQ_CONTENT_LENGTH
|
||||
|
||||
@ -85,13 +87,11 @@ struct file_t
|
||||
hio_dev_sck_on_write_t client_org_on_write;
|
||||
hio_dev_sck_on_disconnect_t client_org_on_disconnect;
|
||||
hio_htrd_recbs_t client_htrd_org_recbs;
|
||||
|
||||
};
|
||||
typedef struct file_t file_t;
|
||||
|
||||
static int file_send_contents_to_client (file_t* file);
|
||||
|
||||
|
||||
static void file_halt_participating_devices (file_t* file)
|
||||
{
|
||||
HIO_ASSERT (file->client->htts->hio, file->client != HIO_NULL);
|
||||
@ -554,7 +554,7 @@ static int file_send_contents_to_client (file_t* file)
|
||||
}
|
||||
else if (n == 0)
|
||||
{
|
||||
/* no more data to read - this must not happend unless file size changed while the file is open. */
|
||||
/* no more data to read - this must not happen unless file size changed while the file is open. */
|
||||
/* TODO: I probably must close the connection by force??? */
|
||||
file_mark_over (file, FILE_OVER_READ_FROM_PEER);
|
||||
return -1;
|
||||
@ -701,7 +701,6 @@ static int open_peer_with_mode (file_t* file, const hio_bch_t* actual_file, int
|
||||
hio_bch_t* alt_file;
|
||||
int alt_fd;
|
||||
|
||||
/* TODO: create an option to support directory listing */
|
||||
alt_file = hio_svc_htts_dupmergepaths(file->htts, actual_file, "index.html"); /* TODO: make the default index files configurable */
|
||||
if (alt_file)
|
||||
{
|
||||
@ -715,16 +714,50 @@ static int open_peer_with_mode (file_t* file, const hio_bch_t* actual_file, int
|
||||
else
|
||||
{
|
||||
hio_freemem (file->htts->hio, alt_file);
|
||||
#if 0
|
||||
/* TODO: switch to directory listing if it's enabled */
|
||||
|
||||
if (file->options & HIO_SVC_HTTS_FILE_LIST_DIR)
|
||||
{
|
||||
/* switch to directory listing */
|
||||
DIR* dp;
|
||||
|
||||
dp = opendir(actual_file);
|
||||
if (dp)
|
||||
{
|
||||
close (file->peer);
|
||||
file->peer = dp;
|
||||
alt_file = hio_dupbcstr(file->htts->hio, "/tmp/.XXXXXX", HIO_NULL);
|
||||
if (alt_file)
|
||||
{
|
||||
/* TOOD: mkostemp instead and specify O_CLOEXEC and O_LARGEFILE? */
|
||||
alt_fd = mkstemp(alt_file);
|
||||
if (alt_fd >= 0)
|
||||
{
|
||||
struct dirent* de;
|
||||
|
||||
unlink (alt_file);
|
||||
while ((de = readdir(dp)))
|
||||
{
|
||||
/* TODO: do buffering ... */
|
||||
if (strcmp(de->d_name, ".") != 0)
|
||||
{
|
||||
write (alt_fd, de->d_name, strlen(de->d_name));
|
||||
write (alt_fd, "\n", 1);
|
||||
}
|
||||
/* TODO: call a directory entry formatter callback?? */
|
||||
}
|
||||
|
||||
lseek (alt_fd, SEEK_SET, 0);
|
||||
|
||||
close (file->peer);
|
||||
file->peer = alt_fd;
|
||||
opened_file = alt_file;
|
||||
}
|
||||
else
|
||||
{
|
||||
hio_freemem (file->htts->hio, alt_file);
|
||||
}
|
||||
}
|
||||
closedir (dp);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
test_default_index()
|
||||
{
|
||||
local msg="default index.html"
|
||||
local msg="hi-webs default index.html"
|
||||
local srvaddr=127.0.0.1:54321
|
||||
local tmpdir="/tmp/s-001.$$"
|
||||
../bin/hio-webs "${srvaddr}" "${tmpdir}" 2>/dev/null &
|
||||
|
Loading…
Reference in New Issue
Block a user