File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / miniupnpc / minisoap.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 00:36:10 2013 UTC (10 years, 10 months ago) by misho
Branches: miniupnpc, elwix, MAIN
CVS tags: v1_8p0, v1_8, HEAD
1.8

    1: /* $Id: minisoap.c,v 1.1.1.2 2013/07/22 00:36:10 misho Exp $ */
    2: /* Project : miniupnp
    3:  * Author : Thomas Bernard
    4:  * Copyright (c) 2005-2012 Thomas Bernard
    5:  * This software is subject to the conditions detailed in the
    6:  * LICENCE file provided in this distribution.
    7:  *
    8:  * Minimal SOAP implementation for UPnP protocol.
    9:  */
   10: #include <stdio.h>
   11: #include <string.h>
   12: #ifdef _WIN32
   13: #include <io.h>
   14: #include <winsock2.h>
   15: #define snprintf _snprintf
   16: #else
   17: #include <unistd.h>
   18: #include <sys/types.h>
   19: #include <sys/socket.h>
   20: #endif
   21: #include "minisoap.h"
   22: #include "miniupnpcstrings.h"
   23: 
   24: /* only for malloc */
   25: #include <stdlib.h>
   26: 
   27: #ifdef _WIN32
   28: #define PRINT_SOCKET_ERROR(x)    printf("Socket error: %s, %d\n", x, WSAGetLastError());
   29: #else
   30: #define PRINT_SOCKET_ERROR(x) perror(x)
   31: #endif
   32: 
   33: /* httpWrite sends the headers and the body to the socket
   34:  * and returns the number of bytes sent */
   35: static int
   36: httpWrite(int fd, const char * body, int bodysize,
   37:           const char * headers, int headerssize)
   38: {
   39: 	int n = 0;
   40: 	/*n = write(fd, headers, headerssize);*/
   41: 	/*if(bodysize>0)
   42: 		n += write(fd, body, bodysize);*/
   43: 	/* Note : my old linksys router only took into account
   44: 	 * soap request that are sent into only one packet */
   45: 	char * p;
   46: 	/* TODO: AVOID MALLOC */
   47: 	p = malloc(headerssize+bodysize);
   48: 	if(!p)
   49: 	  return 0;
   50: 	memcpy(p, headers, headerssize);
   51: 	memcpy(p+headerssize, body, bodysize);
   52: 	/*n = write(fd, p, headerssize+bodysize);*/
   53: 	n = send(fd, p, headerssize+bodysize, 0);
   54: 	if(n<0) {
   55: 	  PRINT_SOCKET_ERROR("send");
   56: 	}
   57: 	/* disable send on the socket */
   58: 	/* draytek routers dont seems to like that... */
   59: #if 0
   60: #ifdef _WIN32
   61: 	if(shutdown(fd, SD_SEND)<0) {
   62: #else
   63: 	if(shutdown(fd, SHUT_WR)<0)	{ /*SD_SEND*/
   64: #endif
   65: 		PRINT_SOCKET_ERROR("shutdown");
   66: 	}
   67: #endif
   68: 	free(p);
   69: 	return n;
   70: }
   71: 
   72: /* self explanatory  */
   73: int soapPostSubmit(int fd,
   74:                    const char * url,
   75: 				   const char * host,
   76: 				   unsigned short port,
   77: 				   const char * action,
   78: 				   const char * body,
   79: 				   const char * httpversion)
   80: {
   81: 	int bodysize;
   82: 	char headerbuf[512];
   83: 	int headerssize;
   84: 	char portstr[8];
   85: 	bodysize = (int)strlen(body);
   86: 	/* We are not using keep-alive HTTP connections.
   87: 	 * HTTP/1.1 needs the header Connection: close to do that.
   88: 	 * This is the default with HTTP/1.0
   89: 	 * Using HTTP/1.1 means we need to support chunked transfer-encoding :
   90: 	 * When using HTTP/1.1, the router "BiPAC 7404VNOX" always use chunked
   91: 	 * transfer encoding. */
   92:     /* Connection: Close is normally there only in HTTP/1.1 but who knows */
   93: 	portstr[0] = '\0';
   94: 	if(port != 80)
   95: 		snprintf(portstr, sizeof(portstr), ":%hu", port);
   96: 	headerssize = snprintf(headerbuf, sizeof(headerbuf),
   97:                        "POST %s HTTP/%s\r\n"
   98: 	                   "Host: %s%s\r\n"
   99: 					   "User-Agent: " OS_STRING ", UPnP/1.0, MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n"
  100: 	                   "Content-Length: %d\r\n"
  101: 					   "Content-Type: text/xml\r\n"
  102: 					   "SOAPAction: \"%s\"\r\n"
  103: 					   "Connection: Close\r\n"
  104: 					   "Cache-Control: no-cache\r\n"	/* ??? */
  105: 					   "Pragma: no-cache\r\n"
  106: 					   "\r\n",
  107: 					   url, httpversion, host, portstr, bodysize, action);
  108: #ifdef DEBUG
  109: 	/*printf("SOAP request : headersize=%d bodysize=%d\n",
  110: 	       headerssize, bodysize);
  111: 	*/
  112: 	printf("SOAP request : POST %s HTTP/%s - Host: %s%s\n",
  113: 	        url, httpversion, host, portstr);
  114: 	printf("SOAPAction: \"%s\" - Content-Length: %d\n", action, bodysize);
  115: 	printf("Headers :\n%s", headerbuf);
  116: 	printf("Body :\n%s\n", body);
  117: #endif
  118: 	return httpWrite(fd, body, bodysize, headerbuf, headerssize);
  119: }
  120: 
  121: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>