355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * "$Id: http-support.c 148 2006-04-25 16:54:17Z njacobs $"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * HTTP support routines for the Common UNIX Printing System (CUPS) scheduler.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Copyright 1997-2005 by Easy Software Products, all rights reserved.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * These coded instructions, statements, and computer programs are the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * property of Easy Software Products and are protected by Federal
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * copyright law. Distribution and use rights are outlined in the file
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * "LICENSE.txt" which should have been included with this file. If this
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * file is missing or damaged please contact Easy Software Products
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * at:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Attn: CUPS Licensing Information
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Easy Software Products
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * 44141 Airport View Drive, Suite 204
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Hollywood, Maryland 20636 USA
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Voice: (301) 373-9600
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * EMail: cups-info@cups.org
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * WWW: http://www.cups.org
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * This file is subject to the Apple OS-Developed Software exception.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Contents:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * httpSeparate() - Separate a Universal Resource Identifier into its
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * components.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * httpSeparate2() - Separate a Universal Resource Identifier into its
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * components.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * httpStatus() - Return a short string describing a HTTP status code.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * cups_hstrerror() - hstrerror() emulation function for Solaris and others...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * http_copy_decode() - Copy and decode a URI.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#pragma ident "%Z%%M% %I% %E% SMI"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Include necessary headers...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdio.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdlib.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdarg.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <ctype.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include "string.h"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include "http.h"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Local functions...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic const char *http_copy_decode(char *dst, const char *src,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int dstsize, const char *term);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * 'httpSeparate()' - Separate a Universal Resource Identifier into its
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * components.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobshttpSeparate(const char *uri, /* I - Universal Resource Identifier */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *method, /* O - Method [32] (http, https, etc.) */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *username, /* O - Username [1024] */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *host, /* O - Hostname [1024] */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int *port, /* O - Port number to use */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *resource) /* O - Resource/filename [1024] */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpSeparate2(uri, method, 32, username, HTTP_MAX_URI, host, HTTP_MAX_URI,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs port, resource, HTTP_MAX_URI);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * 'httpSeparate2()' - Separate a Universal Resource Identifier into its
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * components.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobshttpSeparate2(const char *uri, /* I - Universal Resource Identifier */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *method, /* O - Method (http, https, etc.) */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int methodlen, /* I - Size of method buffer */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *username, /* O - Username */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int usernamelen, /* I - Size of username buffer */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *host, /* O - Hostname */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int hostlen, /* I - Size of hostname buffer */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int *port, /* O - Port number to use */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *resource, /* O - Resource/filename */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int resourcelen) /* I - Size of resource buffer */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *ptr; /* Pointer into string... */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs const char *atsign, /* @ sign */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *slash; /* Separator */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Range check input...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri == NULL || method == NULL || username == NULL || host == NULL ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs port == NULL || resource == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Grab the method portion of the URI...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (strncmp(uri, "//", 2) == 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Workaround for HP IPP client bug...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs strlcpy(method, "ipp", methodlen);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Standard URI with method...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri = http_copy_decode(host, uri, hostlen, ":");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (*uri == ':')
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri ++;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * If the method contains a period or slash, then it's probably
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * hostname/filename...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (strchr(host, '.') != NULL || strchr(host, '/') != NULL || *uri == '\0')
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((ptr = strchr(host, '/')) != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs strlcpy(resource, ptr, resourcelen);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *ptr = '\0';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs resource[0] = '\0';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (isdigit(*uri & 255))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * OK, we have "hostname:port[/resource]"...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *port = strtol(uri, (char **)&uri, 10);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (*uri == '/')
355b4669e025ff377602b6fc7caaf30dbc218371jacobs strlcpy(resource, uri, resourcelen);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *port = 631;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs strlcpy(method, "http", methodlen);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs username[0] = '\0';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs strlcpy(method, host, methodlen);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * If the method starts with less than 2 slashes then it is a local resource...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (strncmp(uri, "//", 2) != 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs strlcpy(resource, uri, resourcelen);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs username[0] = '\0';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs host[0] = '\0';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *port = 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Grab the username, if any...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri += 2;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((slash = strchr(uri, '/')) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs slash = uri + strlen(uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((atsign = strchr(uri, '@')) != NULL && atsign < slash)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Got a username:password combo...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri = http_copy_decode(username, uri, usernamelen, "@") + 1;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs username[0] = '\0';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Grab the hostname...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri = http_copy_decode(host, uri, hostlen, ":/");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (*uri != ':')
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (strcasecmp(method, "http") == 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *port = 80;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else if (strcasecmp(method, "https") == 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *port = 443;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else if (strcasecmp(method, "ipp") == 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *port = 631;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else if (strcasecmp(method, "lpd") == 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *port = 515;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else if (strcasecmp(method, "socket") == 0) /* Not registered yet... */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *port = 9100;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *port = 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Parse port number...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *port = strtol(uri + 1, (char **)&uri, 10);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (*uri == '\0')
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Hostname but no port or path...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs resource[0] = '/';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs resource[1] = '\0';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * The remaining portion is the resource string...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs http_copy_decode(resource, uri, resourcelen, "");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * 'httpStatus()' - Return a short string describing a HTTP status code.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsconst char * /* O - String or NULL */
355b4669e025ff377602b6fc7caaf30dbc218371jacobshttpStatus(http_status_t status) /* I - HTTP status code */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (status)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_CONTINUE :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Continue");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_SWITCHING_PROTOCOLS :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Switching Protocols");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_OK :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("OK");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_CREATED :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Created");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_ACCEPTED :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Accepted");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_NO_CONTENT :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("No Content");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_NOT_MODIFIED :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Not Modified");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_BAD_REQUEST :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Bad Request");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_UNAUTHORIZED :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Unauthorized");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_FORBIDDEN :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Forbidden");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_NOT_FOUND :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Not Found");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_REQUEST_TOO_LARGE :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Request Entity Too Large");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_URI_TOO_LONG :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("URI Too Long");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_UPGRADE_REQUIRED :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Upgrade Required");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_NOT_IMPLEMENTED :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Not Implemented");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case HTTP_NOT_SUPPORTED :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Not Supported");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs default :
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Unknown");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifndef HAVE_HSTRERROR
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * 'cups_hstrerror()' - hstrerror() emulation function for Solaris and others...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsconst char * /* O - Error string */
355b4669e025ff377602b6fc7caaf30dbc218371jacobscups_hstrerror(int error) /* I - Error number */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs static const char * const errors[] = /* Error strings */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "OK",
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "Host not found.",
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "Try again.",
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "Unrecoverable lookup error.",
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "No data associated with name."
355b4669e025ff377602b6fc7caaf30dbc218371jacobs };
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (error < 0 || error > 4)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return ("Unknown hostname lookup error.");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (errors[error]);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif /* !HAVE_HSTRERROR */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * 'http_copy_decode()' - Copy and decode a URI.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic const char * /* O - New source pointer */
355b4669e025ff377602b6fc7caaf30dbc218371jacobshttp_copy_decode(char *dst, /* O - Destination buffer */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs const char *src, /* I - Source pointer */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int dstsize, /* I - Destination size */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs const char *term) /* I - Terminating characters */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *ptr, /* Pointer into buffer */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *end; /* End of buffer */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int quoted; /* Quoted character */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Copy the src to the destination until we hit a terminating character
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * or the end of the string.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (ptr = dst, end = dst + dstsize - 1; *src && !strchr(term, *src); src ++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (ptr < end)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (*src == '%' && isxdigit(src[1] & 255) && isxdigit(src[2] & 255))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Grab a hex-encoded character...
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs src ++;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (isalpha(*src))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs quoted = (tolower(*src) - 'a' + 10) << 4;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs quoted = (*src - '0') << 4;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs src ++;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (isalpha(*src))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs quoted |= tolower(*src) - 'a' + 10;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs quoted |= *src - '0';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *ptr++ = quoted;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *ptr++ = *src;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *ptr = '\0';
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (src);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * End of "$Id: http-support.c 148 2006-04-25 16:54:17Z njacobs $"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */