2010-11-24 01:48 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* examples/uhttpd2/umain.prg
* examples/uhttpd2/uhttpd2.hbp
* examples/uhttpd2/uwidgets.prg
- examples/uhttpd2/uhbext.prg
* Formatting.
* Cleanups.
* examples/httpsrv/uhttpd.prg
* Formatting.
* doc/en/garbage.txt
* Applied patch from Tamas.
This commit is contained in:
@@ -16,6 +16,20 @@
|
||||
The license applies to all entries newer than 2009-04-28.
|
||||
*/
|
||||
|
||||
2010-11-24 01:48 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* examples/uhttpd2/umain.prg
|
||||
* examples/uhttpd2/uhttpd2.hbp
|
||||
* examples/uhttpd2/uwidgets.prg
|
||||
- examples/uhttpd2/uhbext.prg
|
||||
* Formatting.
|
||||
* Cleanups.
|
||||
|
||||
* examples/httpsrv/uhttpd.prg
|
||||
* Formatting.
|
||||
|
||||
* doc/en/garbage.txt
|
||||
* Applied patch from Tamas.
|
||||
|
||||
2010-11-24 01:09 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* examples/uhttpd2/uhttpd2.hbp
|
||||
* Converted uhttpd2 core to a lib.
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
* $TEMPLATE$
|
||||
* Function
|
||||
* $NAME$
|
||||
* hb_gcAlloc()
|
||||
* hb_gcFree()
|
||||
* $CATEGORY$
|
||||
* API
|
||||
* $SUBCATEGORY$
|
||||
@@ -190,7 +190,7 @@
|
||||
* $TEMPLATE$
|
||||
* Function
|
||||
* $NAME$
|
||||
* hb_gcAlloc()
|
||||
* hb_gcCollectAll()
|
||||
* $CATEGORY$
|
||||
* API
|
||||
* $SUBCATEGORY$
|
||||
@@ -225,7 +225,7 @@
|
||||
* $TEMPLATE$
|
||||
* Function
|
||||
* $NAME$
|
||||
* hb_gcAlloc()
|
||||
* hb_gcItemRef()
|
||||
* $CATEGORY$
|
||||
* API
|
||||
* $SUBCATEGORY$
|
||||
@@ -269,7 +269,7 @@
|
||||
* $TEMPLATE$
|
||||
* Procedure
|
||||
* $NAME$
|
||||
* hb_gcAlloc()
|
||||
* HB_GCALL()
|
||||
* $CATEGORY$
|
||||
* API
|
||||
* $SUBCATEGORY$
|
||||
|
||||
@@ -1809,13 +1809,13 @@ FUNCTION uhttpd_join( cSeparator, aData )
|
||||
LOCAL cRet := "", nI
|
||||
|
||||
FOR nI := 1 TO LEN( aData )
|
||||
IF nI > 1; cRet += cSeparator
|
||||
ENDIF
|
||||
IF VALTYPE(aData[nI]) $ "CM"; cRet += aData[nI]
|
||||
ELSEIF VALTYPE(aData[nI]) == "N"; cRet += LTRIM(STR(aData[nI]))
|
||||
ELSEIF VALTYPE(aData[nI]) == "D"; cRet += IF(!EMPTY(aData[nI]), DTOC(aData[nI]), "")
|
||||
ELSE
|
||||
ENDIF
|
||||
IF nI > 1; cRet += cSeparator
|
||||
ENDIF
|
||||
IF VALTYPE(aData[nI]) $ "CM"; cRet += aData[nI]
|
||||
ELSEIF VALTYPE(aData[nI]) == "N"; cRet += LTRIM(STR(aData[nI]))
|
||||
ELSEIF VALTYPE(aData[nI]) == "D"; cRet += IF(!EMPTY(aData[nI]), DTOC(aData[nI]), "")
|
||||
ELSE
|
||||
ENDIF
|
||||
NEXT
|
||||
RETURN cRet
|
||||
|
||||
@@ -1987,7 +1987,7 @@ STATIC PROCEDURE Define_Env( hmServer )
|
||||
LOCAL v
|
||||
|
||||
FOR EACH v IN hmServer
|
||||
hb_SetEnv( v:__enumKey(), v )
|
||||
hb_SetEnv( v:__enumKey(), v )
|
||||
NEXT
|
||||
|
||||
RETURN
|
||||
@@ -2751,70 +2751,68 @@ STATIC FUNCTION Handler_CgiScript( cFileName )
|
||||
RETURN MakeResponse()
|
||||
|
||||
STATIC FUNCTION LoadMimeTypes()
|
||||
LOCAL hMimeTypes
|
||||
// TODO: load mime types from file
|
||||
hMimeTypes := { ;
|
||||
"css" => "text/css" ,;
|
||||
"htm" => "text/html" ,;
|
||||
"html" => "text/html" ,;
|
||||
"txt" => "text/plain" ,;
|
||||
"text" => "text/plain" ,;
|
||||
"asc" => "text/plain" ,;
|
||||
"c" => "text/plain" ,;
|
||||
"h" => "text/plain" ,;
|
||||
"cpp" => "text/plain" ,;
|
||||
"hpp" => "text/plain" ,;
|
||||
"log" => "text/plain" ,;
|
||||
"rtf" => "text/rtf" ,;
|
||||
"xml" => "text/xml" ,;
|
||||
"xsl" => "text/xsl" ,;
|
||||
"bmp" => "image/bmp" ,;
|
||||
"gif" => "image/gif" ,;
|
||||
"jpg" => "image/jpeg" ,;
|
||||
"jpe" => "image/jpeg" ,;
|
||||
"jpeg" => "image/jpeg" ,;
|
||||
"png" => "image/png" ,;
|
||||
"tif" => "image/tiff" ,;
|
||||
"tiff" => "image/tiff" ,;
|
||||
"djv" => "image/vnd.djvu" ,;
|
||||
"djvu" => "image/vnd.djvu" ,;
|
||||
"ico" => "image/x-icon" ,;
|
||||
"xls" => "application/excel" ,;
|
||||
"doc" => "application/msword" ,;
|
||||
"pdf" => "application/pdf" ,;
|
||||
"ps" => "application/postscript" ,;
|
||||
"eps" => "application/postscript" ,;
|
||||
"ppt" => "application/powerpoint" ,;
|
||||
"bz2" => "application/x-bzip2" ,;
|
||||
"gz" => "application/x-gzip" ,;
|
||||
"tgz" => "application/x-gtar" ,;
|
||||
"js" => "application/x-javascript" ,;
|
||||
"tar" => "application/x-tar" ,;
|
||||
"tex" => "application/x-tex" ,;
|
||||
"zip" => "application/zip" ,;
|
||||
"midi" => "audio/midi" ,;
|
||||
"mp3" => "audio/mpeg" ,;
|
||||
"wav" => "audio/x-wav" ,;
|
||||
"qt" => "video/quicktime" ,;
|
||||
"mov" => "video/quicktime" ,;
|
||||
"avi" => "video/x-msvideo" ;
|
||||
}
|
||||
RETURN hMimeTypes
|
||||
RETURN { ;
|
||||
"css" => "text/css" ,;
|
||||
"htm" => "text/html" ,;
|
||||
"html" => "text/html" ,;
|
||||
"txt" => "text/plain" ,;
|
||||
"text" => "text/plain" ,;
|
||||
"asc" => "text/plain" ,;
|
||||
"c" => "text/plain" ,;
|
||||
"h" => "text/plain" ,;
|
||||
"cpp" => "text/plain" ,;
|
||||
"hpp" => "text/plain" ,;
|
||||
"log" => "text/plain" ,;
|
||||
"rtf" => "text/rtf" ,;
|
||||
"xml" => "text/xml" ,;
|
||||
"xsl" => "text/xsl" ,;
|
||||
"bmp" => "image/bmp" ,;
|
||||
"gif" => "image/gif" ,;
|
||||
"jpg" => "image/jpeg" ,;
|
||||
"jpe" => "image/jpeg" ,;
|
||||
"jpeg" => "image/jpeg" ,;
|
||||
"png" => "image/png" ,;
|
||||
"tif" => "image/tiff" ,;
|
||||
"tiff" => "image/tiff" ,;
|
||||
"djv" => "image/vnd.djvu" ,;
|
||||
"djvu" => "image/vnd.djvu" ,;
|
||||
"ico" => "image/x-icon" ,;
|
||||
"xls" => "application/excel" ,;
|
||||
"doc" => "application/msword" ,;
|
||||
"pdf" => "application/pdf" ,;
|
||||
"ps" => "application/postscript" ,;
|
||||
"eps" => "application/postscript" ,;
|
||||
"ppt" => "application/powerpoint" ,;
|
||||
"bz2" => "application/x-bzip2" ,;
|
||||
"gz" => "application/x-gzip" ,;
|
||||
"tgz" => "application/x-gtar" ,;
|
||||
"js" => "application/x-javascript" ,;
|
||||
"tar" => "application/x-tar" ,;
|
||||
"tex" => "application/x-tex" ,;
|
||||
"zip" => "application/zip" ,;
|
||||
"midi" => "audio/midi" ,;
|
||||
"mp3" => "audio/mpeg" ,;
|
||||
"wav" => "audio/x-wav" ,;
|
||||
"qt" => "video/quicktime" ,;
|
||||
"mov" => "video/quicktime" ,;
|
||||
"avi" => "video/x-msvideo" }
|
||||
|
||||
STATIC FUNCTION GT_notifier( nEvent, xParams )
|
||||
LOCAL nReturn := 0
|
||||
DO CASE
|
||||
LOCAL nReturn := 0
|
||||
|
||||
DO CASE
|
||||
CASE nEvent == HB_GTE_CLOSE
|
||||
IF hb_mutexLock( s_hmtxBusy )
|
||||
s_lQuitRequest := TRUE
|
||||
nReturn := 1
|
||||
hb_mutexUnlock( s_hmtxBusy )
|
||||
ENDIF
|
||||
ENDCASE
|
||||
IF hb_mutexLock( s_hmtxBusy )
|
||||
s_lQuitRequest := TRUE
|
||||
nReturn := 1
|
||||
hb_mutexUnlock( s_hmtxBusy )
|
||||
ENDIF
|
||||
ENDCASE
|
||||
|
||||
HB_SYMBOL_UNUSED( xParams )
|
||||
HB_SYMBOL_UNUSED( xParams )
|
||||
|
||||
RETURN nReturn
|
||||
RETURN nReturn
|
||||
|
||||
STATIC FUNCTION UHTTPD_UTCOFFSET()
|
||||
LOCAL nOffset := HB_UTCOFFSET()
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/************************************************************
|
||||
*
|
||||
* Functions candidates to be a part of Harbour's core or RTL
|
||||
*
|
||||
*************************************************************/
|
||||
|
||||
FUNCTION split( cSeparator, cString )
|
||||
|
||||
LOCAL aRet := {}
|
||||
LOCAL nI
|
||||
|
||||
DO WHILE ( nI := At( cSeparator, cString ) ) > 0
|
||||
AAdd( aRet, Left( cString, nI - 1 ) )
|
||||
cString := SubStr( cString, nI + Len( cSeparator ) )
|
||||
ENDDO
|
||||
AAdd( aRet, cString )
|
||||
|
||||
RETURN aRet
|
||||
|
||||
FUNCTION join( cSeparator, aData )
|
||||
|
||||
LOCAL cRet := ""
|
||||
LOCAL nI
|
||||
|
||||
FOR nI := 1 TO Len( aData )
|
||||
|
||||
IF nI > 1
|
||||
cRet += cSeparator
|
||||
ENDIF
|
||||
|
||||
IF ValType( aData[ nI ] ) $ "CM" ; cRet += aData[ nI ]
|
||||
ELSEIF ValType( aData[ nI ] ) == "N" ; cRet += hb_ntos( aData[ nI ] )
|
||||
ELSEIF ValType( aData[ nI ] ) == "D" ; cRet += iif( ! Empty( aData[ nI ] ), DToC( aData[ nI ] ), "" )
|
||||
ELSE
|
||||
ENDIF
|
||||
NEXT
|
||||
|
||||
RETURN cRet
|
||||
@@ -9,6 +9,5 @@
|
||||
|
||||
-w3 -es2
|
||||
|
||||
uhbext.prg
|
||||
umain.prg
|
||||
uwidgets.prg
|
||||
|
||||
@@ -32,18 +32,18 @@ MEMVAR server, get, post, cookie, session
|
||||
|
||||
|
||||
CREATE CLASS UHttpd
|
||||
// Settings
|
||||
/* Settings */
|
||||
DATA nPort INIT 80
|
||||
DATA cBindAddress INIT "0.0.0.0"
|
||||
DATA cAccessLog INIT "uhttpd_access.log"
|
||||
DATA cErrorLog INIT "uhttpd_error.log"
|
||||
DATA bIdle INIT { || NIL }
|
||||
DATA bIdle INIT {|| NIL }
|
||||
DATA aMount INIT { => }
|
||||
|
||||
// Results
|
||||
/* Results */
|
||||
DATA cError INIT ""
|
||||
|
||||
// Private
|
||||
/* Private */
|
||||
DATA hAccessLog
|
||||
DATA hErrorLog
|
||||
|
||||
@@ -59,7 +59,7 @@ CREATE CLASS UHttpd
|
||||
METHOD RUN()
|
||||
METHOD Stop()
|
||||
|
||||
// Private
|
||||
/* Private */
|
||||
METHOD LogAccess()
|
||||
METHOD LogError( cError )
|
||||
|
||||
@@ -160,12 +160,12 @@ METHOD RUN() CLASS UHttpd
|
||||
ENDDO
|
||||
hb_socketClose( Self:hListen )
|
||||
|
||||
// End child threads
|
||||
/* End child threads */
|
||||
hb_mutexLock( Self:hmtxSession )
|
||||
HB_HEVAL( Self:aSession, { |k, v| hb_mutexNotify( v[2], NIL ), HB_SYMBOL_UNUSED( k ) } )
|
||||
HB_HEVAL( Self:aSession, {|k, v| hb_mutexNotify( v[2], NIL ), HB_SYMBOL_UNUSED( k ) } )
|
||||
hb_mutexUnlock( Self:hmtxSession )
|
||||
AEval( aThreads, { || hb_mutexNotify( Self:hmtxQueue, NIL ) } )
|
||||
AEval( aThreads, { |h| hb_threadJoin( h ) } )
|
||||
AEval( aThreads, {|| hb_mutexNotify( Self:hmtxQueue, NIL ) } )
|
||||
AEval( aThreads, {|h| hb_threadJoin( h ) } )
|
||||
|
||||
FClose( Self:hErrorLog )
|
||||
FClose( Self:hAccessLog )
|
||||
@@ -370,7 +370,7 @@ STATIC FUNCTION ProcessRequest( oServer, hSocket, cBuffer )
|
||||
t_aHeader := {}
|
||||
t_nStatusCode := 200
|
||||
t_lSessionDestroy := .F.
|
||||
BEGIN SEQUENCE WITH { |oErr| UErrorHandler( oErr, oServer ) }
|
||||
BEGIN SEQUENCE WITH {|oErr| UErrorHandler( oErr, oServer ) }
|
||||
Eval( bEval, cPath )
|
||||
RECOVER
|
||||
USetStatusCode( 500 )
|
||||
@@ -448,7 +448,7 @@ STATIC FUNCTION ProcessRequest( oServer, hSocket, cBuffer )
|
||||
RETURN .F.
|
||||
ELSE
|
||||
/* not sessioned */
|
||||
BEGIN SEQUENCE WITH { |oErr| UErrorHandler( oErr, oServer ) }
|
||||
BEGIN SEQUENCE WITH {|oErr| UErrorHandler( oErr, oServer ) }
|
||||
Eval( bEval, cPath )
|
||||
RECOVER
|
||||
USetStatusCode( 500 )
|
||||
@@ -464,8 +464,8 @@ STATIC FUNCTION ParseRequestHeader( cRequest )
|
||||
|
||||
LOCAL aRequest, aLine, nI, nJ, cI, nK, nContentLength := 0
|
||||
|
||||
aRequest := split( CR_LF, cRequest )
|
||||
aLine := split( " ", aRequest[1] )
|
||||
aRequest := uhttpd_split( CR_LF, cRequest )
|
||||
aLine := uhttpd_split( " ", aRequest[1] )
|
||||
|
||||
server["REQUEST_ALL"] := aRequest[1]
|
||||
IF Len( aLine ) == 3 .AND. Left( aLine[3], 5 ) == "HTTP/"
|
||||
@@ -511,25 +511,25 @@ STATIC FUNCTION ParseRequestHeader( cRequest )
|
||||
SWITCH Upper( Left( aRequest[nI], nJ - 1 ) )
|
||||
CASE "COOKIE"
|
||||
IF ( nK := At( ";", cI ) ) == 0
|
||||
nK := Len( Trim( cI ) )
|
||||
nK := Len( RTrim( cI ) )
|
||||
ENDIF
|
||||
cI := Left( cI, nK )
|
||||
IF ( nK := At( "=", cI ) ) > 0
|
||||
/* cookie names are case insensitive, uppercase it */
|
||||
cookie[UPPER(LEFT(cI, nK - 1))] := SubStr( cI, nK + 1 )
|
||||
cookie[ UPPER( LEFT( cI, nK - 1 ) ) ] := SubStr( cI, nK + 1 )
|
||||
ENDIF
|
||||
EXIT
|
||||
CASE "CONTENT-LENGTH"
|
||||
nContentLength := Val( cI )
|
||||
EXIT
|
||||
OTHERWISE
|
||||
server["HTTP_" + STRTRAN(UPPER(LEFT(aRequest[nI], nJ - 1 ) ), "-", "_" )] := cI
|
||||
server[ "HTTP_" + STRTRAN( UPPER( LEFT( aRequest[nI], nJ - 1 ) ), "-", "_" ) ] := cI
|
||||
EXIT
|
||||
ENDSWITCH
|
||||
ENDIF
|
||||
NEXT
|
||||
IF !( server["QUERY_STRING"] == "" )
|
||||
FOR EACH cI IN split( "&", server["QUERY_STRING"] )
|
||||
FOR EACH cI IN uhttpd_split( "&", server["QUERY_STRING"] )
|
||||
IF ( nI := At( "=", cI ) ) > 0
|
||||
get[UUrlDecode(LEFT(cI, nI - 1))] := UUrlDecode( SubStr( cI, nI + 1 ) )
|
||||
ELSE
|
||||
@@ -546,7 +546,7 @@ STATIC FUNCTION ParseRequestBody( cRequest )
|
||||
LOCAL nI, cPart
|
||||
|
||||
IF server["HTTP_CONTENT_TYPE"] == "application/x-www-form-urlencoded"
|
||||
FOR EACH cPart IN split( "&", cRequest )
|
||||
FOR EACH cPart IN uhttpd_split( "&", cRequest )
|
||||
IF ( nI := At( "=", cPart ) ) > 0
|
||||
post[UUrlDecode(LEFT(cPart, nI - 1))] := UUrlDecode( SubStr( cPart, nI + 1 ) )
|
||||
ELSE
|
||||
@@ -628,7 +628,7 @@ STATIC FUNCTION MakeResponse()
|
||||
ENDSWITCH
|
||||
cRet += CR_LF
|
||||
UAddHeader( "Content-Length", hb_ntos( Len( t_cResult ) ) )
|
||||
AEval( t_aHeader, { |x| cRet += x[1] + ": " + x[2] + CR_LF } )
|
||||
AEval( t_aHeader, {|x| cRet += x[1] + ": " + x[2] + CR_LF } )
|
||||
cRet += CR_LF
|
||||
? cRet
|
||||
cRet += t_cResult
|
||||
@@ -708,9 +708,9 @@ STATIC FUNCTION GetErrorDesc( oErr )
|
||||
ENDIF
|
||||
IF !Empty( oErr:osCode ); cRet += "OS error: " + hb_ntos( oErr:osCode ) + hb_eol()
|
||||
ENDIF
|
||||
IF ValType( oErr:args ) == "A"
|
||||
IF hb_isArray( oErr:args )
|
||||
cRet += "Arguments:" + hb_eol()
|
||||
AEval( oErr:args, { |X, Y| cRet += Str( Y, 5 ) + ": " + HB_CStr( X ) + hb_eol() } )
|
||||
AEval( oErr:args, {|X, Y| cRet += Str( Y, 5 ) + ": " + HB_CStr( X ) + hb_eol() } )
|
||||
ENDIF
|
||||
cRet += hb_eol()
|
||||
|
||||
@@ -731,13 +731,13 @@ STATIC FUNCTION GetErrorDesc( oErr )
|
||||
cRet += "Database areas:" + hb_eol()
|
||||
cRet += " Current: " + hb_ntos( Select() ) + " " + Alias() + hb_eol()
|
||||
|
||||
BEGIN SEQUENCE WITH { |o| BREAK( o ) }
|
||||
BEGIN SEQUENCE WITH {|o| BREAK( o ) }
|
||||
IF !Empty( Alias() )
|
||||
cRet += " Filter: " + dbFilter() + hb_eol()
|
||||
cRet += " Relation: " + dbRelation() + hb_eol()
|
||||
cRet += " Index expression: " + OrdKey( OrdSetFocus() ) + hb_eol()
|
||||
cRet += hb_eol()
|
||||
BEGIN SEQUENCE WITH { |o| BREAK( o ) }
|
||||
BEGIN SEQUENCE WITH {|o| BREAK( o ) }
|
||||
FOR nI := 1 TO FCount()
|
||||
cRet += Str( nI, 6 ) + " " + PadR( FieldName( nI ), 14 ) + ": " + HB_VALTOEXP( FieldGet( nI ) ) + hb_eol()
|
||||
NEXT
|
||||
@@ -751,7 +751,7 @@ STATIC FUNCTION GetErrorDesc( oErr )
|
||||
END SEQUENCE
|
||||
|
||||
FOR nI := 1 TO 250
|
||||
BEGIN SEQUENCE WITH { |o| BREAK( o ) }
|
||||
BEGIN SEQUENCE WITH {|o| BREAK( o ) }
|
||||
IF ! Empty( Alias( nI ) )
|
||||
dbSelectArea( nI )
|
||||
cRet += Str( nI, 6 ) + " " + rddName() + " " + PadR( Alias(), 15 ) + ;
|
||||
@@ -799,7 +799,7 @@ FUNCTION UGetHeader( cType )
|
||||
|
||||
LOCAL nI
|
||||
|
||||
IF ( nI := ASCAN( t_aHeader, { |x| Upper(x[1] ) == Upper(cType ) } ) ) > 0
|
||||
IF ( nI := ASCAN( t_aHeader, {|x| Upper(x[1] ) == Upper(cType ) } ) ) > 0
|
||||
RETURN t_aHeader[nI, 2]
|
||||
ENDIF
|
||||
|
||||
@@ -809,7 +809,7 @@ PROCEDURE UAddHeader( cType, cValue )
|
||||
|
||||
LOCAL nI
|
||||
|
||||
IF ( nI := ASCAN( t_aHeader, { |x| Upper(x[1] ) == Upper(cType ) } ) ) > 0
|
||||
IF ( nI := ASCAN( t_aHeader, {|x| Upper(x[1] ) == Upper(cType ) } ) ) > 0
|
||||
t_aHeader[nI, 2] := cValue
|
||||
ELSE
|
||||
AAdd( t_aHeader, { cType, cValue } )
|
||||
@@ -986,7 +986,7 @@ PROCEDURE UProcFiles( cFileName, lIndex )
|
||||
RETURN
|
||||
ENDIF
|
||||
IF ASCAN( { "index.html", "index.htm" }, ;
|
||||
{ |x| iif( HB_FileExists( UOSFileName(cFileName + X ) ), ( cFileName += X, .T. ), .F. ) } ) > 0
|
||||
{|x| iif( HB_FileExists( UOSFileName(cFileName + X ) ), ( cFileName += X, .T. ), .F. ) } ) > 0
|
||||
UAddHeader( "Content-Type", "text/html" )
|
||||
UWrite( HB_MEMOREAD( UOsFileName(cFileName ) ) )
|
||||
RETURN
|
||||
@@ -1001,17 +1001,17 @@ PROCEDURE UProcFiles( cFileName, lIndex )
|
||||
aDir := Directory( UOsFileName( cFileName ), "D" )
|
||||
IF HB_HHasKey( get, "s" )
|
||||
IF get["s"] == "s"
|
||||
ASort( aDir, , , { |X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
|
||||
ASort( aDir, , , {|X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
|
||||
iif( Y[5] == "D", .F. , X[2] < Y[2] ) ) } )
|
||||
ELSEIF get["s"] == "m"
|
||||
ASort( aDir, , , { |X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
|
||||
ASort( aDir, , , {|X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
|
||||
iif( Y[5] == "D", .F. , DToS( X[3] ) + X[4] < DToS( Y[3] ) + Y[4] ) ) } )
|
||||
ELSE
|
||||
ASort( aDir, , , { |X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
|
||||
ASort( aDir, , , {|X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
|
||||
iif( Y[5] == "D", .F. , X[1] < Y[1] ) ) } )
|
||||
ENDIF
|
||||
ELSE
|
||||
ASort( aDir, , , { |X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
|
||||
ASort( aDir, , , {|X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
|
||||
iif( Y[5] == "D", .F. , X[1] < Y[1] ) ) } )
|
||||
ENDIF
|
||||
|
||||
@@ -1050,28 +1050,61 @@ PROCEDURE UProcInfo()
|
||||
|
||||
UWrite( '<h2>Capabilities</h2>' )
|
||||
UWrite( '<table border=1 cellspacing=0>' )
|
||||
UWrite( '<tr><td>RDD</td><td>' + UHtmlEncode( join(", ", rddList() ) ) + '</td></tr>' )
|
||||
UWrite( '<tr><td>RDD</td><td>' + UHtmlEncode( uhttpd_join(", ", rddList() ) ) + '</td></tr>' )
|
||||
UWrite( '</table>' )
|
||||
|
||||
UWrite( '<h2>Variables</h2>' )
|
||||
|
||||
UWrite( '<h3>server</h3>' )
|
||||
UWrite( '<table border=1 cellspacing=0>' )
|
||||
HB_HEval( server, { |k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
|
||||
HB_HEval( server, {|k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
|
||||
UWrite( '</table>' )
|
||||
|
||||
IF !Empty( get )
|
||||
UWrite( '<h3>get</h3>' )
|
||||
UWrite( '<table border=1 cellspacing=0>' )
|
||||
HB_HEval( get, { |k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
|
||||
HB_HEval( get, {|k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
|
||||
UWrite( '</table>' )
|
||||
ENDIF
|
||||
|
||||
IF !Empty( post )
|
||||
UWrite( '<h3>post</h3>' )
|
||||
UWrite( '<table border=1 cellspacing=0>' )
|
||||
HB_HEval( post, { |k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
|
||||
HB_HEval( post, {|k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
|
||||
UWrite( '</table>' )
|
||||
ENDIF
|
||||
|
||||
RETURN
|
||||
|
||||
FUNCTION uhttpd_split( cSeparator, cString )
|
||||
|
||||
LOCAL aRet := {}
|
||||
LOCAL nI
|
||||
|
||||
DO WHILE ( nI := At( cSeparator, cString ) ) > 0
|
||||
AAdd( aRet, Left( cString, nI - 1 ) )
|
||||
cString := SubStr( cString, nI + Len( cSeparator ) )
|
||||
ENDDO
|
||||
AAdd( aRet, cString )
|
||||
|
||||
RETURN aRet
|
||||
|
||||
FUNCTION uhttpd_join( cSeparator, aData )
|
||||
|
||||
LOCAL cRet := ""
|
||||
LOCAL nI
|
||||
|
||||
FOR nI := 1 TO Len( aData )
|
||||
|
||||
IF nI > 1
|
||||
cRet += cSeparator
|
||||
ENDIF
|
||||
|
||||
IF ValType( aData[ nI ] ) $ "CM" ; cRet += aData[ nI ]
|
||||
ELSEIF ValType( aData[ nI ] ) == "N" ; cRet += hb_ntos( aData[ nI ] )
|
||||
ELSEIF ValType( aData[ nI ] ) == "D" ; cRet += iif( ! Empty( aData[ nI ] ), DToC( aData[ nI ] ), "" )
|
||||
ELSE
|
||||
ENDIF
|
||||
NEXT
|
||||
|
||||
RETURN cRet
|
||||
|
||||
@@ -33,7 +33,7 @@ METHOD Paint() CLASS UWMain
|
||||
UWrite( '<meta http-equiv="content-type" content="text/html; charset=windows-1257">' )
|
||||
UWrite( '<script language="javascript" src="/files/main.js"></script>' )
|
||||
UWrite( '<body>' )
|
||||
AEval( Self:aChilds, { |x| X:Paint() } )
|
||||
AEval( Self:aChilds, {|x| X:Paint() } )
|
||||
UWrite( '</body></html>' )
|
||||
|
||||
RETURN Self
|
||||
@@ -70,7 +70,7 @@ METHOD Paint() CLASS UWLayoutGrid
|
||||
UWrite( '<tr>' )
|
||||
FOR EACH aCell IN aRow
|
||||
UWrite( '<td>' )
|
||||
AEval( aCell, { |o| o:Paint() } )
|
||||
AEval( aCell, {|o| o:Paint() } )
|
||||
UWrite( '</td>' )
|
||||
NEXT
|
||||
UWrite( '</tr>' )
|
||||
@@ -94,7 +94,7 @@ METHOD Add( oWidget, nRow, nCol ) CLASS UWLayoutGrid
|
||||
ENDIF
|
||||
IF nCol > Len( Self:aChilds[1] )
|
||||
FOR nI := Len( Self:aChilds[1] ) + 1 TO nCol
|
||||
AEval( Self:aChilds, { |x| AAdd( x, {} ) } )
|
||||
AEval( Self:aChilds, {|x| AAdd( x, {} ) } )
|
||||
NEXT
|
||||
ENDIF
|
||||
AAdd( Self:aChilds[nRow, nCol], oWidget )
|
||||
@@ -185,7 +185,7 @@ METHOD Add( oWidget ) CLASS UWForm
|
||||
METHOD Paint() CLASS UWForm
|
||||
|
||||
UWrite( '<form action="' + Self:cAction + '" method="' + Self:cMethod + '">' )
|
||||
AEval( Self:aChilds, { |x| X:Paint() } )
|
||||
AEval( Self:aChilds, {|x| X:Paint() } )
|
||||
UWrite( '</form>' )
|
||||
|
||||
RETURN Self
|
||||
@@ -498,7 +498,7 @@ PROCEDURE UProcWidgets( cURL, aMap )
|
||||
session["_ustack"] := aStack := {}
|
||||
ENDIF
|
||||
|
||||
aURL := split( "/", cURL )
|
||||
aURL := uhttpd_split( "/", cURL )
|
||||
nI := 1
|
||||
nL := Min( Len( aURL ), Len( aStack ) )
|
||||
DO WHILE nI <= nL
|
||||
@@ -524,7 +524,7 @@ PROCEDURE UProcWidgets( cURL, aMap )
|
||||
lRet := .T.
|
||||
// Enter procedures
|
||||
DO WHILE nI <= Len( aURL )
|
||||
cI := join( "/", ASize( AClone(aURL ), nI ) )
|
||||
cI := uhttpd_join( "/", ASize( AClone(aURL ), nI ) )
|
||||
IF HB_HHasKey( aMap, cI )
|
||||
session["_uthis"] := { "idhash" => { => } }
|
||||
IF ( lRet := Eval( aMap[cI], "INIT" ) ) == .T.
|
||||
|
||||
Reference in New Issue
Block a user