[Freeswitch-svn] [commit] r8546 - freeswitch/trunk/src/mod/xml_int/mod_xml_rpc

Freeswitch SVN mikej at freeswitch.org
Fri May 23 16:57:56 EDT 2008


Author: mikej
Date: Fri May 23 16:57:56 2008
New Revision: 8546

Modified:
   freeswitch/trunk/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.2008.vcproj
   freeswitch/trunk/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.c

Log:
update to new lib ... more to come

Modified: freeswitch/trunk/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.2008.vcproj
==============================================================================
--- freeswitch/trunk/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.2008.vcproj	(original)
+++ freeswitch/trunk/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.2008.vcproj	Fri May 23 16:57:56 2008
@@ -39,7 +39,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c\include&quot;;&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c&quot;"
+				AdditionalIncludeDirectories="&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c\include&quot;;&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c&quot;;&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c\lib\abyss\src&quot;;&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c\lib\util\include&quot;"
 				PreprocessorDefinitions="ABYSS_WIN32"
 				UsePrecompiledHeader="0"
 			/>
@@ -103,7 +103,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c\include&quot;;&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c&quot;"
+				AdditionalIncludeDirectories="&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c\include&quot;;&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c&quot;;&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c\lib\abyss\src&quot;;&quot;$(InputDir)..\..\..\..\libs\xmlrpc-c\lib\util\include&quot;"
 				PreprocessorDefinitions="ABYSS_WIN32"
 				UsePrecompiledHeader="0"
 			/>

Modified: freeswitch/trunk/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.c
==============================================================================
--- freeswitch/trunk/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.c	(original)
+++ freeswitch/trunk/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.c	Fri May 23 16:57:56 2008
@@ -36,19 +36,20 @@
 #endif
 
 #include <xmlrpc-c/base.h>
-#ifdef ABYSS_WIN32
-#undef strcasecmp
-#endif
 #include <xmlrpc-c/abyss.h>
 #include <xmlrpc-c/server.h>
 #include <xmlrpc-c/server_abyss.h>
 #include "../../libs/xmlrpc-c/lib/abyss/src/token.h"
+#include "http.h"
+#include "session.h"
 
 SWITCH_MODULE_LOAD_FUNCTION(mod_xml_rpc_load);
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_rpc_shutdown);
 SWITCH_MODULE_RUNTIME_FUNCTION(mod_xml_rpc_runtime);
 SWITCH_MODULE_DEFINITION(mod_xml_rpc, mod_xml_rpc_load, mod_xml_rpc_shutdown, mod_xml_rpc_runtime);
 
+static abyss_bool HTTPWrite(TSession *s,char *buffer,uint32_t len);
+
 static struct {
 	uint16_t port;
 	uint8_t running;
@@ -147,7 +148,8 @@
 
 static abyss_bool http_directory_auth(TSession *r, char *domain_name) 
 {
-    char *p, *x;
+    char *p;
+	char *x;
     char z[256], t[80];
 	char user[512];
 	char *pass;
@@ -160,13 +162,13 @@
     p = RequestHeaderValue(r, "authorization");
 
     if (p) {
-        NextToken(&p);
+        NextToken((const char **)&p);
         x = GetToken(&p);
         if (x) {
             if (!strcasecmp(x, "basic")) {
 
 
-                NextToken(&p);
+                NextToken((const char **)&p);
 				switch_b64_decode(p, user, sizeof(user));
 				if ((pass = strchr(user, ':'))) {
 					*pass++ = '\0';
@@ -177,7 +179,7 @@
 						*domain_name++ = '\0';
 						at++;
 					} else {
-						domain_name = r->host;
+						domain_name = (char *)r->requestInfo.host;
 						if (!strncasecmp(domain_name, "www.", 3)) {
 							domain_name += 4;
 						}
@@ -192,7 +194,7 @@
 				Base64Encode(z, t);
 				
 				if (!strcmp(p, t)) {
-					r->user=strdup(user);
+					r->requestInfo.user=strdup(user);
 					goto authed;
 				}
 				
@@ -239,7 +241,7 @@
 				}
 				
 				if (!(mypass1 && mypass2)) {
-					r->user=strdup(user);
+					r->requestInfo.user=strdup(user);
 					goto authed;
 				} else {
 					if (mypass1) {
@@ -251,7 +253,7 @@
 						Base64Encode(z, t);
 				
 						if (!strcmp(p, t)) {
-							r->user=strdup(box ? box : user);
+							r->requestInfo.user=strdup(box ? box : user);
 							goto authed;
 						}
 					}
@@ -265,7 +267,7 @@
 						Base64Encode(z, t);
 				
 						if (!strcmp(p, t)) {
-							r->user=strdup(box ? box : user);
+							r->requestInfo.user=strdup(box ? box : user);
 							goto authed;
 						}
 					}
@@ -280,7 +282,7 @@
 							Base64Encode(z, t);
 					
 							if (!strcmp(p, t)) {
-								r->user=strdup(box);
+								r->requestInfo.user=strdup(box);
 								goto authed;
 							}
 						}
@@ -295,7 +297,7 @@
 							Base64Encode(z, t);
 					
 							if (!strcmp(p, t)) {
-								r->user=strdup(box);
+								r->requestInfo.user=strdup(box);
 								goto authed;
 							}
 						}
@@ -305,7 +307,7 @@
 
 			authed:
 				
-				ResponseAddField(r, "freeswitch-user", r->user);
+				ResponseAddField(r, "freeswitch-user", r->requestInfo.user);
 				ResponseAddField(r, "freeswitch-domain", domain_name);
 				
 				if (x_domain_root) {
@@ -334,8 +336,8 @@
 	char *domain_name, *e;
 	abyss_bool ret = FALSE;
 
-	if (!strncmp(r->uri, "/domains/", 9)) {
-		domain_name = strdup(r->uri + 9);
+	if (!strncmp(r->requestInfo.uri, "/domains/", 9)) {
+		domain_name = strdup(r->requestInfo.uri + 9);
 		switch_assert(domain_name);
 		
 		if ((e = strchr(domain_name, '/'))) {
@@ -344,7 +346,7 @@
 
 		if (!strcmp(domain_name, "this")) {
 			free(domain_name);
-			domain_name = strdup(r->host);
+			domain_name = strdup(r->requestInfo.host);
 		}
 
 		ret = !http_directory_auth(r, domain_name);
@@ -355,8 +357,8 @@
 		const char *list[2] = {"index.html", "index.txt"};
 		int x;
 
-		if (!strncmp(r->uri, "/pub", 4)) {
-			char *p = r->uri;
+		if (!strncmp(r->requestInfo.uri, "/pub", 4)) {
+			char *p = (char *)r->requestInfo.uri;
 			char *new_uri = p + 4;
 			if (!new_uri) {
 				new_uri = "/";
@@ -388,11 +390,11 @@
 				}
 			}
 
-			r->uri = strdup(new_uri);
+			r->requestInfo.uri = strdup(new_uri);
 			free(p);
 
 		} else {
-			if (globals.realm && strncmp(r->uri, "/pub", 4)) {
+			if (globals.realm && strncmp(r->requestInfo.uri, "/pub", 4)) {
 				ret = !http_directory_auth(r, NULL);
 			}
 		}
@@ -400,6 +402,39 @@
 	return ret;
 }
 
+
+static abyss_bool HTTPWrite(TSession *s,char *buffer,uint32_t len)
+{
+    if (s->chunkedwrite && s->chunkedwritemode)
+		{
+			char t[16];
+
+			if (ConnWrite(s->conn,t,sprintf(t,"%x"CRLF,len)))
+				if (ConnWrite(s->conn,buffer,len))
+					return ConnWrite(s->conn,CRLF,2);
+
+			return FALSE;
+		}
+
+    return ConnWrite(s->conn,buffer,len);
+}
+
+static abyss_bool HTTPWriteEnd(TSession *s)
+{
+    if (!s->chunkedwritemode)
+        return TRUE;
+
+    if (s->chunkedwrite)
+		{
+			/* May be one day trailer dumping will be added */
+			s->chunkedwritemode=FALSE;
+			return ConnWrite(s->conn,"0"CRLF CRLF,5);
+		}
+
+    s->requestInfo.keepalive=FALSE;
+    return TRUE;
+}
+
 abyss_bool handler_hook(TSession * r)
 {
 	//char *mime = "text/html";
@@ -419,13 +454,13 @@
 	stream.write_function = http_stream_write;
 	stream.raw_write_function = http_stream_raw_write;
 
-	if (!r || !r->uri) {
+	if (!r || !r->requestInfo.uri) {
 		return FALSE;
 	}
 
-	if ((command = strstr(r->uri, "/api/"))) {
+	if ((command = strstr(r->requestInfo.uri, "/api/"))) {
 		command += 5;
-	} else if ((command = strstr(r->uri, "/webapi/"))) {
+	} else if ((command = strstr(r->requestInfo.uri, "/webapi/"))) {
 		command += 8;
 		html++;
 	} else {
@@ -493,31 +528,31 @@
 			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "FreeSWITCH-Domain", "%s", fs_domain);
 		if (path_info)
 			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-Path-Info", "%s", path_info);
-		switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-URI", "%s", r->uri);
-		if (r->query)
-			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-QUERY", "%s", r->query);
-		if (r->host)
-			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-HOST", "%s", r->host);
-		if (r->from)
-			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-FROM", "%s", r->from);
-		if (r->useragent)
-			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-USER-AGENT", "%s", r->useragent);
-		if (r->referer)
-			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-REFERER", "%s", r->referer);
-		if (r->requestline)
-			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-REQUESTLINE", "%s", r->requestline);
-		if (r->user)
-			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-USER", "%s", r->user);
-		if (r->port)
-			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-PORT", "%u", r->port);
-		if (r->query || content_length) {
+		switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-URI", "%s", r->requestInfo.uri);
+		if (r->requestInfo.query)
+			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-QUERY", "%s", r->requestInfo.query);
+		if (r->requestInfo.host)
+			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-HOST", "%s", r->requestInfo.host);
+		if (r->requestInfo.from)
+			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-FROM", "%s", r->requestInfo.from);
+		if (r->requestInfo.useragent)
+			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-USER-AGENT", "%s", r->requestInfo.useragent);
+		if (r->requestInfo.referer)
+			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-REFERER", "%s", r->requestInfo.referer);
+		if (r->requestInfo.requestline)
+			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-REQUESTLINE", "%s", r->requestInfo.requestline);
+		if (r->requestInfo.user)
+			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-USER", "%s", r->requestInfo.user);
+		if (r->requestInfo.port)
+			switch_event_add_header(stream.event, SWITCH_STACK_BOTTOM, "HTTP-PORT", "%u", r->requestInfo.port);
+		if (r->requestInfo.query || content_length) {
 			char *q, *qd;
 			char *next;
-			char *query = r->query;
+			char *query = (char *)r->requestInfo.query;
 			char *name, *val;
 			char qbuf[8192] = "";
 			
-			if (r->method == m_post && content_length) {
+			if (r->requestInfo.method == m_post && content_length) {
 				int len = atoi(content_length);
 				int qlen = 0;
 				
@@ -543,7 +578,7 @@
 						if (qlen >= len) {
 							break;
 						}
-					} while ((succeeded = ConnRead(r->conn, r->server->timeout)));
+					} while ((succeeded = ConnRead(r->conn, 2000)));
 					
 					query = qbuf;
 				}
@@ -595,9 +630,16 @@
 	//HTTPWrite(r, "<pre>\n\n", 7);
 
 	/* generation of the date field */
-	if (DateToString(&r->date, buf)) {
-		ResponseAddField(r,"Date", buf);
+	{
+		const char * dateValue;
+
+		DateToString(r->date, &dateValue);
+
+		if (dateValue) {
+			ResponseAddField(r, "Date", dateValue);
+		}
 	}
+
 	
 	/* Generation of the server field */
 	ResponseAddField(r,"Server", "FreeSWITCH-" SWITCH_VERSION_FULL "-mod_xml_rpc");
@@ -622,17 +664,24 @@
 	}
 
 
-	if (switch_api_execute(command, r->query, NULL, &stream) == SWITCH_STATUS_SUCCESS) {
+	if (switch_api_execute(command, r->requestInfo.query, NULL, &stream) == SWITCH_STATUS_SUCCESS) {
 		ResponseStatus(r, 200);
-		r->done = TRUE;
+		r->responseStarted = TRUE;
+		//r->done = TRUE;
 	} else {
 		ResponseStatus(r, 404);
 		ResponseError(r);
 	} 
 	
-	SocketClose(&(r->conn->socket));
+	//SocketClose(&(r->conn->socket));
+	
 	HTTPWriteEnd(r);
-	ConnClose(r->conn);
+	//if(r->conn->channelP)
+	//ConnKill(r->conn);
+	//ChannelInterrupt(r->conn->channelP);
+	//ConnClose(r->conn);
+	//ChannelDestroy(r->conn->channelP);
+	r->requestInfo.keepalive = 0;
 
  end:
 
@@ -757,15 +806,19 @@
 	ServerCreate(&globals.abyssServer, "XmlRpcServer", globals.port, SWITCH_GLOBAL_dirs.htdocs_dir, logfile);
 
 	xmlrpc_server_abyss_set_handler(&env, &globals.abyssServer, "/RPC2", registryP);
+	ServerInit(&globals.abyssServer);
 
+#if 0
 	if (ServerInit(&globals.abyssServer) != TRUE) {
 		globals.running = 0;
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to start HTTP Port %d\n", globals.port);
 		return SWITCH_STATUS_TERM;
 	}
+#endif
 
 	ServerAddHandler(&globals.abyssServer, handler_hook);
 	ServerAddHandler(&globals.abyssServer, auth_hook);
+	ServerSetKeepaliveTimeout(&globals.abyssServer, 1);
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Starting HTTP Port %d, DocRoot [%s]\n", globals.port, SWITCH_GLOBAL_dirs.htdocs_dir);
 	ServerRun(&globals.abyssServer);
 	globals.running = 0;
@@ -775,8 +828,9 @@
 
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_rpc_shutdown)
 {
-	globals.abyssServer.running = 0;
-	shutdown(globals.abyssServer.listensock, 2);
+	//globals.abyssServer.running = 0;
+	//shutdown(globals.abyssServer.listensock, 2);
+	ServerTerminate(&globals.abyssServer);
 	while(globals.running) {
 		switch_yield(100000);
 	}



More information about the Freeswitch-svn mailing list