* contrib\gtwvg\wvg3stat.prg
* contrib\gtwvg\wvgax.prg
* contrib\gtwvg\wvgcheck.prg
* contrib\gtwvg\wvgclass.prg
* contrib\gtwvg\wvgcombo.prg
* contrib\gtwvg\wvgcrt.prg
* contrib\gtwvg\wvgdarea.prg
* contrib\gtwvg\wvgdatar.prg
* contrib\gtwvg\wvgdlg.prg
* contrib\gtwvg\wvggenrc.prg
* contrib\gtwvg\wvghtmlv.prg
* contrib\gtwvg\wvglistb.prg
* contrib\gtwvg\wvgmenub.prg
* contrib\gtwvg\wvgmle.prg
* contrib\gtwvg\wvgpaint.prg
* contrib\gtwvg\wvgphdlr.prg
* contrib\gtwvg\wvgpushb.prg
* contrib\gtwvg\wvgradio.prg
* contrib\gtwvg\wvgscrlb.prg
* contrib\gtwvg\wvgsle.prg
* contrib\gtwvg\wvgstatb.prg
* contrib\gtwvg\wvgstatc.prg
* contrib\gtwvg\wvgsysw.prg
* contrib\gtwvg\wvgtabpg.prg
* contrib\gtwvg\wvgtoolb.prg
* contrib\gtwvg\wvgtreev.prg
* contrib\gtwvg\wvgwnd.prg
* contrib\hbblat\blatcls.prg
* contrib\hbblink\blinker.prg
* contrib\hbcomm\comm.prg
* contrib\hbct\ctmisc.prg
* contrib\hbct\ctrand.prg
* contrib\hbct\cttime.prg
* contrib\hbct\fcopy.prg
* contrib\hbct\getinfo.prg
* contrib\hbct\getinput.prg
* contrib\hbct\getsecrt.prg
* contrib\hbct\keysec.prg
* contrib\hbct\keytime.prg
* contrib\hbct\kxlat.prg
* contrib\hbct\screen3.prg
* contrib\hbct\scrmark.prg
* contrib\hbct\showtime.prg
* contrib\hbct\tempfile.prg
* contrib\hbfbird\tests\test.prg
* contrib\hbfbird\tfirebrd.prg
* contrib\hbgd\gd.prg
* contrib\hbgd\gdbar.prg
* contrib\hbgd\gdbarcod.prg
* contrib\hbgd\gdchart.prg
* contrib\hbmisc\calldll.prg
* contrib\hbmisc\hbedit.prg
* contrib\hbmisc\udpds.prg
* contrib\hbmysql\tmysql.prg
* contrib\hbmysql\tsqlbrw.prg
* contrib\hbodbc\browodbc.prg
* contrib\hbodbc\todbc.prg
* contrib\hbpgsql\tpostgre.prg
* contrib\hbqt\qtcore\hbqt_misc.prg
* contrib\hbrun\hbrun.prg
* contrib\hbsms\sms.prg
* contrib\hbsqlit3\hdbcsqlt.prg
* contrib\hbtip\cgi.prg
* contrib\hbtip\client.prg
* contrib\hbtip\encb64.prg
* contrib\hbtip\encoder.prg
* contrib\hbtip\ftpcli.prg
* contrib\hbtip\httpcli.prg
* contrib\hbtip\log.prg
* contrib\hbtip\mail.prg
* contrib\hbtip\popcli.prg
* contrib\hbtip\sendmail.prg
* contrib\hbtip\smtpcli.prg
* contrib\hbtip\thtml.prg
* contrib\hbtip\url.prg
* contrib\hbtpathy\telepath.prg
* contrib\hbwin\tests\testprn.prg
* contrib\hbwin\wce_sim.prg
* contrib\hbwin\win_os.prg
* contrib\hbwin\win_reg.prg
* contrib\hbwin\win_tbmp.prg
* contrib\hbwin\win_tprn.prg
* contrib\hbxbp\hbpprocess.prg
* contrib\hbxbp\xbp3state.prg
* contrib\hbxbp\xbpbrowse.prg
* contrib\hbxbp\xbpcheckbox.prg
* contrib\hbxbp\xbpcombobox.prg
* contrib\hbxbp\xbpcrt.prg
* contrib\hbxbp\xbpdataref.prg
* contrib\hbxbp\xbpdialog.prg
* contrib\hbxbp\xbpfiledialog.prg
* contrib\hbxbp\xbpfontdialog.prg
* contrib\hbxbp\xbpgeneric.prg
* contrib\hbxbp\xbpgra.prg
* contrib\hbxbp\xbphtmlviewer.prg
* contrib\hbxbp\xbplistbox.prg
* contrib\hbxbp\xbpmenubar.prg
* contrib\hbxbp\xbpmle.prg
* contrib\hbxbp\xbpparthandler.prg
* contrib\hbxbp\xbppresspace.prg
* contrib\hbxbp\xbpprintdialog.prg
* contrib\hbxbp\xbpprinter.prg
* contrib\hbxbp\xbppushbutton.prg
* contrib\hbxbp\xbpradiobutton.prg
* contrib\hbxbp\xbprtf.prg
* contrib\hbxbp\xbpscrollbar.prg
* contrib\hbxbp\xbpsle.prg
* contrib\hbxbp\xbpspinbutton.prg
* contrib\hbxbp\xbpstatic.prg
* contrib\hbxbp\xbpstatusbar.prg
* contrib\hbxbp\xbpstyle.prg
* contrib\hbxbp\xbptabpage.prg
* contrib\hbxbp\xbptoolbar.prg
* contrib\hbxbp\xbptreeview.prg
* contrib\hbxbp\xbpwindow.prg
* contrib\hbxpp\dbfuncsx.prg
* contrib\hbxpp\runshell.prg
* contrib\hbxpp\thfuncx.prg
* contrib\hbxpp\tthreadx.prg
* contrib\xhb\cstruct.prg
* contrib\xhb\dbgfx.prg
* contrib\xhb\dirrec.prg
* contrib\xhb\dumpvar.prg
* contrib\xhb\hbcomprs.prg
* contrib\xhb\hblog.prg
* contrib\xhb\hjwindow.prg
* contrib\xhb\hterrsys.prg
* contrib\xhb\htmutil.prg
* contrib\xhb\sprintf.prg
* contrib\xhb\tedit.prg
* contrib\xhb\tframe.prg
* contrib\xhb\thtm.prg
* contrib\xhb\trpc.prg
* contrib\xhb\trpccli.prg
* contrib\xhb\ttable.prg
* contrib\xhb\xcstr.prg
* contrib\xhb\xdbmodst.prg
* contrib\xhb\xhberr.prg
* contrib\xhb\xhbmemo.prg
* contrib\xhb\xhbmt.prg
* contrib\xhb\xhbtedit.prg
* contrib\xhb\xhbver.prg
* examples\guestbk\inifiles.prg
* examples\hbdoc2\genhtml.prg
* examples\hbdoc2\hbdoc2.prg
* examples\hbvpdf\hbvpdf.prg
* examples\hbvpdf\hbvpdft.prg
* examples\httpsrv\uhttpd.prg
* examples\rddado\adordd.prg
* IS*() macros converted to HB_IS*() function calls.
(using full uppercase to make them stand out)
% deleted '#include "common.ch"' where possible
234 lines
6.1 KiB
Plaintext
234 lines
6.1 KiB
Plaintext
/*
|
|
* $Id$
|
|
*/
|
|
|
|
/*
|
|
* xHarbour Project source code:
|
|
* TIP Class oriented Internet protocol library
|
|
*
|
|
* Copyright 2003 Giancarlo Niccolai <gian@niccolai.ws>
|
|
* www - http://harbour-project.org
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this software; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
|
|
*
|
|
* As a special exception, the Harbour Project gives permission for
|
|
* additional uses of the text contained in its release of Harbour.
|
|
*
|
|
* The exception is that, if you link the Harbour libraries with other
|
|
* files to produce an executable, this does not by itself cause the
|
|
* resulting executable to be covered by the GNU General Public License.
|
|
* Your use of that executable is in no way restricted on account of
|
|
* linking the Harbour library code into it.
|
|
*
|
|
* This exception does not however invalidate any other reasons why
|
|
* the executable file might be covered by the GNU General Public License.
|
|
*
|
|
* This exception applies only to the code released by the Harbour
|
|
* Project under the name Harbour. If you copy code from other
|
|
* Harbour Project or Free Software Foundation releases into a copy of
|
|
* Harbour, as the General Public License permits, the exception does
|
|
* not apply to the code that you add in this way. To avoid misleading
|
|
* anyone as to the status of such modified files, you must delete
|
|
* this exception notice from them.
|
|
*
|
|
* If you write modifications of your own for Harbour, it is your choice
|
|
* whether to permit this exception to apply to your modifications.
|
|
* If you do not wish that, delete this exception notice.
|
|
*
|
|
*/
|
|
|
|
#include "hbclass.ch"
|
|
|
|
/*
|
|
* An URL:
|
|
* http://gian:passwd@www.niccolai.ws/mypages/mysite/page.html?avar=0&avar1=1
|
|
* ^--^ ^--^ ^----^ ^-------------^ ^----------------------^ ^------------^
|
|
* cProto UID PWD cServer cPath cQuery
|
|
* ^------------^ ^-------^
|
|
* cDirectory cFile
|
|
* ^--^ ^--^
|
|
* cFname cExt
|
|
*/
|
|
|
|
CREATE CLASS tURL
|
|
VAR cAddress
|
|
VAR cProto
|
|
VAR cServer
|
|
VAR cPath
|
|
VAR cQuery
|
|
VAR cFile
|
|
VAR nPort
|
|
VAR cUserid
|
|
VAR cPassword
|
|
|
|
METHOD New( cUrl )
|
|
METHOD SetAddress( cUrl )
|
|
METHOD BuildAddress()
|
|
METHOD BuildQuery( )
|
|
METHOD AddGetForm( xPostData )
|
|
|
|
HIDDEN:
|
|
|
|
CLASSDATA cREuri INIT hb_regexComp("(?:(.*)://)?([^?/]*)(/[^?]*)?\??(.*)")
|
|
CLASSDATA cREServ INIT hb_regexComp("(?:([^:@]*):?([^@:]*)@|)([^:]+):?(.*)")
|
|
CLASSDATA cREFile INIT hb_regexComp("^((?:/.*/)|/)*(.*)$")
|
|
|
|
ENDCLASS
|
|
|
|
|
|
METHOD New( cUrl ) CLASS tURL
|
|
::SetAddress( cUrl )
|
|
RETURN Self
|
|
|
|
METHOD SetAddress( cUrl ) CLASS tURL
|
|
LOCAL aMatch, cServer, cPath
|
|
|
|
::cAddress := cUrl
|
|
::cProto := ""
|
|
::cUserid := ""
|
|
::cPassword := ""
|
|
::cServer := ""
|
|
::cPath := ""
|
|
::cQuery := ""
|
|
::cFile := ""
|
|
::nPort := -1
|
|
|
|
IF Empty( cUrl )
|
|
RETURN .T.
|
|
ENDIF
|
|
|
|
// TOPLEVEL url parsing
|
|
aMatch := hb_regex( ::cREuri, cUrl )
|
|
|
|
// May fail
|
|
IF Empty( aMatch )
|
|
RETURN .F.
|
|
ENDIF
|
|
|
|
::cProto := Lower( aMatch[ 2 ] )
|
|
cServer := aMatch[ 3 ]
|
|
cPath := aMatch[ 4 ]
|
|
::cQuery := aMatch[ 5 ]
|
|
|
|
// server parsing (can't fail)
|
|
aMatch := hb_regex( ::cREServ, cServer )
|
|
::cUserId := aMatch[ 2 ]
|
|
::cPassword := aMatch[ 3 ]
|
|
::cServer := aMatch[ 4 ]
|
|
::nPort := Val( aMatch[ 5 ] )
|
|
IF ::nPort < 1
|
|
::nPort := -1
|
|
ENDIF
|
|
|
|
// Parse path and file (can't fail)
|
|
aMatch := hb_regex( ::cREFile, cPath )
|
|
::cPath := aMatch[ 2 ]
|
|
::cFile := aMatch[ 3 ]
|
|
|
|
RETURN .T.
|
|
|
|
|
|
METHOD BuildAddress() CLASS tURL
|
|
LOCAL cRet := ""
|
|
|
|
IF ::cProto != NIL
|
|
::cProto := Lower( ::cProto )
|
|
ENDIF
|
|
|
|
IF ! Empty( ::cProto ) .AND. ! Empty( ::cServer )
|
|
cRet := ::cProto + "://"
|
|
ENDIF
|
|
|
|
IF ! Empty( ::cUserid )
|
|
cRet += ::cUserid
|
|
IF ! Empty( ::cPassword )
|
|
cRet += ":" + ::cPassword
|
|
ENDIF
|
|
cRet += "@"
|
|
ENDIF
|
|
|
|
IF ! Empty( ::cServer )
|
|
cRet += ::cServer
|
|
IF ::nPort > 0
|
|
cRet += ":" + hb_ntos( ::nPort )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF Len( ::cPath ) == 0 .OR. !( Right( ::cPath, 1 ) == "/" )
|
|
::cPath += "/"
|
|
ENDIF
|
|
|
|
cRet += ::cPath + ::cFile
|
|
IF ! Empty( ::cQuery )
|
|
cRet += "?" + ::cQuery
|
|
ENDIF
|
|
|
|
IF Len( cRet ) == 0
|
|
cRet := NIL
|
|
ELSE
|
|
::cAddress := cRet
|
|
ENDIF
|
|
|
|
RETURN cRet
|
|
|
|
METHOD BuildQuery() CLASS tURL
|
|
LOCAL cLine
|
|
|
|
IF Len( ::cPath ) == 0 .OR. !( Right( ::cPath, 1 ) == "/" )
|
|
::cPath += "/"
|
|
ENDIF
|
|
|
|
cLine := ::cPath + ::cFile
|
|
IF ! Empty( ::cQuery )
|
|
cLine += "?" + ::cQuery
|
|
ENDIF
|
|
|
|
RETURN cLine
|
|
|
|
METHOD AddGetForm( xPostData )
|
|
LOCAL cData := ""
|
|
LOCAL nI
|
|
LOCAL y
|
|
LOCAL cRet
|
|
|
|
IF HB_ISHASH( xPostData )
|
|
y := Len( xPostData )
|
|
FOR nI := 1 TO y
|
|
cData += tip_URLEncode( AllTrim( hb_CStr( hb_HKeyAt( xPostData, nI ) ) ) ) + "="
|
|
cData += tip_URLEncode( AllTrim( hb_CStr( hb_HValueAt( xPostData, nI ) ) ) )
|
|
IF nI != y
|
|
cData += "&"
|
|
ENDIF
|
|
NEXT
|
|
ELSEIF HB_ISARRAY( xPostData )
|
|
y := Len( xPostData )
|
|
FOR nI := 1 TO y
|
|
cData += tip_URLEncode( AllTrim( hb_CStr( xPostData[ nI, 1 ] ) ) ) + "="
|
|
cData += tip_URLEncode( AllTrim( hb_CStr( xPostData[ nI, 2 ] ) ) )
|
|
IF nI != y
|
|
cData += "&"
|
|
ENDIF
|
|
NEXT
|
|
ELSEIF HB_ISSTRING( xPostData )
|
|
cData := xPostData
|
|
ENDIF
|
|
|
|
IF ! Empty( cData )
|
|
cRet := ::cQuery += iif( Empty( ::cQuery ), "", "&" ) + cData
|
|
ENDIF
|
|
|
|
RETURN cRet
|