summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am3
-rw-r--r--TODO20
-rwxr-xr-xconfigure5
-rw-r--r--configure.ac5
-rwxr-xr-xexamples/csoap/echoattachments-client.c9
-rw-r--r--examples/csoap/simpleclient.c8
-rw-r--r--examples/csoap/soapclient.c8
-rw-r--r--examples/nanohttp/client_get.c112
-rw-r--r--examples/nanohttp/http_client.c214
-rw-r--r--examples/nanohttp/http_server.c239
-rw-r--r--libcsoap/Makefile.am20
-rw-r--r--libcsoap/soap-client.h10
-rw-r--r--libcsoap/soap-server.h17
-rw-r--r--nanohttp/Makefile.am10
-rw-r--r--nanohttp/nanohttp-client.c8
-rw-r--r--nanohttp/nanohttp-client.h12
-rw-r--r--nanohttp/nanohttp-server.c72
-rw-r--r--nanohttp/nanohttp-server.h14
-rw-r--r--nanohttp/nanohttp-socket.c178
-rw-r--r--nanohttp/nanohttp-socket.h9
-rw-r--r--nanohttp/nanohttp-ssl.c132
-rw-r--r--nanohttp/nanohttp-ssl.h8
-rwxr-xr-xnanohttp/nanohttp-stream.c10
23 files changed, 518 insertions, 605 deletions
diff --git a/Makefile.am b/Makefile.am
index cf6fd8c..b14a16b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -16,8 +16,7 @@ documentation=doc/Doxyfile.api \
doc/tutorial.xml \
doc/images/logo02.gif
-broken_examples=examples/nanohttp/client_get.c \
- examples/nanohttp/client_mime.c \
+broken_examples=examples/nanohttp/client_mime.c \
examples/nanohttp/httpcpost.c \
examples/nanohttp/httppost.c \
examples/nanohttp/postserver.c \
diff --git a/TODO b/TODO
index 648b01a..27aef0b 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
-$Id: TODO,v 1.8 2006/11/29 13:24:00 m0gg Exp $
+$Id: TODO,v 1.9 2006/11/30 14:23:58 m0gg Exp $
===============================================================================
Things to do _before_ 1.2 release:
@@ -6,30 +6,23 @@ Things to do _before_ 1.2 release:
nanohttp:
---------
-- Get rid of #ifdef HAVE_SSL in nanohttp-socket.c
-- Improve API documentation
-- remove internal typedefs!
-- include neccessary headers in nanohttp-client.h and nanohttp-server.h if
- __NANOHTTP_INTERNAL isn't specified
-- Check portability to Win32/Linux/MaxOS (only tested on FreeBSD 6.2)
-- cleanup circular module dependencies (e.g. hsocket <-> hssl)
- improve error handling!!!!
- optimize mime API
-- cleanup/improve nanohttp request parsing (add GET http://fdqn/service)
+- cleanup/improve nanohttp request parsing (add GET http://fdqn/service HTTP/1.1)
- Check portability to Win32/Linux/MaxOS (only tested on FreeBSD 6.2)
- Elaborate README.ssl (more text and references to csoap API docs, OpenSSL)
+- delete or fix broken examples (see Makefile.am)
+- Improve API documentation
csoap:
------
- move service description documents from router to service (???)
+- add examples from http://www.xmethods.org (Google, UDDI)
- Check portability to Win32/Linux/MaxOS (only tested on FreeBSD 6.2)
- soap-nudp.c needs testing
- Improve API documentation
- Add reference to http://www.w3.org/TR/SOAP-attachments
-- include neccessary headers in soap-client.h and soap-server.h if
- __CSOAP_INTERNAL isn't specified
-- correct handling of configure flag --with-xmlsec1
-- Write README.xmlsec
+- Write README.xmlsec like README.ssl
Additional things that could be done:
=====================================
@@ -38,6 +31,7 @@ nanohttp:
---------
- add DIME attachments
- add BASE64 decoding for MIME attachments
+- cleanup circular module dependencies (e.g. hsocket <-> hssl)
csoap:
------
diff --git a/configure b/configure
index 916cba0..f34b8df 100755
--- a/configure
+++ b/configure
@@ -21864,9 +21864,6 @@ fi
fi;
-#---------------------------------------------
-# Check xmlsec1 library
-#---------------------------------------------
@@ -22076,7 +22073,7 @@ else
fi
CFLAGS="$CFLAGS $XMLSEC1_CFLAGS";
- LDFLAGS="$LDFLAGS $XMLSEC1_LIBS"
+ LDFLAGS="$LDFLAGS $XMLSEC1_LIBS"
else
echo "$as_me:$LINENO: result: no" >&5
diff --git a/configure.ac b/configure.ac
index d52370c..6f30870 100644
--- a/configure.ac
+++ b/configure.ac
@@ -385,14 +385,11 @@ AM_PATH_SSL(,
AM_CONDITIONAL(BUILD_WITH_SSL, false)
)
-#---------------------------------------------
-# Check xmlsec1 library
-#---------------------------------------------
AM_PATH_XMLSEC1(1.2.10,
AC_DEFINE(HAVE_XMLSEC1,1,Define to 1 if you have requested --with-xmlsec1)
AM_CONDITIONAL(BUILD_WITH_XMLSEC1, true)
CFLAGS="$CFLAGS $XMLSEC1_CFLAGS";
- LDFLAGS="$LDFLAGS $XMLSEC1_LIBS"
+ LDFLAGS="$LDFLAGS $XMLSEC1_LIBS"
,
AM_CONDITIONAL(BUILD_WITH_XMLSEC1, false)
)
diff --git a/examples/csoap/echoattachments-client.c b/examples/csoap/echoattachments-client.c
index 5c22805..fbee05e 100755
--- a/examples/csoap/echoattachments-client.c
+++ b/examples/csoap/echoattachments-client.c
@@ -1,5 +1,5 @@
/******************************************************************
- * $Id: echoattachments-client.c,v 1.15 2006/11/25 15:06:57 m0gg Exp $
+ * $Id: echoattachments-client.c,v 1.16 2006/11/30 14:23:59 m0gg Exp $
*
* CSOAP Project: CSOAP examples project
* Copyright (C) 2003-2004 Ferhat Ayaz
@@ -24,13 +24,8 @@
#include <stdlib.h>
#include <libxml/tree.h>
+#include <libxml/uri.h>
-#include <nanohttp/nanohttp-error.h>
-#include <nanohttp/nanohttp-common.h>
-#include <nanohttp/nanohttp-logging.h>
-
-#include <libcsoap/soap-env.h>
-#include <libcsoap/soap-ctx.h>
#include <libcsoap/soap-client.h>
static const char *urn = "urn:examples";
diff --git a/examples/csoap/simpleclient.c b/examples/csoap/simpleclient.c
index 757b2cf..eacc886 100644
--- a/examples/csoap/simpleclient.c
+++ b/examples/csoap/simpleclient.c
@@ -1,5 +1,5 @@
/******************************************************************
- * $Id: simpleclient.c,v 1.20 2006/11/29 11:04:24 m0gg Exp $
+ * $Id: simpleclient.c,v 1.21 2006/11/30 14:23:59 m0gg Exp $
*
* CSOAP Project: CSOAP examples project
* Copyright (C) 2003-2004 Ferhat Ayaz
@@ -26,12 +26,6 @@
#include <libxml/tree.h>
#include <libxml/uri.h>
-#include <nanohttp/nanohttp-error.h>
-#include <nanohttp/nanohttp-logging.h>
-
-#include <libcsoap/soap-ctx.h>
-#include <libcsoap/soap-env.h>
-#include <libcsoap/soap-addressing.h>
#include <libcsoap/soap-client.h>
static char *url = "http://localhost:10000/csoapserver";
diff --git a/examples/csoap/soapclient.c b/examples/csoap/soapclient.c
index 5b98e91..00ddbbf 100644
--- a/examples/csoap/soapclient.c
+++ b/examples/csoap/soapclient.c
@@ -1,5 +1,5 @@
/******************************************************************
- * $Id: soapclient.c,v 1.12 2006/11/26 20:13:05 m0gg Exp $
+ * $Id: soapclient.c,v 1.13 2006/11/30 14:23:59 m0gg Exp $
*
* CSOAP Project: CSOAP examples project
* Copyright (C) 2003-2006 Adrianus Warmehoven
@@ -25,12 +25,8 @@
#include <ctype.h>
#include <libxml/tree.h>
+#include <libxml/uri.h>
-#include <nanohttp/nanohttp-error.h>
-
-#include <libcsoap/soap-fault.h>
-#include <libcsoap/soap-env.h>
-#include <libcsoap/soap-ctx.h>
#include <libcsoap/soap-client.h>
#define MAX_LINE_LENGTH 65535
diff --git a/examples/nanohttp/client_get.c b/examples/nanohttp/client_get.c
deleted file mode 100644
index 4015ed2..0000000
--- a/examples/nanohttp/client_get.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/******************************************************************
-* $Id: client_get.c,v 1.1 2004/10/15 13:42:07 snowdrop Exp $
-*
-* CSOAP Project: A http client/server library in C (example)
-* Copyright (C) 2003-2004 Ferhat Ayaz
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Library General Public
-* License as published by the Free Software Foundation; either
-* version 2 of the License, or (at your option) any later version.
-*
-* This library 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
-* Library General Public License for more details.
-*
-* You should have received a copy of the GNU Library General Public
-* License along with this library; if not, write to the
-* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-* Boston, MA 02111-1307, USA.
-*
-* Email: ferhatayaz@yahoo.com
-******************************************************************/
-#define MEM_DEBUG
-#include <stdio.h>
-#include <nanohttp/nanohttp-client.h>
-
-#ifdef MEM_DEBUG
-#include <utils/alloc.h>
-#endif
-
-#define MAX_BUFFER_SIZE 1024
-
-static
-void show_response(hresponse_t *res)
-{
- hpair_t *pair;
- byte_t buffer[MAX_BUFFER_SIZE+1];
- int read;
-
- if (res == NULL)
- {
- log_error1("Response is NULL!");
- return;
- }
-
- log_info2("Status: %d", res->errcode);
- log_info2("Desc : '%s'", res->desc);
-
- pair = res->header;
- while (pair != NULL) {
- log_debug3("%s: %s", pair->key, pair->value);
- pair = pair->next;
- }
-
- if (res->in == NULL)
- {
- log_warn1("No input stream!");
- return;
- }
-
-
- while (http_input_stream_is_ready(res->in))
- {
- read = http_input_stream_read(res->in, buffer, MAX_BUFFER_SIZE);
- buffer[read] = '\0';
- puts(buffer);
- }
-
-}
-
-int main(int argc, char *argv[])
-{
- httpc_conn_t *conn; /* Client connection object */
- hresponse_t *res; /* Response object **/
-
- /* check usage */
- if (argc < 2) {
- fprintf(stderr, "usage %s <url>\n", argv[0]);
- exit(1);
- }
-
- /* Set log level to see more information written by the library */
- log_set_level(HLOG_VERBOSE);
-
- /* Initialize httpc module */
- if (httpc_init(argc, argv))
- {
- log_error1("Can not init httpc");
- return 1;
- }
-
- /* Create the client connection object */
- conn = httpc_new();
-
- /* Send GET method and receive response */
- res = httpc_get(conn, argv[1]);
-
- /* Show response */
- show_response(res);
-
- /* Clean up */
- hresponse_free(res);
- httpc_free(conn);
-
-#ifdef MEM_DEBUG
- _mem_report();
-#endif
-
- return 0;
-}
-
diff --git a/examples/nanohttp/http_client.c b/examples/nanohttp/http_client.c
index e320cb9..7c1b2f0 100644
--- a/examples/nanohttp/http_client.c
+++ b/examples/nanohttp/http_client.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: http_client.c,v 1.6 2006/11/25 15:06:57 m0gg Exp $
+* $Id: http_client.c,v 1.7 2006/11/30 14:23:59 m0gg Exp $
*
* CSOAP Project: A http client/server library in C (example)
* Copyright (C) 2003-2004 Ferhat Ayaz
@@ -25,13 +25,7 @@
#include <stdlib.h>
#include <string.h>
-#include <nanohttp/nanohttp-error.h>
-#include <nanohttp/nanohttp-common.h>
-#include <nanohttp/nanohttp-stream.h>
-#include <nanohttp/nanohttp-request.h>
-#include <nanohttp/nanohttp-response.h>
#include <nanohttp/nanohttp-client.h>
-#include <nanohttp/nanohttp-logging.h>
#define MAX_BUFFER_SIZE 1024
@@ -42,109 +36,109 @@ static int show_content = 1;
static char *username = NULL;
static char *password = NULL;
-static void show_response(hresponse_t *res) {
-
- unsigned char buffer[MAX_BUFFER_SIZE+1];
- int read;
-
- if (!res) {
-
- printf("hresponse_t is NULL!");
- return;
- }
-
- if (res->errcode != 200 || show_http_status_code)
- printf("HTTP Status: %d \"%s\"\n", res->errcode, res->desc);
-
- if (show_headers) {
-
- hpair_t *pair;
- printf("HTTP Headers:\n");
- for (pair = res->header; pair; pair=pair->next)
- printf(" %s: %s\n", pair->key, pair->value);
- }
-
- if (!res->in) {
-
- log_warn1("No input stream!");
- return;
- }
-
- while (http_input_stream_is_ready(res->in)) {
-
- read = http_input_stream_read(res->in, buffer, MAX_BUFFER_SIZE);
-
- if (show_content)
- fwrite(buffer, read, 1, stdout);
- }
- return;
+static void show_response(hresponse_t *res)
+{
+ unsigned char buffer[MAX_BUFFER_SIZE+1];
+ int read;
+
+ if (!res)
+ {
+ fprintf(stderr, "hresponse_t is NULL!");
+ return;
+ }
+
+ if (res->errcode != 200 || show_http_status_code)
+ printf("HTTP Status: %d \"%s\"\n", res->errcode, res->desc);
+
+ if (show_headers)
+ {
+ hpair_t *pair;
+ printf("HTTP Headers:\n");
+ for (pair = res->header; pair; pair=pair->next)
+ printf(" %s: %s\n", pair->key, pair->value);
+ }
+
+ if (!res->in)
+ {
+ fprintf(stderr, "No input stream!");
+ return;
+ }
+
+ while (http_input_stream_is_ready(res->in))
+ {
+ read = http_input_stream_read(res->in, buffer, MAX_BUFFER_SIZE);
+
+ if (show_content)
+ fwrite(buffer, read, 1, stdout);
+ }
+ return;
}
-int main(int argc, char **argv) {
-
- httpc_conn_t *conn; /* Client connection object */
- hresponse_t *res; /* Response object **/
- herror_t status;
- int i;
-
- /* check usage */
- if (argc < 2) {
-
- fprintf(stderr, "usage: %s [-headers] [-status] [-noout] [-username name] [-password secret] <url>\n", argv[0]);
- exit(1);
- }
-
- /* XXX: this is not safe... */
- for (i=0; i<argc; i++) {
-
- if (!strcmp("-headers", argv[i]))
- show_headers = 1;
- else if (!strcmp("-status", argv[i]))
- show_http_status_code = 1;
- else if (!strcmp("-noout", argv[i]))
- show_content = 0;
- else if (!strcmp("-username", argv[i]))
- username = argv[i+1];
- else if (!strcmp("-password", argv[i]))
- password = argv[i+1];
- }
-
- /* Set log level to see more information written by the library */
- hlog_set_level(HLOG_INFO);
-
- /* Initialize httpc module */
- if (httpc_init(argc, argv)) {
-
- log_error1("Cannot init httpc");
- exit(1);
- }
-
- /* Create the client connection object */
- if (!(conn = httpc_new())) {
-
- log_error1("httpc_new failed");
- exit(1);
- }
-
- /* set the credentials, if specified */
- if (username || password)
- httpc_set_basic_authorization(conn, username, password);
-
- /* Send GET method and receive response */
- if ((status = httpc_get(conn, &res, argv[argc-1])) != H_OK) {
-
- log_error2("httpc_get failed (%s)", herror_message(status));
- herror_release(status);
- exit(1);
- }
-
- /* Show response */
- show_response(res);
-
- /* Clean up */
- hresponse_free(res);
-
- httpc_free(conn);
-
- return 0;
+int main(int argc, char **argv)
+{
+ httpc_conn_t *conn; /* Client connection object */
+ hresponse_t *res; /* Response object **/
+ herror_t status;
+ int i;
+
+ /* check usage */
+ if (argc < 2)
+ {
+ fprintf(stderr, "usage: %s [-headers] [-status] [-noout] [-username name] [-password secret] <url>\n", argv[0]);
+ exit(1);
+ }
+
+ /* XXX: this is not safe... */
+ for (i=0; i<argc; i++)
+ {
+ if (!strcmp("-headers", argv[i]))
+ show_headers = 1;
+ else if (!strcmp("-status", argv[i]))
+ show_http_status_code = 1;
+ else if (!strcmp("-noout", argv[i]))
+ show_content = 0;
+ else if (!strcmp("-username", argv[i]))
+ username = argv[i+1];
+ else if (!strcmp("-password", argv[i]))
+ password = argv[i+1];
+ }
+
+ /* Set log level to see more information written by the library */
+ hlog_set_level(HLOG_INFO);
+
+ /* Initialize httpc module */
+ if (httpc_init(argc, argv))
+ {
+ fprintf(stderr, "Cannot inititialize httpc");
+ exit(1);
+ }
+
+ /* Create the client connection object */
+ if (!(conn = httpc_new()))
+ {
+ fprintf(stderr, "httpc_new failed");
+ exit(1);
+ }
+
+ /* set the credentials, if specified */
+ if (username || password)
+ httpc_set_basic_authorization(conn, username, password);
+
+ /* Send GET method and receive response */
+ if ((status = httpc_get(conn, &res, argv[argc-1])) != H_OK)
+ {
+ fprintf(stderr, "httpc_get failed (%s)", herror_message(status));
+ herror_release(status);
+ exit(1);
+ }
+
+ /* Show response */
+ show_response(res);
+
+ /* Clean up */
+ hresponse_free(res);
+
+ httpc_free(conn);
+
+ return 0;
}
diff --git a/examples/nanohttp/http_server.c b/examples/nanohttp/http_server.c
index 0e1659a..40443e8 100644
--- a/examples/nanohttp/http_server.c
+++ b/examples/nanohttp/http_server.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: http_server.c,v 1.9 2006/11/25 16:35:57 m0gg Exp $
+* $Id: http_server.c,v 1.10 2006/11/30 14:23:59 m0gg Exp $
*
* CSOAP Project: A http client/server library in C (example)
* Copyright (C) 2003 Ferhat Ayaz
@@ -24,169 +24,160 @@
#include <stdio.h>
#include <string.h>
-#include <nanohttp/nanohttp-error.h>
-#include <nanohttp/nanohttp-common.h>
-#include <nanohttp/nanohttp-stream.h>
-#include <nanohttp/nanohttp-request.h>
-#include <nanohttp/nanohttp-response.h>
#include <nanohttp/nanohttp-server.h>
-#include <nanohttp/nanohttp-logging.h>
static int simple_authenticator(struct hrequest_t *req, const char *user, const char *password)
{
+ fprintf(stdout, "logging in user=\"%s\" password=\"%s\"", user, password);
- log_info3("logging in user=\"%s\" password=\"%s\"", user, password);
+ if (strcmp(user, "bob")) {
- if (strcmp(user, "bob")) {
+ fprintf(stderr, "user \"%s\" unkown", user);
+ return 0;
+ }
- log_warn2("user \"%s\" unkown", user);
- return 0;
- }
+ if (strcmp(password, "builder")) {
- if (strcmp(password, "builder")) {
+ fprintf(stderr, "wrong password");
+ return 0;
+ }
- log_warn1("wrong password");
- return 0;
- }
-
- return 1;
+ return 1;
}
static void secure_service(httpd_conn_t *conn, struct hrequest_t *req)
{
-
- httpd_send_header(conn, 200, HTTP_STATUS_200_REASON_PHRASE);
- http_output_stream_write_string(conn->out,
- "<html>"
- "<head>"
- "<title>Secure ressource!</title>"
- "</head>"
- "<body>"
- "<h1>Authenticated access!!!</h1>"
- "</body>"
- "</html>");
-
- return;
+ httpd_send_header(conn, 200, HTTP_STATUS_200_REASON_PHRASE);
+ http_output_stream_write_string(conn->out,
+ "<html>"
+ "<head>"
+ "<title>Secure ressource!</title>"
+ "</head>"
+ "<body>"
+ "<h1>Authenticated access!!!</h1>"
+ "</body>"
+ "</html>");
+
+ return;
}
static void default_service(httpd_conn_t *conn, struct hrequest_t *req)
{
-
- httpd_send_header(conn, 404, HTTP_STATUS_404_REASON_PHRASE);
- http_output_stream_write_string(conn->out,
- "<html>"
- "<head>"
- "<title>Default error page</title>"
- "</head>"
- "<body>"
- "<h1>Default error page</h1>"
- "<div>");
-
- http_output_stream_write_string(conn->out, req->path);
-
- http_output_stream_write_string(conn->out, " can not be found"
- "</div>"
- "</body>"
- "</html>");
-
- return;
-}
+ httpd_send_header(conn, 404, HTTP_STATUS_404_REASON_PHRASE);
+ http_output_stream_write_string(conn->out,
+ "<html>"
+ "<head>"
+ "<title>Default error page</title>"
+ "</head>"
+ "<body>"
+ "<h1>Default error page</h1>"
+ "<div>");
+
+ http_output_stream_write_string(conn->out, req->path);
+
+ http_output_stream_write_string(conn->out, " can not be found"
+ "</div>"
+ "</body>"
+ "</html>");
+
+ return;
+}
static void headers_service(httpd_conn_t *conn, struct hrequest_t *req)
{
- hpair_t *walker;
-
- httpd_send_header(conn, 200, HTTP_STATUS_200_REASON_PHRASE);
- http_output_stream_write_string(conn->out,
- "<html>"
- "<head>"
- "<title>Request headers</title>"
- "</head>"
- "<body>"
- "<h1>Request headers</h1>"
- "<ul>");
-
- for (walker=req->header; walker; walker=walker->next)
- {
- http_output_stream_write_string(conn->out, "<li>");
- http_output_stream_write_string(conn->out, walker->key);
- http_output_stream_write_string(conn->out, " = ");
- http_output_stream_write_string(conn->out, walker->value);
- http_output_stream_write_string(conn->out, "</li>");
- }
-
- http_output_stream_write_string(conn->out,
- "</ul>"
- "</body>"
- "</html>");
-
- return;
+ hpair_t *walker;
+
+ httpd_send_header(conn, 200, HTTP_STATUS_200_REASON_PHRASE);
+ http_output_stream_write_string(conn->out,
+ "<html>"
+ "<head>"
+ "<title>Request headers</title>"
+ "</head>"
+ "<body>"
+ "<h1>Request headers</h1>"
+ "<ul>");
+
+ for (walker=req->header; walker; walker=walker->next)
+ {
+ http_output_stream_write_string(conn->out, "<li>");
+ http_output_stream_write_string(conn->out, walker->key);
+ http_output_stream_write_string(conn->out, " = ");
+ http_output_stream_write_string(conn->out, walker->value);
+ http_output_stream_write_string(conn->out, "</li>");
+ }
+
+ http_output_stream_write_string(conn->out,
+ "</ul>"
+ "</body>"
+ "</html>");
+
+ return;
}
static void root_service(httpd_conn_t *conn, struct hrequest_t *req)
{
- httpd_send_header(conn, 200, HTTP_STATUS_200_REASON_PHRASE);
- http_output_stream_write_string(conn->out,
- "<html>"
- "<head>"
- "<title>nanoHTTP server examples</title>"
- "</head>"
- "<body>"
- "<h1>nanoHTTP server examples</h1>"
- "<ul>"
- "<li><a href=\"/\">Simple service</a></li>"
- "<li><a href=\"/secure\">Secure service</a> (try: bob/builder)</li>"
- "<li><a href=\"/headers\">Request headers</a></li>"
- "<li><a href=\"/not_existent\">The default service</a></li>"
- "<li><a href=\"/nhttp\">Admin page</a> (try -NHTTPDadmin on the command line)</li>"
- "</ul>"
- "</body>"
- "</html>");
-
- return;
+ httpd_send_header(conn, 200, HTTP_STATUS_200_REASON_PHRASE);
+ http_output_stream_write_string(conn->out,
+ "<html>"
+ "<head>"
+ "<title>nanoHTTP server examples</title>"
+ "</head>"
+ "<body>"
+ "<h1>nanoHTTP server examples</h1>"
+ "<ul>"
+ "<li><a href=\"/\">Simple service</a></li>"
+ "<li><a href=\"/secure\">Secure service</a> (try: bob/builder)</li>"
+ "<li><a href=\"/headers\">Request headers</a></li>"
+ "<li><a href=\"/not_existent\">The default service</a></li>"
+ "<li><a href=\"/nhttp\">Admin page</a> (try -NHTTPDadmin on the command line)</li>"
+ "</ul>"
+ "</body>"
+ "</html>");
+
+ return;
}
int main(int argc, char **argv)
{
- hlog_set_level(HLOG_INFO);
+ hlog_set_level(HLOG_INFO);
- if (httpd_init(argc, argv)) {
+ if (httpd_init(argc, argv)) {
- fprintf(stderr, "Cannot init httpd");
- return 1;
- }
+ fprintf(stderr, "Cannot init httpd");
+ return 1;
+ }
- if (!httpd_register("/", root_service)) {
+ if (!httpd_register("/", root_service)) {
- fprintf(stderr, "Cannot register service");
- return 1;
- }
+ fprintf(stderr, "Cannot register service");
+ return 1;
+ }
- if (!httpd_register_secure("/secure", secure_service, simple_authenticator)) {
+ if (!httpd_register_secure("/secure", secure_service, simple_authenticator)) {
- fprintf(stderr, "Cannot register secure service");
- return 1;
- }
+ fprintf(stderr, "Cannot register secure service");
+ return 1;
+ }
- if (!httpd_register("/headers", headers_service)) {
+ if (!httpd_register("/headers", headers_service)) {
- fprintf(stderr, "Cannot register headers service");
- return 1;
- }
+ fprintf(stderr, "Cannot register headers service");
+ return 1;
+ }
- if (!httpd_register_default("/error", default_service)) {
+ if (!httpd_register_default("/error", default_service)) {
- fprintf(stderr, "Cannot register default service");
- return 1;
- }
+ fprintf(stderr, "Cannot register default service");
+ return 1;
+ }
- if (httpd_run()) {
+ if (httpd_run()) {
- fprintf(stderr, "can not run httpd");
- return 1;
- }
+ fprintf(stderr, "can not run httpd");
+ return 1;
+ }
- httpd_destroy();
+ httpd_destroy();
- return 0;
+ return 0;
}
diff --git a/libcsoap/Makefile.am b/libcsoap/Makefile.am
index e5518cb..bb00615 100644
--- a/libcsoap/Makefile.am
+++ b/libcsoap/Makefile.am
@@ -1,17 +1,19 @@
-
+#
+# $Revision: 1.14 $
+#
lib_LTLIBRARIES=libcsoap.la
libcsoap_ladir=$(includedir)/libcsoap-@csoap_release@/libcsoap
-libcsoap_la_SOURCES=soap-xml.c soap-fault.c soap-env.c soap-service.c \
- soap-router.c soap-client.c soap-server.c soap-ctx.c \
- soap-admin.c soap-addressing.c soap-transport.c \
- soap-nudp.c soap-nhttp.c soap-wsil.c
+libcsoap_la_SOURCES=soap-xml.c soap-fault.c soap-env.c soap-service.c \
+ soap-router.c soap-client.c soap-server.c soap-ctx.c \
+ soap-admin.c soap-addressing.c soap-transport.c \
+ soap-nudp.c soap-nhttp.c soap-wsil.c \
-libcsoap_la_HEADERS=soap-xml.h soap-fault.h soap-env.h soap-service.h \
- soap-router.h soap-client.h soap-server.h soap-ctx.h \
- soap-admin.h soap-addressing.h soap-transport.h \
- soap-nudp.h soap-nhttp.h soap-wsil.h
+libcsoap_la_HEADERS=soap-fault.h soap-env.h soap-service.h soap-router.h \
+ soap-client.h soap-server.h soap-ctx.h soap-addressing.h \
+ soap-transport.h soap-admin.h soap-wsil.h soap-nudp.h \
+ soap-nhttp.h soap-xml.h
if BUILD_WITH_XMLSEC1
libcsoap_la_SOURCES+=soap-xmlsec.c
diff --git a/libcsoap/soap-client.h b/libcsoap/soap-client.h
index 30d2f00..e821b9b 100644
--- a/libcsoap/soap-client.h
+++ b/libcsoap/soap-client.h
@@ -1,5 +1,5 @@
/******************************************************************
- * $Id: soap-client.h,v 1.15 2006/11/29 11:04:25 m0gg Exp $
+ * $Id: soap-client.h,v 1.16 2006/11/30 14:23:59 m0gg Exp $
*
* CSOAP Project: A SOAP client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -24,6 +24,14 @@
#ifndef __csoap_client_h
#define __csoap_client_h
+#ifndef __CSOAP_INTERNAL
+#include <nanohttp/nanohttp-client.h>
+
+#include <libcsoap/soap-ctx.h>
+#include <libcsoap/soap-env.h>
+#include <libcsoap/soap-addressing.h>
+#endif
+
#define SOAP_ERROR_CLIENT 5000
#define SOAP_ERROR_CLIENT_GENERIC (SOAP_ERROR_CLIENT + 0)
#define SOAP_ERROR_CLIENT_INIT (SOAP_ERROR_CLIENT + 1)
diff --git a/libcsoap/soap-server.h b/libcsoap/soap-server.h
index afb3a3a..3a9ac32 100644
--- a/libcsoap/soap-server.h
+++ b/libcsoap/soap-server.h
@@ -1,5 +1,5 @@
/******************************************************************
- * $Id: soap-server.h,v 1.14 2006/11/29 11:04:25 m0gg Exp $
+ * $Id: soap-server.h,v 1.15 2006/11/30 14:23:59 m0gg Exp $
*
* CSOAP Project: A SOAP client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -37,15 +37,22 @@
* @section seq_features Features
*
* - different transport services
- * -- client/server HTTP transport service (with SSL)
- * -- client/server UDP transport service (multicast)
+ * -# client/server HTTP transport service (including SSL)
+ * -# client/server UDP transport service (multicast)
* - attachments via MIME
* - message based security (encryption/signation)
* - automatic generation of WS-Inspection
*
- * @author Ferhat Ayaz
- * @version $Revision: 1.14 $
+ * @author Ferhat Ayaz,
+ * Michael Rans,
+ * Matt Campbell,
+ * Heiko Ronsdorf
*
+ * @version $Revision: 1.15 $
+ *
+ * @see http://www.libxml.org/,
+ * http://www.openssl.org/,
+ * http://www.aleksey.com/xmlsec/
*/
#ifdef __cplusplus
diff --git a/nanohttp/Makefile.am b/nanohttp/Makefile.am
index dae7909..f52cce0 100644
--- a/nanohttp/Makefile.am
+++ b/nanohttp/Makefile.am
@@ -1,3 +1,6 @@
+#
+# $Revision: 1.15 $
+#
lib_LTLIBRARIES=libnanohttp.la
libnanohttp_ladir=$(includedir)/nanohttp-@nanohttp_release@/nanohttp
@@ -8,10 +11,9 @@ libnanohttp_la_SOURCES=nanohttp-common.c nanohttp-socket.c nanohttp-client.c
nanohttp-logging.c nanohttp-admin.c nanohttp-error.c
libnanohttp_la_HEADERS=nanohttp-common.h nanohttp-socket.h nanohttp-client.h \
- nanohttp-server.h nanohttp-stream.h nanohttp-mime.h \
- nanohttp-request.h nanohttp-response.h \
- nanohttp-base64.h nanohttp-logging.h nanohttp-admin.h \
- nanohttp-error.h
+ nanohttp-server.h nanohttp-stream.h nanohttp-mime.h \
+ nanohttp-request.h nanohttp-response.h nanohttp-logging.h \
+ nanohttp-error.h nanohttp-base64.h nanohttp-admin.h
if BUILD_WITH_SSL
libnanohttp_la_SOURCES+=nanohttp-ssl.c
diff --git a/nanohttp/nanohttp-client.c b/nanohttp/nanohttp-client.c
index 2392d81..1c4c6d7 100644
--- a/nanohttp/nanohttp-client.c
+++ b/nanohttp/nanohttp-client.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: nanohttp-client.c,v 1.47 2006/11/28 23:45:57 m0gg Exp $
+* $Id: nanohttp-client.c,v 1.48 2006/11/30 14:23:59 m0gg Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -318,12 +318,12 @@ httpc_send_header(httpc_conn_t * conn)
if (walker->key && walker->value)
{
sprintf(buffer, "%s: %s\r\n", walker->key, walker->value);
- if ((status = hsocket_send(conn->sock, buffer)) != H_OK)
+ if ((status = hsocket_send_string(conn->sock, buffer)) != H_OK)
return status;
}
}
- return hsocket_send(conn->sock, "\r\n");
+ return hsocket_send_string(conn->sock, "\r\n");
}
/*--------------------------------------------------
@@ -429,7 +429,7 @@ _httpc_talk_to_server(hreq_method_t method, httpc_conn_t * conn,
}
log_verbose1("Sending request...");
- if ((status = hsocket_send(conn->sock, buffer)) != H_OK)
+ if ((status = hsocket_send_string(conn->sock, buffer)) != H_OK)
{
log_error2("Cannot send request (%s)", herror_message(status));
hsocket_close(conn->sock);
diff --git a/nanohttp/nanohttp-client.h b/nanohttp/nanohttp-client.h
index b74130d..6e5d4c9 100644
--- a/nanohttp/nanohttp-client.h
+++ b/nanohttp/nanohttp-client.h
@@ -1,5 +1,5 @@
/******************************************************************
- * $Id: nanohttp-client.h,v 1.27 2006/11/24 17:28:07 m0gg Exp $
+ * $Id: nanohttp-client.h,v 1.28 2006/11/30 14:24:00 m0gg Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -24,6 +24,16 @@
#ifndef __nanohttp_client_h
#define __nanohttp_client_h
+/* XXX: Clean up nanohttp to make this unnecessary */
+#ifndef __NHTTP_INTERNAL
+#include <nanohttp/nanohttp-error.h>
+#include <nanohttp/nanohttp-common.h>
+#include <nanohttp/nanohttp-stream.h>
+#include <nanohttp/nanohttp-request.h>
+#include <nanohttp/nanohttp-response.h>
+#include <nanohttp/nanohttp-logging.h>
+#endif
+
typedef struct httpc_conn
{
struct hsocket_t *sock;
diff --git a/nanohttp/nanohttp-server.c b/nanohttp/nanohttp-server.c
index 4c31421..87d740c 100644
--- a/nanohttp/nanohttp-server.c
+++ b/nanohttp/nanohttp-server.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: nanohttp-server.c,v 1.71 2006/11/28 23:45:57 m0gg Exp $
+* $Id: nanohttp-server.c,v 1.72 2006/11/30 14:24:00 m0gg Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -122,7 +122,6 @@ static volatile int _httpd_run = 1;
static struct hsocket_t _httpd_socket;
static int _httpd_port = 10000;
static int _httpd_max_connections = 20;
-static int _httpd_timeout = 10;
static hservice_t *_httpd_services_default = NULL;
static hservice_t *_httpd_services_head = NULL;
@@ -143,20 +142,36 @@ static sigset_t thrsigset;
static pthread_mutex_t _httpd_connection_lock;
#endif
-/**
- *
- * Set Sleep function platform depended
- *
- */
#ifdef WIN32
-static void _sys_sleep(int secs)
+BOOL WINAPI
+_httpd_term(DWORD sig)
+{
+ /* log_debug2 ("Got signal %d", sig); */
+ if (sig == _httpd_terminate_signal)
+ _httpd_run = 0;
+
+ return TRUE;
+}
+
+static void _httpd_sys_sleep(int secs)
{
Sleep(secs*1000);
return;
}
#else
-static inline void _sys_sleep(int secs)
+static void
+_httpd_term(int sig)
+{
+ log_debug2("Got signal %d", sig);
+
+ if (sig == _httpd_terminate_signal)
+ _httpd_run = 0;
+
+ return;
+}
+
+static inline void _httpd_sys_sleep(int secs)
{
sleep(secs);
@@ -185,7 +200,7 @@ _httpd_parse_arguments(int argc, char **argv)
}
else if (!strcmp(argv[i - 1], NHTTPD_ARG_TIMEOUT))
{
- _httpd_timeout = atoi(argv[i]);
+ hsocket_set_timeout(atoi(argv[i]));
}
}
@@ -337,13 +352,13 @@ httpd_get_port(void)
int
httpd_get_timeout(void)
{
- return _httpd_timeout;
+ return hsocket_get_timeout();
}
void
-httpd_set_timeout(int t)
+httpd_set_timeout(int secs)
{
- _httpd_timeout = t;
+ hsocket_set_timeout(secs);
return;
}
@@ -447,7 +462,7 @@ httpd_send_header(httpd_conn_t * res, int code, const char *text)
strcat(header, "\r\n");
/* send header */
- if ((status = hsocket_nsend(res->sock, header, strlen(header))) != H_OK)
+ if ((status = hsocket_send(res->sock, header, strlen(header))) != H_OK)
return status;
res->out = http_output_stream_new(res->sock, res->header);
@@ -834,29 +849,6 @@ httpd_add_headers(httpd_conn_t * conn, const hpair_t * values)
return;
}
-#ifdef WIN32
-BOOL WINAPI
-httpd_term(DWORD sig)
-{
- /* log_debug2 ("Got signal %d", sig); */
- if (sig == _httpd_terminate_signal)
- _httpd_run = 0;
-
- return TRUE;
-}
-#else
-void
-httpd_term(int sig)
-{
- log_debug2("Got signal %d", sig);
-
- if (sig == _httpd_terminate_signal)
- _httpd_run = 0;
-
- return;
-}
-#endif
-
/*
* -----------------------------------------------------
* FUNCTION: _httpd_register_signal_handler
@@ -868,13 +860,13 @@ _httpd_register_signal_handler(void)
log_verbose2("registering termination signal handler (SIGNAL:%d)",
_httpd_terminate_signal);
#ifdef WIN32
- if (SetConsoleCtrlHandler((PHANDLER_ROUTINE) httpd_term, TRUE) == FALSE)
+ if (SetConsoleCtrlHandler((PHANDLER_ROUTINE) _httpd_term, TRUE) == FALSE)
{
log_error1("Unable to install console event handler!");
}
#else
- signal(_httpd_terminate_signal, httpd_term);
+ signal(_httpd_terminate_signal, _httpd_term);
#endif
return;
@@ -905,7 +897,7 @@ _httpd_wait_for_empty_conn(void)
if (i >= _httpd_max_connections)
{
- _sys_sleep(1);
+ _httpd_sys_sleep(1);
i = -1;
}
else if (_httpd_connection[i].flag == CONNECTION_FREE)
diff --git a/nanohttp/nanohttp-server.h b/nanohttp/nanohttp-server.h
index e85c64a..1b74344 100644
--- a/nanohttp/nanohttp-server.h
+++ b/nanohttp/nanohttp-server.h
@@ -1,5 +1,5 @@
/******************************************************************
- * $Id: nanohttp-server.h,v 1.25 2006/11/28 23:45:57 m0gg Exp $
+ * $Id: nanohttp-server.h,v 1.26 2006/11/30 14:24:00 m0gg Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -24,6 +24,16 @@
#ifndef __nanohttp_server_h
#define __nanohttp_server_h
+/* XXX: Clean up nanohttp to make this unnecessary */
+#ifndef __NHTTP_INTERNAL
+#include <nanohttp/nanohttp-error.h>
+#include <nanohttp/nanohttp-common.h>
+#include <nanohttp/nanohttp-stream.h>
+#include <nanohttp/nanohttp-request.h>
+#include <nanohttp/nanohttp-response.h>
+#include <nanohttp/nanohttp-logging.h>
+#endif
+
/**
*
* nanohttp command line flags
@@ -110,7 +120,7 @@ extern "C"
extern short httpd_get_port(void);
extern int httpd_get_timeout(void);
- extern void httpd_set_timeout(int t);
+ extern void httpd_set_timeout(int secs);
extern const char *httpd_get_protocol(void);
extern int httpd_get_conncount(void);
diff --git a/nanohttp/nanohttp-socket.c b/nanohttp/nanohttp-socket.c
index 4869cd7..e2ecf3a 100644
--- a/nanohttp/nanohttp-socket.c
+++ b/nanohttp/nanohttp-socket.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: nanohttp-socket.c,v 1.66 2006/11/27 12:47:27 m0gg Exp $
+* $Id: nanohttp-socket.c,v 1.68 2006/11/30 14:25:07 m0gg Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -90,10 +90,51 @@ typedef int ssize_t;
#endif
#include "nanohttp-ssl.h"
#endif
-#include "nanohttp-request.h"
-#include "nanohttp-server.h"
+
+static int _hsocket_timeout = 10;
#ifdef WIN32
+static herror_t
+_hsocket_sys_accept(struct hsocket_t * sock, struct hsocket_t * dest)
+{
+ struct hsocket_t sockfd;
+ int asize;
+
+ asize = sizeof(struct sockaddr_in);
+ while (1)
+ {
+ sockfd.sock = accept(sock->sock, (struct sockaddr *) &(dest->addr), &asize);
+ if (sockfd.sock == INVALID_SOCKET)
+ {
+ if (WSAGetLastError() != WSAEWOULDBLOCK)
+ return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, "Socket error (%s)", strerror(errno));
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ dest->sock = sockfd.sock;
+
+ return H_OK;
+}
+
+static void
+_hsocket_sys_close(struct hsocket_t * sock)
+{
+ char junk[10];
+
+ /* shutdown(sock,SD_RECEIVE); */
+
+ shutdown(sock->sock, SD_SEND);
+ while (recv(sock->sock, junk, sizeof(junk), 0) > 0);
+ /* nothing */
+ closesocket(sock->sock);
+
+ return;
+}
+
static void
_hsocket_module_sys_init(int argc, char **argv)
{
@@ -116,11 +157,38 @@ _hsocket_module_sys_init(int argc, char **argv)
{
return;
}
+
static inline void
_hsocket_module_sys_destroy(void)
{
return;
}
+
+static herror_t
+_hsocket_sys_accept(struct hsocket_t * sock, struct hsocket_t * dest)
+{
+ socklen_t len;
+
+ len = sizeof(struct sockaddr_in);
+
+ if ((dest->sock = accept(sock->sock, (struct sockaddr *) &(dest->addr), &len)) == -1)
+ {
+ log_warn2("accept failed (%s)", strerror(errno));
+ return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, "Cannot accept network connection (%s)", strerror(errno));
+ }
+
+ return H_OK;
+}
+
+static inline void
+_hsocket_sys_close(struct hsocket_t * sock)
+{
+ shutdown(sock->sock, SHUT_RDWR);
+
+ close(sock->sock);
+
+ return;
+}
#endif
herror_t
@@ -246,53 +314,6 @@ hsocket_bind(struct hsocket_t *dsock, unsigned short port)
return H_OK;
}
-#ifdef WIN32
-static herror_t
-_hsocket_sys_accept(struct hsocket_t * sock, struct hsocket_t * dest)
-{
- int asize;
- struct hsocket_t sockfd;
-
- asize = sizeof(struct sockaddr_in);
- while (1)
- {
- sockfd.sock = accept(sock->sock, (struct sockaddr *) &(dest->addr), &asize);
- if (sockfd.sock == INVALID_SOCKET)
- {
- if (WSAGetLastError() != WSAEWOULDBLOCK)
- return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT,
- "Socket error (%s)", strerror(errno));
- }
- else
- {
- break;
- }
- }
-
- dest->sock = sockfd.sock;
-
- return H_OK;
-}
-#else
-static herror_t
-_hsocket_sys_accept(struct hsocket_t * sock, struct hsocket_t * dest)
-{
- socklen_t len;
-
- len = sizeof(struct sockaddr_in);
-
- if ((dest->sock = accept(sock->sock, (struct sockaddr *) &(dest->addr), &len)) == -1)
- {
- log_warn2("accept failed (%s)", strerror(errno));
- return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT,
- "Cannot accept network connection (%s)",
- strerror(errno));
- }
-
- return H_OK;
-}
-#endif
-
herror_t
hsocket_accept(struct hsocket_t * sock, struct hsocket_t * dest)
{
@@ -337,34 +358,6 @@ hsocket_listen(struct hsocket_t * sock)
return H_OK;
}
-#ifdef WIN32
-static void
-_hsocket_sys_close(struct hsocket_t * sock)
-{
- char junk[10];
-
- /* shutdown(sock,SD_RECEIVE); */
-
- shutdown(sock->sock, SD_SEND);
- while (recv(sock->sock, junk, sizeof(junk), 0) > 0);
- /* nothing */
- closesocket(sock->sock);
-
- return;
-}
-#else
-static inline void
-_hsocket_sys_close(struct hsocket_t * sock)
-{
-
- shutdown(sock->sock, SHUT_RDWR);
-
- close(sock->sock);
-
- return;
-}
-#endif
-
void
hsocket_close(struct hsocket_t * sock)
{
@@ -385,7 +378,7 @@ hsocket_close(struct hsocket_t * sock)
}
herror_t
-hsocket_nsend(struct hsocket_t * sock, const unsigned char * bytes, int n)
+hsocket_send(struct hsocket_t * sock, const unsigned char * bytes, int n)
{
#ifdef HAVE_SSL
herror_t status;
@@ -393,9 +386,8 @@ hsocket_nsend(struct hsocket_t * sock, const unsigned char * bytes, int n)
size_t total = 0;
size_t size;
- log_verbose2("Starting to send on sock=%p", &sock);
if (sock->sock < 0)
- return herror_new("hsocket_nsend", HSOCKET_ERROR_NOT_INITIALIZED,
+ return herror_new("hsocket_send", HSOCKET_ERROR_NOT_INITIALIZED,
"hsocket not initialized");
/* log_verbose2( "SENDING %s", bytes ); */
@@ -410,7 +402,7 @@ hsocket_nsend(struct hsocket_t * sock, const unsigned char * bytes, int n)
}
#else
if ((size = send(sock->sock, bytes + total, n, 0)) == -1)
- return herror_new("hsocket_nsend", HSOCKET_ERROR_SEND, "send failed (%s)", strerror(errno));
+ return herror_new("hsocket_send", HSOCKET_ERROR_SEND, "send failed (%s)", strerror(errno));
#endif
sock->bytes_received += size;
@@ -424,9 +416,9 @@ hsocket_nsend(struct hsocket_t * sock, const unsigned char * bytes, int n)
}
herror_t
-hsocket_send(struct hsocket_t * sock, const char *str)
+hsocket_send_string(struct hsocket_t * sock, const char *str)
{
- return hsocket_nsend(sock, str, strlen(str));
+ return hsocket_send(sock, str, strlen(str));
}
int
@@ -438,13 +430,13 @@ hsocket_select_recv(int sock, char *buf, size_t len)
FD_ZERO(&fds);
FD_SET(sock, &fds);
- timeout.tv_sec = httpd_get_timeout();
+ timeout.tv_sec = _hsocket_timeout;
timeout.tv_usec = 0;
if (select(sock + 1, &fds, NULL, NULL, &timeout) == 0)
{
errno = ETIMEDOUT;
- log_verbose2("Socket %d timeout", sock);
+ log_verbose2("Socket %d timed out", sock);
return -1;
}
@@ -498,3 +490,17 @@ hsocket_read(struct hsocket_t * sock, unsigned char * buffer, int total, int for
}
while (1);
}
+
+int
+hsocket_get_timeout(void)
+{
+ return _hsocket_timeout;
+}
+
+void
+hsocket_set_timeout(int secs)
+{
+ _hsocket_timeout = secs;
+
+ return;
+}
diff --git a/nanohttp/nanohttp-socket.h b/nanohttp/nanohttp-socket.h
index db2bf31..b71f38d 100644
--- a/nanohttp/nanohttp-socket.h
+++ b/nanohttp/nanohttp-socket.h
@@ -1,5 +1,5 @@
/******************************************************************
- * $Id: nanohttp-socket.h,v 1.33 2006/11/26 20:13:06 m0gg Exp $
+ * $Id: nanohttp-socket.h,v 1.34 2006/11/30 14:24:00 m0gg Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -175,7 +175,7 @@ extern herror_t hsocket_accept(struct hsocket_t *sock, struct hsocket_t *dest);
* - HSOCKET_ERROR_NOT_INITIALIZED
* - HSOCKET_ERROR_SEND
*/
-extern herror_t hsocket_nsend(struct hsocket_t *sock, const unsigned char *bytes, int size);
+extern herror_t hsocket_send(struct hsocket_t *sock, const unsigned char *bytes, int size);
/**
*
@@ -189,7 +189,7 @@ extern herror_t hsocket_nsend(struct hsocket_t *sock, const unsigned char *bytes
* - HSOCKET_ERROR_SEND
*
*/
-extern herror_t hsocket_send(struct hsocket_t *sock, const char *str);
+extern herror_t hsocket_send_string(struct hsocket_t *sock, const char *str);
extern int hsocket_select_recv(int sock, char *buf, size_t len);
@@ -210,6 +210,9 @@ extern int hsocket_select_recv(int sock, char *buf, size_t len);
*/
extern herror_t hsocket_read(struct hsocket_t * sock, unsigned char *buffer, int size, int force, int *readed);
+extern int hsocket_get_timeout(void);
+extern void hsocket_set_timeout(int secs);
+
#ifdef __cplusplus
}
#endif
diff --git a/nanohttp/nanohttp-ssl.c b/nanohttp/nanohttp-ssl.c
index 8b8fb5d..a5f32e3 100644
--- a/nanohttp/nanohttp-ssl.c
+++ b/nanohttp/nanohttp-ssl.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: nanohttp-ssl.c,v 1.33 2006/11/27 12:47:27 m0gg Exp $
+* $Id: nanohttp-ssl.c,v 1.34 2006/11/30 14:24:00 m0gg Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2001-2005 Rochester Institute of Technology
@@ -84,12 +84,11 @@
#include "nanohttp-ssl.h"
-static char *certificate = NULL;
-static char *certpass = "";
-static char *ca_list = NULL;
-static SSL_CTX *context = NULL;
-
-static int enabled = 0;
+static char *_hssl_certificate = NULL;
+static char *_hssl_certpass = NULL;
+static char *_hssl_ca_list = NULL;
+static SSL_CTX *_hssl_context = NULL;
+static int _hssl_enabled = 0;
static int
_hssl_dummy_verify_cert(X509 * cert)
@@ -99,7 +98,7 @@ _hssl_dummy_verify_cert(X509 * cert)
/* connect to anyone */
- log_verbose1("Validating certificate.");
+ log_verbose1("_Not_ validating certificate.");
return 1;
}
@@ -176,12 +175,15 @@ _hssl_password_callback(char *buf, int num, int rwflag, void *userdata)
{
int ret;
- ret = strlen(certpass);
+ if (!_hssl_certpass)
+ return 0;
+
+ ret = strlen(_hssl_certpass);
if (num < ret + 1)
return 0;
- strcpy(buf, certpass);
+ strcpy(buf, _hssl_certpass);
return ret;
}
@@ -221,25 +223,34 @@ hssl_set_hssl_verify_cert(int func(X509 * cert))
}
void
-hssl_set_certificate(char *c)
+hssl_set_certificate(const char *filename)
{
- certificate = c;
+ if (_hssl_certificate)
+ free(_hssl_certificate);
+
+ _hssl_certificate = strdup(filename);
return;
}
void
-hssl_set_certpass(char *c)
+hssl_set_certpass(const char *password)
{
- certpass = c;
+ if (_hssl_certpass)
+ free(_hssl_certpass);
+
+ _hssl_certpass = strdup(password);
return;
}
void
-hssl_set_ca(char *c)
+hssl_set_ca_list(const char *filename)
{
- ca_list = c;
+ if (_hssl_ca_list)
+ free(_hssl_ca_list);
+
+ _hssl_ca_list = strdup(filename);
return;
}
@@ -247,7 +258,7 @@ hssl_set_ca(char *c)
void
hssl_enable(void)
{
- enabled = 1;
+ _hssl_enabled = 1;
return;
}
@@ -257,23 +268,23 @@ _hssl_parse_arguments(int argc, char **argv)
{
int i;
- for (i = 1; i < argc; i++)
+ for (i=1; i<argc; i++)
{
if (!strcmp(argv[i - 1], NHTTP_ARG_CERT))
{
- certificate = argv[i];
+ hssl_set_certificate(argv[i]);
}
else if (!strcmp(argv[i - 1], NHTTP_ARG_CERTPASS))
{
- certpass = argv[i];
+ hssl_set_certpass(argv[i]);
}
else if (!strcmp(argv[i - 1], NHTTP_ARG_CA))
{
- ca_list = argv[i];
+ hssl_set_ca_list(argv[i]);
}
else if (!strcmp(argv[i - 1], NHTTPD_ARG_HTTPS))
{
- enabled = 1;
+ hssl_enabled();
}
}
@@ -305,57 +316,57 @@ _hssl_library_init(void)
static herror_t
_hssl_server_context_init(void)
{
- log_verbose3("enabled=%i, certificate=%p", enabled, certificate);
+ log_verbose3("enabled=%i, certificate=%p", _hssl_enabled, _hssl_certificate);
- if (!enabled || !certificate)
+ if (!_hssl_enabled || !_hssl_certificate)
return H_OK;
- if (!(context = SSL_CTX_new(SSLv23_method())))
+ if (!(_hssl_context = SSL_CTX_new(SSLv23_method())))
{
log_error1("Cannot create SSL context");
return herror_new("_hssl_server_context_init", HSSL_ERROR_CONTEXT,
"Unable to create SSL context");
}
- if (!(SSL_CTX_use_certificate_file(context, certificate, SSL_FILETYPE_PEM)))
+ if (!(SSL_CTX_use_certificate_file(_hssl_context, _hssl_certificate, SSL_FILETYPE_PEM)))
{
- log_error2("Cannot read certificate file: \"%s\"", certificate);
- SSL_CTX_free(context);
+ log_error2("Cannot read certificate file: \"%s\"", _hssl_certificate);
+ SSL_CTX_free(_hssl_context);
return herror_new("_hssl_server_context_init", HSSL_ERROR_CERTIFICATE,
- "Unable to use SSL certificate \"%s\"", certificate);
+ "Unable to use SSL certificate \"%s\"", _hssl_certificate);
}
- SSL_CTX_set_default_passwd_cb(context, _hssl_password_callback);
+ SSL_CTX_set_default_passwd_cb(_hssl_context, _hssl_password_callback);
- if (!(SSL_CTX_use_PrivateKey_file(context, certificate, SSL_FILETYPE_PEM)))
+ if (!(SSL_CTX_use_PrivateKey_file(_hssl_context, _hssl_certificate, SSL_FILETYPE_PEM)))
{
- log_error2("Cannot read key file: \"%s\"", certificate);
- SSL_CTX_free(context);
+ log_error2("Cannot read key file: \"%s\"", _hssl_certificate);
+ SSL_CTX_free(_hssl_context);
return herror_new("_hssl_server_context_init", HSSL_ERROR_PEM,
"Unable to use private key");
}
- if (ca_list != NULL && *ca_list != '\0')
+ if (_hssl_ca_list != NULL && *_hssl_ca_list != '\0')
{
- if (!(SSL_CTX_load_verify_locations(context, ca_list, NULL)))
+ if (!(SSL_CTX_load_verify_locations(_hssl_context, _hssl_ca_list, NULL)))
{
- SSL_CTX_free(context);
- log_error2("Cannot read CA list: \"%s\"", ca_list);
+ SSL_CTX_free(_hssl_context);
+ log_error2("Cannot read CA list: \"%s\"", _hssl_ca_list);
return herror_new("_hssl_server_context_init", HSSL_ERROR_CA_LIST,
"Unable to read certification authorities \"%s\"");
}
- SSL_CTX_set_client_CA_list(context, SSL_load_client_CA_file(ca_list));
+ SSL_CTX_set_client_CA_list(_hssl_context, SSL_load_client_CA_file(_hssl_ca_list));
log_verbose1("Certification authority contacted");
}
- SSL_CTX_set_verify(context, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE,
+ SSL_CTX_set_verify(_hssl_context, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE,
_hssl_cert_verify_callback);
log_verbose1("Certificate verification callback registered");
- SSL_CTX_set_mode(context, SSL_MODE_AUTO_RETRY);
+ SSL_CTX_set_mode(_hssl_context, SSL_MODE_AUTO_RETRY);
- SSL_CTX_set_session_cache_mode(context, SSL_SESS_CACHE_OFF);
+ SSL_CTX_set_session_cache_mode(_hssl_context, SSL_SESS_CACHE_OFF);
_hssl_superseed();
@@ -365,10 +376,10 @@ _hssl_server_context_init(void)
static void
_hssl_server_context_destroy(void)
{
- if (context)
+ if (_hssl_context)
{
- SSL_CTX_free(context);
- context = NULL;
+ SSL_CTX_free(_hssl_context);
+ _hssl_context = NULL;
}
return;
}
@@ -378,7 +389,7 @@ hssl_module_init(int argc, char **argv)
{
_hssl_parse_arguments(argc, argv);
- if (enabled)
+ if (_hssl_enabled)
{
_hssl_library_init();
log_verbose1("SSL enabled");
@@ -396,13 +407,31 @@ hssl_module_destroy(void)
{
_hssl_server_context_destroy();
+ if (_hssl_certpass)
+ {
+ free(_hssl_certpass);
+ _hssl_certpass = NULL;
+ }
+
+ if (_hssl_ca_list)
+ {
+ free(_hssl_ca_list);
+ _hssl_ca_list = NULL;
+ }
+
+ if (_hssl_certificate)
+ {
+ free(_hssl_certificate);
+ _hssl_certificate = NULL;
+ }
+
return;
}
int
hssl_enabled(void)
{
- return enabled;
+ return _hssl_enabled;
}
herror_t
@@ -413,7 +442,7 @@ hssl_client_ssl(struct hsocket_t * sock)
log_verbose1("Starting SSL client initialization");
- if (!(ssl = SSL_new(context)))
+ if (!(ssl = SSL_new(_hssl_context)))
{
log_error1("Cannot create new SSL object");
return herror_new("hssl_client_ssl", HSSL_ERROR_CLIENT, "SSL_new failed");
@@ -452,7 +481,6 @@ hssl_client_ssl(struct hsocket_t * sock)
static int
_hssl_bio_read(BIO * b, char *out, int outl)
{
-
return hsocket_select_recv(b->num, out, outl);;
}
@@ -463,12 +491,12 @@ hssl_server_ssl(struct hsocket_t *sock)
int ret;
BIO *sbio;
- if (!enabled)
+ if (!_hssl_enabled)
return H_OK;
log_verbose2("Starting SSL initialization for socket %d", sock->sock);
- if (!(ssl = SSL_new(context)))
+ if (!(ssl = SSL_new(_hssl_context)))
{
log_warn1("SSL_new failed");
return herror_new("hssl_server_ssl", HSSL_ERROR_SERVER,
@@ -530,7 +558,7 @@ hssl_read(struct hsocket_t * sock, char *buf, size_t len, size_t * received)
if (sock->ssl)
{
if ((count = SSL_read(sock->ssl, buf, len)) < 1)
- return herror_new("SSL_read", HSOCKET_ERROR_RECEIVE,
+ return herror_new("hssl_read", HSOCKET_ERROR_RECEIVE,
"SSL_read failed (%s)", _hssl_get_error(sock->ssl,
count));
}
@@ -556,7 +584,7 @@ hssl_write(struct hsocket_t * sock, const char *buf, size_t len, size_t * sent)
if (sock->ssl)
{
if ((count = SSL_write(sock->ssl, buf, len)) == -1)
- return herror_new("SSL_write", HSOCKET_ERROR_SEND,
+ return herror_new("hssl_write", HSOCKET_ERROR_SEND,
"SSL_write failed (%s)", _hssl_get_error(sock->ssl,
count));
}
diff --git a/nanohttp/nanohttp-ssl.h b/nanohttp/nanohttp-ssl.h
index 6df53e7..8902ea3 100644
--- a/nanohttp/nanohttp-ssl.h
+++ b/nanohttp/nanohttp-ssl.h
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: nanohttp-ssl.h,v 1.22 2006/11/27 12:47:27 m0gg Exp $
+* $Id: nanohttp-ssl.h,v 1.23 2006/11/30 14:24:00 m0gg Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2001-2005 Rochester Institute of Technology
@@ -51,9 +51,9 @@ extern herror_t hssl_module_init(int argc, char **argv);
*/
extern void hssl_module_destroy(void);
-extern void hssl_set_certificate(char *c);
-extern void hssl_set_certpass(char *c);
-extern void hssl_set_ca(char *c);
+extern void hssl_set_certificate(const char *filename);
+extern void hssl_set_certpass(const char *password);
+extern void hssl_set_ca_list(const char *filename);
/**
*
diff --git a/nanohttp/nanohttp-stream.c b/nanohttp/nanohttp-stream.c
index 59888d1..b121e57 100755
--- a/nanohttp/nanohttp-stream.c
+++ b/nanohttp/nanohttp-stream.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: nanohttp-stream.c,v 1.17 2006/11/25 15:06:58 m0gg Exp $
+* $Id: nanohttp-stream.c,v 1.18 2006/11/30 14:24:00 m0gg Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003-2004 Ferhat Ayaz
@@ -570,19 +570,19 @@ http_output_stream_write(struct http_output_stream_t * stream,
if (stream->type == HTTP_TRANSFER_CHUNKED)
{
sprintf(chunked, "%x\r\n", size);
- if ((status = hsocket_send(stream->sock, chunked)) != H_OK)
+ if ((status = hsocket_send_string(stream->sock, chunked)) != H_OK)
return status;
}
if (size > 0)
{
- if ((status = hsocket_nsend(stream->sock, bytes, size)) != H_OK)
+ if ((status = hsocket_send(stream->sock, bytes, size)) != H_OK)
return status;
}
if (stream->type == HTTP_TRANSFER_CHUNKED)
{
- if ((status = hsocket_send(stream->sock, "\r\n")) != H_OK)
+ if ((status = hsocket_send_string(stream->sock, "\r\n")) != H_OK)
return status;
}
@@ -608,7 +608,7 @@ http_output_stream_flush(struct http_output_stream_t * stream)
if (stream->type == HTTP_TRANSFER_CHUNKED)
{
- if ((status = hsocket_send(stream->sock, "0\r\n\r\n")) != H_OK)
+ if ((status = hsocket_send_string(stream->sock, "0\r\n\r\n")) != H_OK)
return status;
}