[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libmicrohttpd] branch master updated: add ability to serve files from p
From: |
gnunet |
Subject: |
[libmicrohttpd] branch master updated: add ability to serve files from pipe |
Date: |
Sun, 26 Jul 2020 14:21:54 +0200 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository libmicrohttpd.
The following commit(s) were added to refs/heads/master by this push:
new 1c4f23db add ability to serve files from pipe
new c575f672 Merge branch 'master' of git+ssh://gnunet.org/libmicrohttpd
1c4f23db is described below
commit 1c4f23db7458d79a04c8e68022ade67cb5ee006b
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Sun Jul 26 14:15:50 2020 +0200
add ability to serve files from pipe
---
ChangeLog | 4 +++
doc/libmicrohttpd.texi | 15 +++++++++++
src/include/microhttpd.h | 20 ++++++++++++---
src/microhttpd/connection.c | 3 +++
src/microhttpd/internal.h | 5 ++++
src/microhttpd/response.c | 61 +++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 105 insertions(+), 3 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index ebbe7994..a2e24c02 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sun 26 Jul 2020 01:56:54 PM CEST
+ Add MHD_create_response_from_pipe() to allow creating a response based
+ on data read from a pipe. -CG
+
Fri Jul 10 15:04:51 CEST 2020
Fixed Postprocessor URL-encoded parsing if '%' fell on boundary. -CG/MD
diff --git a/doc/libmicrohttpd.texi b/doc/libmicrohttpd.texi
index 150dd048..fd776028 100644
--- a/doc/libmicrohttpd.texi
+++ b/doc/libmicrohttpd.texi
@@ -2018,6 +2018,21 @@ Return @code{NULL} on error (i.e. invalid arguments, out
of memory).
@end deftypefun
+@deftypefun {struct MHD_Response *} MHD_create_response_from_pipe (uint64_t
size, int fd)
+Create a response object. The response object can be extended with
+header information and then it can be used ONLY ONCE.
+
+@table @var
+@item fd
+file descriptor of the read-end of the pipe; will be
+closed when response is destroyed.
+The descriptor should be in blocking-IO mode.
+@end table
+
+Return @code{NULL} on error (i.e. out of memory).
+@end deftypefun
+
+
@deftypefun {struct MHD_Response *} MHD_create_response_from_fd_at_offset
(size_t size, int fd, off_t offset)
Create a response object. The response object can be extended with
header information and then it can be used any number of times.
diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h
index 09983ab7..7aff40f5 100644
--- a/src/include/microhttpd.h
+++ b/src/include/microhttpd.h
@@ -180,7 +180,7 @@ enum MHD_Result
#define _MHD_EXTERN extern
#elif defined (_WIN32) && defined(MHD_W32DLL)
/* Define MHD_W32DLL when using MHD as W32 .DLL to speed up linker a little */
-#define _MHD_EXTERN __declspec (dllimport)
+#define _MHD_EXTERN __declspec(dllimport)
#else
#define _MHD_EXTERN extern
#endif
@@ -262,10 +262,10 @@ typedef SOCKET MHD_socket;
#ifndef _MHD_DEPR_FUNC
#if defined(_MSC_FULL_VER) && _MSC_VER + 0 >= 1400
/* VS 2005 or later */
-#define _MHD_DEPR_FUNC(msg) __declspec (deprecated (msg))
+#define _MHD_DEPR_FUNC(msg) __declspec(deprecated (msg))
#elif defined(_MSC_FULL_VER) && _MSC_VER + 0 >= 1310
/* VS .NET 2003 deprecation do not support custom messages */
-#define _MHD_DEPR_FUNC(msg) __declspec (deprecated)
+#define _MHD_DEPR_FUNC(msg) __declspec(deprecated)
#elif (__GNUC__ + 0 >= 5) || (defined (__clang__) && \
(__clang_major__ + 0 > 2 || (__clang_major__ + 0 == 2 && __clang_minor__ >= \
9)))
/* FIXME: earlier versions not tested */
@@ -3125,6 +3125,20 @@ MHD_create_response_from_fd (size_t size,
int fd);
+/**
+ * Create a response object. The response object can be extended with
+ * header information and then be used ONLY ONCE.
+ *
+ * @param fd file descriptor referring to a read-end of a pipe with the
+ * data; will be closed when response is destroyed;
+ * fd should be in 'blocking' mode
+ * @return NULL on error (i.e. invalid arguments, out of memory)
+ * @ingroup response
+ */
+_MHD_EXTERN struct MHD_Response *
+MHD_create_response_from_pipe (int fd);
+
+
/**
* Create a response object. The response object can be extended with
* header information and then be used any number of times.
diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index 7a17c628..ceae1cf8 100644
--- a/src/microhttpd/connection.c
+++ b/src/microhttpd/connection.c
@@ -3957,11 +3957,14 @@ MHD_queue_response (struct MHD_Connection *connection,
connection->responseCode = status_code;
#if defined(_MHD_HAVE_SENDFILE)
if ( (response->fd == -1) ||
+ (response->is_pipe) ||
(0 != (connection->daemon->options & MHD_USE_TLS)) )
connection->resp_sender = MHD_resp_sender_std;
else
connection->resp_sender = MHD_resp_sender_sendfile;
#endif /* _MHD_HAVE_SENDFILE */
+ /* FIXME: if 'is_pipe' is set, TLS is off, and we have *splice*, we could
use splice()
+ to avoid two user-space copies... */
if ( ( (NULL != connection->method) &&
(MHD_str_equal_caseless_ (connection->method,
diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h
index 3fdc7e5c..8f0e821a 100644
--- a/src/microhttpd/internal.h
+++ b/src/microhttpd/internal.h
@@ -400,6 +400,11 @@ struct MHD_Response
*/
enum MHD_ResponseFlags flags;
+ /**
+ * If the @e fd is a pipe (no sendfile()).
+ */
+ bool is_pipe;
+
};
diff --git a/src/microhttpd/response.c b/src/microhttpd/response.c
index 25c05163..27b3ee3f 100644
--- a/src/microhttpd/response.c
+++ b/src/microhttpd/response.c
@@ -526,6 +526,37 @@ file_reader (void *cls,
}
+/**
+ * Given a pipe descriptor, read data from the pipe
+ * to generate the response.
+ *
+ * @param cls pointer to the response
+ * @param pos offset in the pipe to access (ignored)
+ * @param buf where to write the data
+ * @param max number of bytes to write at most
+ * @return number of bytes written
+ */
+static ssize_t
+pipe_reader (void *cls,
+ uint64_t pos,
+ char *buf,
+ size_t max)
+{
+ struct MHD_Response *response = cls;
+ ssize_t n;
+
+ (void) pos;
+ n = read (response->fd,
+ buf,
+ max);
+ if (0 == n)
+ return MHD_CONTENT_READER_END_OF_STREAM;
+ if (n < 0)
+ return MHD_CONTENT_READER_END_WITH_ERROR;
+ return n;
+}
+
+
/**
* Destroy file reader context. Closes the file
* descriptor.
@@ -614,12 +645,42 @@ MHD_create_response_from_fd_at_offset64 (uint64_t size,
if (NULL == response)
return NULL;
response->fd = fd;
+ response->is_pipe = false;
response->fd_off = offset;
response->crc_cls = response;
return response;
}
+/**
+ * Create a response object. The response object can be extended with
+ * header information and then be used ONLY ONCE.
+ *
+ * @param fd file descriptor referring to a read-end of a pipe with the
+ * data; will be closed when response is destroyed;
+ * fd should be in 'blocking' mode
+ * @return NULL on error (i.e. invalid arguments, out of memory)
+ * @ingroup response
+ */
+_MHD_EXTERN struct MHD_Response *
+MHD_create_response_from_pipe (int fd)
+{
+ struct MHD_Response *response;
+
+ response = MHD_create_response_from_callback (MHD_SIZE_UNKNOWN,
+ MHD_FILE_READ_BLOCK_SIZE,
+ &pipe_reader,
+ NULL,
+ &free_callback);
+ if (NULL == response)
+ return NULL;
+ response->fd = fd;
+ response->is_pipe = true;
+ response->crc_cls = response;
+ return response;
+}
+
+
/**
* Create a response object. The response object can be extended with
* header information and then be used any number of times.
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [libmicrohttpd] branch master updated: add ability to serve files from pipe,
gnunet <=