📄 http.cxx
字号:
/*
* http.cxx
*
* HTTP ancestor class and common classes.
*
* Portable Windows Library
*
* Copyright (c) 1993-2002 Equivalence Pty. Ltd.
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is Portable Windows Library.
*
* The Initial Developer of the Original Code is Equivalence Pty. Ltd.
*
* Contributor(s): ______________________________________.
*
* $Log: http.cxx,v $
* Revision 1.2 2007/05/29 15:10:34 joegenbaclor
* fixed bug in PURL::OpenBrowser(). We use a simple call to shell execute instead to maek sure that the default web browser is always called
*
* Revision 1.1 2006/06/29 04:18:02 joegenbaclor
* *** empty log message ***
*
* Revision 1.116 2005/11/30 12:47:41 csoutheren
* Removed tabs, reformatted some code, and changed tags for Doxygen
*
* Revision 1.115 2005/04/20 05:19:48 csoutheren
* Patch 1185334. Ensure SIP URLs correctly store status of port
* Thanks to Ted Szoczei
*
* Revision 1.114 2005/01/16 20:36:48 csoutheren
* Changed URLS to put IP address in [] if contains a ":"
*
* Revision 1.113 2005/01/04 08:09:41 csoutheren
* Fixed Linux configure problems
*
* Revision 1.112 2004/12/08 00:51:12 csoutheren
* Move PURLLegacyScheme to header file to allow external usage
*
* Revision 1.111 2004/10/23 11:27:24 ykiryanov
* Added ifdef _WIN32_WCE for PocketPC 2003 SDK port
*
* Revision 1.110 2004/08/31 23:40:51 csoutheren
* Fixed problem with absolute file paths in URLs
*
* Revision 1.109 2004/07/14 13:15:45 rjongbloed
* Fixed minor bug where a URL is "non-empty" if requires a host but has none.
* eg could end up with "sip:" or "http://:80" which are illegal.
*
* Revision 1.108 2004/07/12 09:17:20 csoutheren
* Fixed warnings and errors under Linux
*
* Revision 1.107 2004/07/06 10:12:52 csoutheren
* Added static integer o factory template to assist in ensuring factories are instantiated
*
* Revision 1.106 2004/06/30 12:17:05 rjongbloed
* Rewrite of plug in system to use single global variable for all factories to avoid all sorts
* of issues with startup orders and Windows DLL multiple instances.
*
* Revision 1.105 2004/06/16 07:48:12 csoutheren
* Added assert to clarify usage of default scheme
*
* Revision 1.104 2004/06/03 13:30:58 csoutheren
* Renamed INSTANTIATE_FACTORY to avoid potential namespace collisions
* Added documentaton on new PINSTANTIATE_FACTORY macro
* Added generic form of PINSTANTIATE_FACTORY
*
* Revision 1.103 2004/06/03 12:47:58 csoutheren
* Decomposed PFactory declarations to hopefully avoid problems with Windows DLLs
*
* Revision 1.102 2004/06/01 07:28:45 csoutheren
* Changed URL parsing to use abstract factory code
*
* Revision 1.101 2004/04/04 00:21:47 csoutheren
* FIxed problem with some URL parsing
*
* Revision 1.100 2004/04/03 08:22:20 csoutheren
* Remove pseudo-RTTI and replaced with real RTTI
*
* Revision 1.99 2004/03/23 05:08:21 csoutheren
* Fixed problem with use of ShellExecuteEx function
*
* Revision 1.98 2004/03/13 06:30:52 rjongbloed
* Virtualised parse function.
*
* Revision 1.97 2004/02/24 11:14:44 rjongbloed
* Fixed correct initialisation of some internal variables in URL if parse fails.
*
* Revision 1.96 2004/01/17 17:44:17 csoutheren
* Changed to use PString::MakeEmpty
*
* Revision 1.95 2003/11/18 09:22:17 csoutheren
* Fixed problems with PURL::OpenBrowser, thanks to David Parr
*
* Revision 1.94 2003/08/27 03:37:45 dereksmithies
* Fix initialization of pathStr so it really is empty. BIG thanks to Diego Tartara.
*
* Revision 1.93 2003/07/22 03:26:10 csoutheren
* Fixed problem with parsing default H323 addresses
*
* Revision 1.92 2003/06/23 15:31:40 ykiryanov
* Slightly changed call to ShellExecuteEx to make compatible with Win32
*
* Revision 1.91 2003/06/23 14:31:33 ykiryanov
* Modified for WinCE - used ShellExecuteEx instead of ShellExecute
*
* Revision 1.90 2003/06/05 00:15:54 rjongbloed
* Fixed callto bug created by previous patch.
*
* Revision 1.89 2003/06/04 01:42:05 rjongbloed
* Fixed h323 scheme, does not have a "password" field.
*
* Revision 1.88 2003/06/02 02:46:45 rjongbloed
* Fixed issue with callto URL parsing incorrect username field.
* Added automatic removal of illegal (though common) "//" in callto URL.
*
* Revision 1.87 2003/05/05 07:30:17 craigs
* Fixed problem with URLs that do not specify schemes
*
* Revision 1.86 2003/05/02 13:50:23 craigs
* Fixed a problem with callto:localhost
*
* Revision 1.85 2003/05/02 13:20:33 craigs
* Fixed callto problems
*
* Revision 1.84 2003/04/28 04:41:22 robertj
* Changed URL parsing so if a default scheme is present then explicit scheme
* must be "known" to avoid ambiguity with host:port parsing.
*
* Revision 1.83 2003/04/10 00:13:56 robertj
* Fixed correct decoding of user/password/host/port field, for non h323 schemes.
*
* Revision 1.82 2003/04/08 06:28:14 craigs
* Fixed introduced problem with HTTP server mistaking relative URLs for proxy requests
*
* Revision 1.81 2003/04/04 08:03:55 robertj
* Fixed special case of h323 URL default port changing depending on
* if it the host is an endpoint or gatekeeper.
*
* Revision 1.80 2003/04/04 05:18:08 robertj
* Added "callto", "tel" and fixed "h323" URL types.
*
* Revision 1.79 2002/12/02 00:17:03 robertj
* Fixed URL parsing/display problems with non-path URL type eg mailto
*
* Revision 1.78 2002/11/22 06:16:49 robertj
* Fixed usage of URI (relative http/https URL).
*
* Revision 1.77 2002/11/20 02:10:56 robertj
* Fixed some more realtive/absolute path issues.
*
* Revision 1.76 2002/11/20 01:01:49 robertj
* Fixed GNU compatibility
*
* Revision 1.75 2002/11/20 00:49:37 robertj
* Fixed correct interpretation of url re double slashes as per latest RFC,
* including file: mapping and relative paths. Probably still more to do.
*
* Revision 1.74 2002/11/19 22:45:03 robertj
* Fixed support for file: scheme under unix
*
* Revision 1.73 2002/11/19 10:36:50 robertj
* Added functions to set anf get "file:" URL. as PFilePath and do the right
* things with platform dependent directory components.
*
* Revision 1.72 2002/11/06 22:47:25 robertj
* Fixed header comment (copyright etc)
*
* Revision 1.71 2002/09/23 07:17:24 robertj
* Changes to allow winsock2 to be included.
*
* Revision 1.70 2002/08/28 08:06:11 craigs
* Fixed problem (again) with file:// URLs
*
* Revision 1.69 2002/08/28 05:11:23 craigs
* Fixed problem with file:// URLs
*
* Revision 1.68 2002/05/02 05:11:29 craigs
* Fixed problem with not translating + chars in URL query parameters
*
* Revision 1.67 2002/03/19 23:39:57 robertj
* Fixed string output to include PathOnly variant, lost in previous mod.
*
* Revision 1.66 2002/03/19 23:24:08 robertj
* Fixed problems with backward compatibility on parameters processing.
*
* Revision 1.65 2002/03/18 05:02:27 robertj
* Added functions to set component parts of URL.
* Fixed output of parameters when more than one ';' involved.
*
* Revision 1.64 2001/11/09 05:46:14 robertj
* Removed double slash on sip URL.
* Fixed extra : if have username but no password.
* Added h323: scheme
*
* Revision 1.63 2001/11/08 00:32:49 robertj
* Added parsing of ';' based parameter fields into string dictionary if there are multiple parameters, with '=' values.
*
* Revision 1.62 2001/10/31 01:33:07 robertj
* Added extra const for constant HTTP tag name strings.
*
* Revision 1.61 2001/10/03 00:26:34 robertj
* Upgraded client to HTTP/1.1 and for chunked mode entity bodies.
*
* Revision 1.60 2001/09/28 00:45:42 robertj
* Broke out internal static function for unstranslating URL strings.
*
* Revision 1.59 2001/07/16 00:43:06 craigs
* Added ability to parse other transport URLs
*
* Revision 1.58 2000/05/02 08:29:07 craigs
* Removed "memory leaks" caused by brain-dead GNU linker
*
* Revision 1.57 1999/05/11 12:24:18 robertj
* Fixed URL parser so leading blanks are ignored.
*
* Revision 1.56 1999/05/04 15:26:01 robertj
* Improved HTTP/1.1 compatibility (pass through user commands).
* Fixed problems with quicktime installer.
*
* Revision 1.55 1999/04/21 01:56:13 robertj
* Fixed problem with escape codes greater that %80
*
* Revision 1.54 1999/01/16 12:45:54 robertj
* Added RTSP schemes to URL's
*
* Revision 1.53 1998/11/30 05:38:15 robertj
* Moved PURL::Open() code to .cxx file to avoid linking unused code.
*
* Revision 1.52 1998/11/30 04:51:53 robertj
* New directory structure
*
* Revision 1.51 1998/09/23 06:22:07 robertj
* Added open source copyright license.
*
* Revision 1.50 1998/02/03 10:02:34 robertj
* Added ability to get scheme, host and port from URL as a string.
*
* Revision 1.49 1998/02/03 06:27:26 robertj
* Fixed URL encoding to be closer to RFC
*
* Revision 1.48 1998/01/26 02:49:16 robertj
* GNU support.
*
* Revision 1.47 1997/11/10 12:40:20 robertj
* Fixed illegal character set for URL's.
*
* Revision 1.46 1997/07/14 11:47:10 robertj
* Added "const" to numerous variables.
*
* Revision 1.45 1997/07/12 09:45:01 robertj
* Fixed bug when URL has + sign in somthing other than parameters.
*
* Revision 1.44 1997/06/06 08:54:47 robertj
* Allowed username/password on http scheme URL.
*
* Revision 1.43 1997/04/06 07:46:09 robertj
* Fixed bug where URL has more than special character ('?', '#' etc).
*
* Revision 1.42 1997/03/28 04:40:24 robertj
* Added tags for cookies.
*
* Revision 1.41 1997/03/18 22:03:44 robertj
* Fixed bug that incorrectly parses URL with double slashes.
*
* Revision 1.40 1997/02/14 13:55:44 robertj
* Fixed bug in URL for reproducing fields with special characters, must be escaped and weren't.
*
* Revision 1.39 1997/01/12 04:15:21 robertj
* Globalised MIME tag strings.
*
* Revision 1.38 1996/09/14 13:09:28 robertj
* Major upgrade:
* rearranged sockets to help support IPX.
* added indirect channel class and moved all protocols to descend from it,
* separating the protocol from the low level byte transport.
*
* Revision 1.37 1996/08/25 09:37:41 robertj
* Added function to detect "local" host name.
* Fixed printing of trailing '/' in empty URL, is distinction between with and without.
*
* Revision 1.36 1996/08/22 13:22:26 robertj
* Fixed bug in print of URLs, extra @ signs.
*
* Revision 1.35 1996/08/19 13:42:40 robertj
* Fixed errors in URL parsing and display.
* Fixed "Forbidden" problem out of HTTP authorisation system.
* Fixed authorisation so if have no user/password on basic authentication, does not require it.
*
* Revision 1.34 1996/07/27 04:13:47 robertj
* Fixed use of HTTP proxy on non-persistent connections.
*
* Revision 1.33 1996/07/15 10:37:20 robertj
* Improved proxy "self" detection (especially localhost).
*
* Revision 1.32 1996/06/28 13:20:24 robertj
* Modified HTTPAuthority so gets PHTTPReqest (mainly for URL) passed in.
* Moved HTTP form resource to another compilation module.
* Fixed memory leak in POST command.
*
* Revision 1.31 1996/06/10 10:00:00 robertj
* Added global function for query parameters parsing.
*
* Revision 1.30 1996/06/07 13:52:23 robertj
* Added PUT to HTTP proxy FTP. Necessitating redisign of entity body processing.
*
* Revision 1.29 1996/06/05 12:33:04 robertj
* Fixed bug in parsing URL with no path, is NOT absolute!
*
* Revision 1.28 1996/05/30 10:07:26 robertj
* Fixed bug in version number checking of return code compatibility.
*
* Revision 1.27 1996/05/26 03:46:42 robertj
* Compatibility to GNU 2.7.x
*
* Revision 1.26 1996/05/23 10:02:13 robertj
* Added common function for GET and HEAD commands.
* Fixed status codes to be the actual status code instead of sequential enum.
* This fixed some problems with proxy pass through of status codes.
* Fixed bug in URL parsing of username and passwords.
*
* Revision 1.19.1.1 1996/04/17 11:08:22 craigs
* New version by craig pending confirmation by robert
*
* Revision 1.19 1996/04/05 01:46:30 robertj
* Assured PSocket::Write always writes the number of bytes specified, no longer need write loops.
* Added workaraound for NT Netscape Navigator bug with persistent connections.
*
* Revision 1.18 1996/03/31 09:05:07 robertj
* HTTP 1.1 upgrade.
*
* Revision 1.17 1996/03/17 05:48:07 robertj
* Fixed host name print out of URLs.
* Added hit count to PHTTPResource.
*
* Revision 1.16 1996/03/16 05:00:26 robertj
* Added ParseReponse() for splitting reponse line into code and info.
* Added client side support for HTTP socket.
* Added hooks for proxy support in HTTP socket.
* Added translation type to TranslateString() to accommodate query variables.
* Defaulted scheme field in URL to "http".
* Inhibited output of port field on string conversion of URL according to scheme.
*
* Revision 1.15 1996/03/11 10:29:50 robertj
* Fixed bug in help image HTML.
*
* Revision 1.14 1996/03/10 13:15:24 robertj
* Redesign to make resources thread safe.
*
* Revision 1.13 1996/03/02 03:27:37 robertj
* Added function to translate a string to a form suitable for inclusion in a URL.
* Added radio button and selection boxes to HTTP form resource.
* Fixed bug in URL parsing, losing first / if hostname specified.
*
* Revision 1.12 1996/02/25 11:14:24 robertj
* Radio button support for forms.
*
* Revision 1.11 1996/02/25 03:10:34 robertj
* Removed pass through HTTP resource.
* Fixed PHTTPConfig resource to use correct name for config key.
*
* Revision 1.10 1996/02/19 13:48:28 robertj
* Put multiple uses of literal strings into const variables.
* Fixed URL parsing so that the unmangling of strings occurs correctly.
* Moved nested classes from PHTTPForm.
* Added overwrite option to AddResource().
* Added get/set string to PHTTPString resource.
*
* Revision 1.9 1996/02/13 13:09:17 robertj
* Added extra parameters to callback function in PHTTPResources, required
* by descendants to make informed decisions on data being loaded.
*
* Revision 1.8 1996/02/08 12:26:29 robertj
* Redesign of resource callback mechanism.
* Added new resource types for HTML data entry forms.
*
* Revision 1.7 1996/02/03 11:33:19 robertj
* Changed RadCmd() so can distinguish between I/O error and unknown command.
*
* Revision 1.6 1996/02/03 11:11:49 robertj
* Numerous bug fixes.
* Added expiry date and ismodifiedsince support.
*
* Revision 1.5 1996/01/30 23:32:40 robertj
* Added single .
*
* Revision 1.4 1996/01/28 14:19:09 robertj
* Split HTML into separate source file.
* Beginning of pass through resource type.
* Changed PCharArray in OnLoadData to PString for convenience in mangling data.
* Made PHTTPSpace return standard page on selection of partial path.
*
* Revision 1.3 1996/01/28 02:49:16 robertj
* Further implementation.
*
* Revision 1.2 1996/01/26 02:24:30 robertj
* Further implemetation.
*
* Revision 1.1 1996/01/23 13:04:32 robertj
* Initial revision
*
*/
#ifdef __GNUC__
#pragma implementation "http.h"
#pragma implementation "url.h"
#endif
#include <ptlib.h>
#define P_DISABLE_FACTORY_INSTANCES
#include <ptlib/sockets.h>
#include <ptclib/http.h>
#include <ptclib/url.h>
#include <ctype.h>
#ifdef WIN32
#include <shellapi.h>
#endif
// RFC 1738
// http://host:port/path...
// https://host:port/path....
// gopher://host:port
// wais://host:port
// nntp://host:port
// prospero://host:port
// ftp://user:password@host:port/path...
// telnet://user:password@host:port
// file://hostname/path...
// mailto:user@hostname
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -