summaryrefslogtreecommitdiff
path: root/src/daemon/session.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/session.h')
-rw-r--r--src/daemon/session.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/daemon/session.h b/src/daemon/session.h
new file mode 100644
index 00000000..5e8be40c
--- /dev/null
+++ b/src/daemon/session.h
@@ -0,0 +1,154 @@
+/*
+ This file is part of libmicrohttpd
+ (C) 2007 Daniel Pittman
+
+ libmicrohttpd is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 2, or (at your
+ option) any later version.
+
+ libmicrohttpd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libmicrohttpd; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file session.h
+ * @brief Methods for managing sessions
+ * @author Daniel Pittman
+ * @author Christian Grothoff
+ * @version 0.1.0
+ */
+
+#ifndef SESSION_H
+#define SESSION_H
+
+
+struct MHD_Session {
+ struct MHD_Session * next;
+
+ struct MHD_Daemon * daemon;
+
+ struct MHD_HTTP_Header * headers_received;
+
+ struct MHD_Response * response;
+
+ char * requestType;
+
+ /**
+ * Buffer for reading requests.
+ */
+ void * read_buffer;
+
+ /**
+ * Buffer for writing response.
+ */
+ void * write_buffer;
+
+ /**
+ * Foreign address (of length addr_len).
+ */
+ struct sockaddr_in * addr;
+
+ /**
+ * Thread for this session (if we are using
+ * one thread per connection).
+ */
+ pthread_t pid;
+
+ size_t read_buffer_size;
+
+ size_t readLoc;
+
+ size_t write_buffer_size;
+
+ size_t writeLoc;
+
+ /**
+ * Current write position in the actual response
+ * (excluding headers, content only; should be 0
+ * while sending headers).
+ */
+ size_t messagePos;
+
+ /**
+ * Length of the foreign address.
+ */
+ socklen_t addr_len;
+
+ /**
+ * Socket for this connection. Set to -1 if
+ * this connection has died (daemon should clean
+ * up in that case).
+ */
+ int socket_fd;
+
+ /**
+ * Have we finished receiving all of the headers yet?
+ * Set to 1 once we are done processing all of the
+ * headers. Note that due to pipelining, it is
+ * possible that the NEXT request is already
+ * (partially) waiting in the read buffer.
+ */
+ int headersReceived;
+
+ /**
+ * Have we finished receiving the data from a
+ * potential file-upload?
+ */
+ int bodyReceived;
+
+ /**
+ * Have we finished sending all of the headers yet?
+ */
+ int headersSent;
+
+ /**
+ * HTTP response code. Only valid if response object
+ * is already set.
+ */
+ unsigned int responseCode;
+
+};
+
+
+/**
+ * Obtain the select sets for this session.
+ *
+ * @return MHD_YES on success
+ */
+int
+MHD_session_get_fdset(struct MHD_Session * session,
+ fd_set * read_fd_set,
+ fd_set * write_fd_set,
+ fd_set * except_fd_set,
+ int * max_fd);
+
+
+/**
+ * This function handles a particular connection when it has been
+ * determined that there is data to be read off a socket. All implementations
+ * (multithreaded, external select, internal select) call this function
+ * to handle reads.
+ */
+int
+MHD_session_handle_read(struct MHD_Session * session);
+
+
+/**
+ * This function was created to handle writes to sockets when it has been
+ * determined that the socket can be written to. If there is no data
+ * to be written, however, the function call does nothing. All implementations
+ * (multithreaded, external select, internal select) call this function
+ */
+int
+MHD_session_handle_write(struct MHD_Session * session);
+
+
+#endif