From c66169f2ecb4419cd1ac67be12786cc5f69a663e Mon Sep 17 00:00:00 2001 From: patacongo Date: Sat, 28 Mar 2009 15:58:19 +0000 Subject: Make HTTP URL parsing common git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1652 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/include/net/uip/uip-lib.h | 21 +++-- nuttx/netutils/uiplib/Make.defs | 3 +- nuttx/netutils/uiplib/uip_parsehttpurl.c | 146 +++++++++++++++++++++++++++++++ 3 files changed, 163 insertions(+), 7 deletions(-) create mode 100644 nuttx/netutils/uiplib/uip_parsehttpurl.c (limited to 'nuttx') diff --git a/nuttx/include/net/uip/uip-lib.h b/nuttx/include/net/uip/uip-lib.h index ce81dca67..ac7355e62 100644 --- a/nuttx/include/net/uip/uip-lib.h +++ b/nuttx/include/net/uip/uip-lib.h @@ -1,11 +1,14 @@ /**************************************************************************** * net/uip/uiplib.h - * Various uIP library functions. + * Various non-standard APIs to support netutils. All non-standard and + * intended only for internal use. * - * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * - * Based on uIP which also has a BSD style license: + * Some of these APIs derive from uIP but all of them use the uip_ prefix + * to identify them as members of this library. uIP also has a BSD style + * license: * * Author: Adam Dunkels * Copyright (c) 2002, Adam Dunkels. @@ -39,8 +42,8 @@ * ****************************************************************************/ -#ifndef __UIPLIB_H__ -#define __UIPLIB_H__ +#ifndef __NET_UIP_UIP_LIB_H +#define __NET_UIP_UIP_LIB_H /**************************************************************************** * Included Files @@ -105,8 +108,14 @@ extern int uip_setdraddr(const char *ifname, const struct in_addr *addr); extern int uip_setnetmask(const char *ifname, const struct in_addr *addr); #endif +/* HTTP support */ + +extern int uip_parsehttpurl(const char *url, uint16 *port, + char *hostname, int hostlen, + char *filename, int namelen); + /* Generic server logic */ extern void uip_server(uint16 portno, pthread_startroutine_t handler, int stacksize); -#endif /* __UIPLIB_H__ */ +#endif /* __NET_UIP_UIP_LIB_H */ diff --git a/nuttx/netutils/uiplib/Make.defs b/nuttx/netutils/uiplib/Make.defs index f72c651fd..4b02092bd 100644 --- a/nuttx/netutils/uiplib/Make.defs +++ b/nuttx/netutils/uiplib/Make.defs @@ -35,4 +35,5 @@ UIPLIB_ASRCS = UIPLIB_CSRCS = uiplib.c uip_setmacaddr.c uip_getmacaddr.c uip_sethostaddr.c \ - uip_gethostaddr.c uip_setdraddr.c uip_setnetmask.c uip_server.c + uip_gethostaddr.c uip_setdraddr.c uip_setnetmask.c uip_parsehttpurl.c \ + uip_server.c diff --git a/nuttx/netutils/uiplib/uip_parsehttpurl.c b/nuttx/netutils/uiplib/uip_parsehttpurl.c new file mode 100644 index 000000000..22994a226 --- /dev/null +++ b/nuttx/netutils/uiplib/uip_parsehttpurl.c @@ -0,0 +1,146 @@ +/**************************************************************************** + * netutils/uiplib/uip_parsehttpurl.c + * + * Copyright (C) 2009 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ + +/**************************************************************************** + * Included Files + *****************************************************************************/ + +#include +#include +#include +#include +#include + +/**************************************************************************** + * Private Data + *****************************************************************************/ + +const char g_http[] = "http://"; +#define HTTPLEN 7 + +/**************************************************************************** + * Public Functions + *****************************************************************************/ + +/**************************************************************************** + * Name: uip_parsehttpurl + ****************************************************************************/ + +int uip_parsehttpurl(const char *url, uint16 *port, + char *hostname, int hostlen, + char *filename, int namelen) +{ + const char *src = url; + char *dest; + int bytesleft; + int ret = OK; + + /* A valid HTTP URL must begin with http:// if it does not, we will assume + * that it is a file name only, but still return an error. wget() depends + * on this strange behavior. + */ + + if (strncmp(src, g_http, HTTPLEN) != 0) + { + ret = -EINVAL; + } + else + { + /* Skip over the http:// */ + + src += HTTPLEN; + + /* Concatenate the hostname following http:// and up to the termnator */ + + dest = hostname; + bytesleft = hostlen; + while (*src != '\0' && *src != '/' && *src != ' ' && *src != ':') + { + /* Make sure that there is space for another character in the hostname. + * (reserving space for the null terminator) + */ + + if (bytesleft > 1) + { + *dest++ = *src++; + bytesleft--; + } + else + { + ret = -E2BIG; + } + } + *dest = '\0'; + + /* Check if the hostname is following by a port number */ + + if (*src == ':') + { + uint16 accum = 0; + src++; + while (*src >= '0' && *src <= 9) + { + accum = 10*accum + *src - '0'; + src++; + } + *port = accum; + } + } + + /* The rest of the line is the file name */ + + if (*src == '\0' || *src == ' ') + { + ret = -ENOENT; + } + + /* Make sure the file name starts with exactly one '/' */ + + dest = filename; + bytesleft = namelen; + while (*src == '/') + { + src++; + } + *dest++ = '/'; + bytesleft--; + + /* The copy the rest of the file name to the user buffer */ + + strncpy(dest, src, namelen); + filename[namelen-1] = '\0'; + return ret; +} + -- cgit v1.2.3