⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpclnt.cxx

📁 mgcp协议源代码。支持多种编码:g711
💻 CXX
字号:
/* * httpclnt.cxx * * HTTP Client class. * * Portable Windows Library * * Copyright (c) 1993-1998 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. * * Portions are Copyright (C) 1993 Free Software Foundation, Inc. * All Rights Reserved. * * Contributor(s): ______________________________________. * * $Log: httpclnt.cxx,v $ * Revision 1.20  1999/05/13 04:59:24  robertj * Increased amount of buffering on output request write. * * Revision 1.19  1999/05/11 12:23:52  robertj * Fixed bug introduced in last revision to have arbitrary HTTP commands, missing CRLF. * * Revision 1.18  1999/05/04 15:26:01  robertj * Improved HTTP/1.1 compatibility (pass through user commands). * Fixed problems with quicktime installer. * * Revision 1.17  1998/11/30 04:51:55  robertj * New directory structure * * Revision 1.16  1998/09/23 06:22:09  robertj * Added open source copyright license. * * Revision 1.15  1998/07/24 06:57:21  robertj * Fixed error returned on illegal URL passed to unopened socket. * Changed PostData function so just has string for data instead of dictionary. * * Revision 1.14  1998/06/16 03:32:56  robertj * Changed TCP connection shutdown to be parameterised. * * Revision 1.13  1998/06/13 15:03:58  robertj * More conditions for NOT shutting down write. * * Revision 1.12  1998/06/13 12:28:04  robertj * Added shutdown to client command if no content length specified. * * Revision 1.11  1998/04/14 03:42:41  robertj * Fixed error code propagation in HTTP client. * * Revision 1.10  1998/02/03 06:27:10  robertj * Fixed propagation of error codes, especially EOF. * Fixed writing to some CGI scripts that require CRLF outside of byte count. * * Revision 1.9  1998/01/26 00:39:00  robertj * Added function to allow HTTPClient to automatically connect if URL has hostname. * Fixed incorrect return values on HTTPClient GetDocument(), Post etc functions. * * Revision 1.8  1997/06/12 12:33:35  robertj * Fixed bug where mising MIME fields is regarded as an eror. * * Revision 1.7  1997/03/31 08:26:58  robertj * GNU compiler compatibilty. * * Revision 1.6  1997/03/28 04:40:46  robertj * Fixed bug in Post function doing wrong command. * * Revision 1.5  1997/03/18 22:04:03  robertj * Fix bug for binary POST commands. * * Revision 1.4  1996/12/21 01:26:21  robertj * Fixed bug in persistent connections when server closes socket during command. * * Revision 1.3  1996/12/12 09:24:44  robertj * Persistent connection support. * * Revision 1.2  1996/10/08 13:12:03  robertj * Fixed bug in HTTP/0.9 response, first 5 character not put back properly. * * Revision 1.1  1996/09/14 13:02:18  robertj * Initial revision * * 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 * */#include <ptlib.h>#include <ptlib/sockets.h>#include <ptclib/http.h>#include <ctype.h>//////////////////////////////////////////////////////////////////////////////// PHTTPClientPHTTPClient::PHTTPClient(){}int PHTTPClient::ExecuteCommand(Commands cmd,                                const PString & url,                                const PMIMEInfo & outMIME,                                const PString & dataBody,                                PMIMEInfo & replyMime,                                BOOL persist){  return ExecuteCommand(commandNames[cmd], url, outMIME, dataBody, replyMime, persist);}int PHTTPClient::ExecuteCommand(const PString & cmdName,                                const PString & url,                                const PMIMEInfo & outMIME,                                const PString & dataBody,                                PMIMEInfo & replyMime,                                BOOL persist){  if (WriteCommand(cmdName, url, outMIME, dataBody)) {    if (!persist)      Shutdown(ShutdownWrite);    ReadResponse(replyMime);  }  else {    lastResponseCode = -1;    lastResponseInfo = GetErrorText();  }  return lastResponseCode;}BOOL PHTTPClient::WriteCommand(Commands cmd,                               const PString & url,                               const PMIMEInfo & outMIME,                               const PString & dataBody){  return WriteCommand(commandNames[cmd], url, outMIME, dataBody);}BOOL PHTTPClient::WriteCommand(const PString & cmdName,                               const PString & url,                               const PMIMEInfo & outMIME,                               const PString & dataBody){  if (cmdName.IsEmpty())    *this << "GET";  else    *this << cmdName;  *this << ' ' << url << " HTTP/1.0\r\n"        << setfill('\r') << outMIME;  PINDEX len = dataBody.GetSize()-1;  if (!Write((const char *)dataBody, len))    return FALSE;  if (len < 2 || (dataBody[len-2] == '\r' && dataBody[len-1] == '\n'))    return TRUE;  return Write("\r\n", 2);}BOOL PHTTPClient::ReadResponse(PMIMEInfo & replyMIME){  BOOL bad = TRUE;  PString http = ReadString(7);  if (!http) {    UnRead(http);    if (http.Find("HTTP/") == P_MAX_INDEX) {      lastResponseCode = PHTTP::OK;      lastResponseInfo = "HTTP/0.9";      return TRUE;    }    if (http[0] == '\n')      ReadString(1);    else if (http[0] == '\r' &&  http[1] == '\n')      ReadString(2);    if (PHTTP::ReadResponse())      bad = FALSE;  }  if (bad) {    lastResponseCode = -1;    lastResponseInfo = GetErrorText();    if (lastResponseInfo.IsEmpty())      lastResponseInfo = "Remote shutdown";    return FALSE;  }  if (replyMIME.Read(*this))    return TRUE;  return lastError == NoError;}BOOL PHTTPClient::GetDocument(const PURL & url,                              PMIMEInfo & outMIME,                              PMIMEInfo & replyMIME,                              BOOL persist){  if (!AssureConnect(url, outMIME))    return FALSE;  return ExecuteCommand(GET, url.AsString(PURL::URIOnly), outMIME, PString(), replyMIME, persist) == OK;}BOOL PHTTPClient::GetHeader(const PURL & url,                            PMIMEInfo & outMIME,                            PMIMEInfo & replyMIME,                            BOOL persist){  if (!AssureConnect(url, outMIME))    return FALSE;  return ExecuteCommand(HEAD, url.AsString(PURL::URIOnly), outMIME, PString(), replyMIME, persist) == OK;}BOOL PHTTPClient::PostData(const PURL & url,                           PMIMEInfo & outMIME,                           const PString & data,                           PMIMEInfo & replyMIME,                           BOOL persist){  if (!AssureConnect(url, outMIME))    return FALSE;  return ExecuteCommand(POST, url.AsString(PURL::URIOnly), outMIME, data, replyMIME, persist) == OK;}BOOL PHTTPClient::AssureConnect(const PURL & url, PMIMEInfo & outMIME){  PString host = url.GetHostName();  if (!IsOpen()) {    if (host.IsEmpty()) {      lastResponseCode = BadRequest;      lastResponseInfo = "No host specified";      return FALSE;    }    if (!Connect(host, url.GetPort())) {      lastResponseCode = -2;      lastResponseInfo = GetErrorText();      return FALSE;    }  }  static char HostTag[] = "Host";  if (!outMIME.Contains(HostTag)) {    if (!host)      outMIME.SetAt(HostTag, host);    else {      PIPSocket * sock = GetSocket();      if (sock != NULL)        outMIME.SetAt(HostTag, sock->GetHostName());    }  }  return TRUE;}// End Of File ///////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -