PageRenderTime 82ms CodeModel.GetById 40ms app.highlight 6ms RepoModel.GetById 34ms app.codeStats 0ms

/thirdparty/libportfwd/third-party/miniupnpc-1.6/minisoap.c

http://github.com/tomahawk-player/tomahawk
C | 121 lines | 83 code | 6 blank | 32 comment | 6 complexity | e0327592bc4c53bef7be524573477e6c MD5 | raw file
  1/* $Id: minisoap.c,v 1.21 2011/03/22 19:15:35 nanard Exp $ */
  2/* Project : miniupnp
  3 * Author : Thomas Bernard
  4 * Copyright (c) 2005-2009 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 */
 35static int
 36httpWrite(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  */
 73int 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