summaryrefslogtreecommitdiffstats
path: root/cpp/sca/modules/http
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/sca/modules/http')
-rw-r--r--cpp/sca/modules/http/Makefile.am37
-rw-r--r--cpp/sca/modules/http/conf/mime.types607
-rw-r--r--cpp/sca/modules/http/curl-test.cpp253
-rw-r--r--cpp/sca/modules/http/curl.hpp348
-rw-r--r--cpp/sca/modules/http/htdocs/entry.xml2
-rw-r--r--cpp/sca/modules/http/htdocs/feed.xml2
-rw-r--r--cpp/sca/modules/http/htdocs/index.html21
-rw-r--r--cpp/sca/modules/http/htdocs/json-request.txt1
-rw-r--r--cpp/sca/modules/http/htdocs/json-result.txt1
-rwxr-xr-xcpp/sca/modules/http/http-test42
-rw-r--r--cpp/sca/modules/http/httpd-client.scm25
-rwxr-xr-xcpp/sca/modules/http/httpd-conf37
-rwxr-xr-xcpp/sca/modules/http/httpd-test79
-rw-r--r--cpp/sca/modules/http/httpd-test.composite42
-rw-r--r--cpp/sca/modules/http/httpd-test.scm29
-rw-r--r--cpp/sca/modules/http/httpd.hpp159
-rw-r--r--cpp/sca/modules/http/mod-eval.cpp532
-rw-r--r--cpp/sca/modules/http/mod-wiring.cpp276
-rwxr-xr-xcpp/sca/modules/http/wiring-test92
19 files changed, 0 insertions, 2585 deletions
diff --git a/cpp/sca/modules/http/Makefile.am b/cpp/sca/modules/http/Makefile.am
deleted file mode 100644
index ba5eadbab4..0000000000
--- a/cpp/sca/modules/http/Makefile.am
+++ /dev/null
@@ -1,37 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-noinst_PROGRAMS = curl-test
-
-libdir=$(prefix)/lib
-lib_LTLIBRARIES = libmod_tuscany_eval.la libmod_tuscany_wiring.la
-
-nobase_include_HEADERS = *.hpp
-
-INCLUDES = -I. -I$(top_builddir)/kernel -I${LIBXML2_INCLUDE} -I${HTTPD_INCLUDE} -I${APR_INCLUDE} -I${LIBMOZJS_INCLUDE} -I${CURL_INCLUDE}
-
-libmod_tuscany_eval_la_SOURCES = mod-eval.cpp
-libmod_tuscany_eval_la_LIBADD = -lpthread -L${LIBXML2_LIB} -lxml2 -L${APR_LIB} -lapr-1 -laprutil-1 -L${CURL_LIB} -lcurl -L${LIBMOZJS_LIB} -lmozjs
-
-libmod_tuscany_wiring_la_SOURCES = mod-wiring.cpp
-libmod_tuscany_wiring_la_LIBADD = -lpthread -L${LIBXML2_LIB} -lxml2 -L${APR_LIB} -lapr-1 -laprutil-1 -L${CURL_LIB} -lcurl -L${LIBMOZJS_LIB} -lmozjs
-
-curl_test_SOURCES = curl-test.cpp
-curl_test_LDADD = -lpthread -L${LIBXML2_LIB} -lxml2 -L${APR_LIB} -lapr-1 -laprutil-1 -L${CURL_LIB} -lcurl -L${LIBMOZJS_LIB} -lmozjs
-
-TESTS = httpd-test http-test wiring-test
-
diff --git a/cpp/sca/modules/http/conf/mime.types b/cpp/sca/modules/http/conf/mime.types
deleted file mode 100644
index 4279f51bca..0000000000
--- a/cpp/sca/modules/http/conf/mime.types
+++ /dev/null
@@ -1,607 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# This file controls what Internet media types are sent to the client for
-# given file extension(s). Sending the correct media type to the client
-# is important so they know how to handle the content of the file.
-# Extra types can either be added here or by using an AddType directive
-# in your config files. For more information about Internet media types,
-# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type
-# registry is at <http://www.iana.org/assignments/media-types/>.
-
-# MIME type Extensions
-application/activemessage
-application/andrew-inset ez
-application/applefile
-application/atom+xml atom
-application/atomicmail
-application/batch-smtp
-application/beep+xml
-application/cals-1840
-application/cnrp+xml
-application/commonground
-application/cpl+xml
-application/cybercash
-application/dca-rft
-application/dec-dx
-application/dvcs
-application/edi-consent
-application/edifact
-application/edi-x12
-application/eshop
-application/font-tdpfr
-application/http
-application/hyperstudio
-application/iges
-application/index
-application/index.cmd
-application/index.obj
-application/index.response
-application/index.vnd
-application/iotp
-application/ipp
-application/isup
-application/mac-binhex40 hqx
-application/mac-compactpro cpt
-application/macwriteii
-application/marc
-application/mathematica
-application/mathml+xml mathml
-application/msword doc
-application/news-message-id
-application/news-transmission
-application/ocsp-request
-application/ocsp-response
-application/octet-stream bin dms lha lzh exe class so dll dmg
-application/oda oda
-application/ogg ogg
-application/parityfec
-application/pdf pdf
-application/pgp-encrypted
-application/pgp-keys
-application/pgp-signature
-application/pkcs10
-application/pkcs7-mime
-application/pkcs7-signature
-application/pkix-cert
-application/pkix-crl
-application/pkixcmp
-application/postscript ai eps ps
-application/prs.alvestrand.titrax-sheet
-application/prs.cww
-application/prs.nprend
-application/prs.plucker
-application/qsig
-application/rdf+xml rdf
-application/reginfo+xml
-application/remote-printing
-application/riscos
-application/rtf
-application/sdp
-application/set-payment
-application/set-payment-initiation
-application/set-registration
-application/set-registration-initiation
-application/sgml
-application/sgml-open-catalog
-application/sieve
-application/slate
-application/smil smi smil
-application/srgs gram
-application/srgs+xml grxml
-application/timestamp-query
-application/timestamp-reply
-application/tve-trigger
-application/vemmi
-application/vnd.3gpp.pic-bw-large
-application/vnd.3gpp.pic-bw-small
-application/vnd.3gpp.pic-bw-var
-application/vnd.3gpp.sms
-application/vnd.3m.post-it-notes
-application/vnd.accpac.simply.aso
-application/vnd.accpac.simply.imp
-application/vnd.acucobol
-application/vnd.acucorp
-application/vnd.adobe.xfdf
-application/vnd.aether.imp
-application/vnd.amiga.ami
-application/vnd.anser-web-certificate-issue-initiation
-application/vnd.anser-web-funds-transfer-initiation
-application/vnd.audiograph
-application/vnd.blueice.multipass
-application/vnd.bmi
-application/vnd.businessobjects
-application/vnd.canon-cpdl
-application/vnd.canon-lips
-application/vnd.cinderella
-application/vnd.claymore
-application/vnd.commerce-battelle
-application/vnd.commonspace
-application/vnd.contact.cmsg
-application/vnd.cosmocaller
-application/vnd.criticaltools.wbs+xml
-application/vnd.ctc-posml
-application/vnd.cups-postscript
-application/vnd.cups-raster
-application/vnd.cups-raw
-application/vnd.curl
-application/vnd.cybank
-application/vnd.data-vision.rdz
-application/vnd.dna
-application/vnd.dpgraph
-application/vnd.dreamfactory
-application/vnd.dxr
-application/vnd.ecdis-update
-application/vnd.ecowin.chart
-application/vnd.ecowin.filerequest
-application/vnd.ecowin.fileupdate
-application/vnd.ecowin.series
-application/vnd.ecowin.seriesrequest
-application/vnd.ecowin.seriesupdate
-application/vnd.enliven
-application/vnd.epson.esf
-application/vnd.epson.msf
-application/vnd.epson.quickanime
-application/vnd.epson.salt
-application/vnd.epson.ssf
-application/vnd.ericsson.quickcall
-application/vnd.eudora.data
-application/vnd.fdf
-application/vnd.ffsns
-application/vnd.fints
-application/vnd.flographit
-application/vnd.framemaker
-application/vnd.fsc.weblaunch
-application/vnd.fujitsu.oasys
-application/vnd.fujitsu.oasys2
-application/vnd.fujitsu.oasys3
-application/vnd.fujitsu.oasysgp
-application/vnd.fujitsu.oasysprs
-application/vnd.fujixerox.ddd
-application/vnd.fujixerox.docuworks
-application/vnd.fujixerox.docuworks.binder
-application/vnd.fut-misnet
-application/vnd.grafeq
-application/vnd.groove-account
-application/vnd.groove-help
-application/vnd.groove-identity-message
-application/vnd.groove-injector
-application/vnd.groove-tool-message
-application/vnd.groove-tool-template
-application/vnd.groove-vcard
-application/vnd.hbci
-application/vnd.hhe.lesson-player
-application/vnd.hp-hpgl
-application/vnd.hp-hpid
-application/vnd.hp-hps
-application/vnd.hp-pcl
-application/vnd.hp-pclxl
-application/vnd.httphone
-application/vnd.hzn-3d-crossword
-application/vnd.ibm.afplinedata
-application/vnd.ibm.electronic-media
-application/vnd.ibm.minipay
-application/vnd.ibm.modcap
-application/vnd.ibm.rights-management
-application/vnd.ibm.secure-container
-application/vnd.informix-visionary
-application/vnd.intercon.formnet
-application/vnd.intertrust.digibox
-application/vnd.intertrust.nncp
-application/vnd.intu.qbo
-application/vnd.intu.qfx
-application/vnd.irepository.package+xml
-application/vnd.is-xpr
-application/vnd.japannet-directory-service
-application/vnd.japannet-jpnstore-wakeup
-application/vnd.japannet-payment-wakeup
-application/vnd.japannet-registration
-application/vnd.japannet-registration-wakeup
-application/vnd.japannet-setstore-wakeup
-application/vnd.japannet-verification
-application/vnd.japannet-verification-wakeup
-application/vnd.jisp
-application/vnd.kde.karbon
-application/vnd.kde.kchart
-application/vnd.kde.kformula
-application/vnd.kde.kivio
-application/vnd.kde.kontour
-application/vnd.kde.kpresenter
-application/vnd.kde.kspread
-application/vnd.kde.kword
-application/vnd.kenameaapp
-application/vnd.koan
-application/vnd.liberty-request+xml
-application/vnd.llamagraphics.life-balance.desktop
-application/vnd.llamagraphics.life-balance.exchange+xml
-application/vnd.lotus-1-2-3
-application/vnd.lotus-approach
-application/vnd.lotus-freelance
-application/vnd.lotus-notes
-application/vnd.lotus-organizer
-application/vnd.lotus-screencam
-application/vnd.lotus-wordpro
-application/vnd.mcd
-application/vnd.mediastation.cdkey
-application/vnd.meridian-slingshot
-application/vnd.micrografx.flo
-application/vnd.micrografx.igx
-application/vnd.mif mif
-application/vnd.minisoft-hp3000-save
-application/vnd.mitsubishi.misty-guard.trustweb
-application/vnd.mobius.daf
-application/vnd.mobius.dis
-application/vnd.mobius.mbk
-application/vnd.mobius.mqy
-application/vnd.mobius.msl
-application/vnd.mobius.plc
-application/vnd.mobius.txf
-application/vnd.mophun.application
-application/vnd.mophun.certificate
-application/vnd.motorola.flexsuite
-application/vnd.motorola.flexsuite.adsi
-application/vnd.motorola.flexsuite.fis
-application/vnd.motorola.flexsuite.gotap
-application/vnd.motorola.flexsuite.kmr
-application/vnd.motorola.flexsuite.ttc
-application/vnd.motorola.flexsuite.wem
-application/vnd.mozilla.xul+xml xul
-application/vnd.ms-artgalry
-application/vnd.ms-asf
-application/vnd.ms-excel xls
-application/vnd.ms-lrm
-application/vnd.ms-powerpoint ppt
-application/vnd.ms-project
-application/vnd.ms-tnef
-application/vnd.ms-works
-application/vnd.ms-wpl
-application/vnd.mseq
-application/vnd.msign
-application/vnd.music-niff
-application/vnd.musician
-application/vnd.netfpx
-application/vnd.noblenet-directory
-application/vnd.noblenet-sealer
-application/vnd.noblenet-web
-application/vnd.novadigm.edm
-application/vnd.novadigm.edx
-application/vnd.novadigm.ext
-application/vnd.obn
-application/vnd.osa.netdeploy
-application/vnd.palm
-application/vnd.pg.format
-application/vnd.pg.osasli
-application/vnd.powerbuilder6
-application/vnd.powerbuilder6-s
-application/vnd.powerbuilder7
-application/vnd.powerbuilder7-s
-application/vnd.powerbuilder75
-application/vnd.powerbuilder75-s
-application/vnd.previewsystems.box
-application/vnd.publishare-delta-tree
-application/vnd.pvi.ptid1
-application/vnd.pwg-multiplexed
-application/vnd.pwg-xhtml-print+xml
-application/vnd.quark.quarkxpress
-application/vnd.rapid
-application/vnd.s3sms
-application/vnd.sealed.net
-application/vnd.seemail
-application/vnd.shana.informed.formdata
-application/vnd.shana.informed.formtemplate
-application/vnd.shana.informed.interchange
-application/vnd.shana.informed.package
-application/vnd.smaf
-application/vnd.sss-cod
-application/vnd.sss-dtf
-application/vnd.sss-ntf
-application/vnd.street-stream
-application/vnd.svd
-application/vnd.swiftview-ics
-application/vnd.triscape.mxs
-application/vnd.trueapp
-application/vnd.truedoc
-application/vnd.ufdl
-application/vnd.uplanet.alert
-application/vnd.uplanet.alert-wbxml
-application/vnd.uplanet.bearer-choice
-application/vnd.uplanet.bearer-choice-wbxml
-application/vnd.uplanet.cacheop
-application/vnd.uplanet.cacheop-wbxml
-application/vnd.uplanet.channel
-application/vnd.uplanet.channel-wbxml
-application/vnd.uplanet.list
-application/vnd.uplanet.list-wbxml
-application/vnd.uplanet.listcmd
-application/vnd.uplanet.listcmd-wbxml
-application/vnd.uplanet.signal
-application/vnd.vcx
-application/vnd.vectorworks
-application/vnd.vidsoft.vidconference
-application/vnd.visio
-application/vnd.visionary
-application/vnd.vividence.scriptfile
-application/vnd.vsf
-application/vnd.wap.sic
-application/vnd.wap.slc
-application/vnd.wap.wbxml wbxml
-application/vnd.wap.wmlc wmlc
-application/vnd.wap.wmlscriptc wmlsc
-application/vnd.webturbo
-application/vnd.wrq-hp3000-labelled
-application/vnd.wt.stf
-application/vnd.wv.csp+wbxml
-application/vnd.xara
-application/vnd.xfdl
-application/vnd.yamaha.hv-dic
-application/vnd.yamaha.hv-script
-application/vnd.yamaha.hv-voice
-application/vnd.yellowriver-custom-menu
-application/voicexml+xml vxml
-application/watcherinfo+xml
-application/whoispp-query
-application/whoispp-response
-application/wita
-application/wordperfect5.1
-application/x-bcpio bcpio
-application/x-cdlink vcd
-application/x-chess-pgn pgn
-application/x-compress
-application/x-cpio cpio
-application/x-csh csh
-application/x-director dcr dir dxr
-application/x-dvi dvi
-application/x-futuresplash spl
-application/x-gtar gtar
-application/x-gzip
-application/x-hdf hdf
-application/x-javascript js
-application/x-koan skp skd skt skm
-application/x-latex latex
-application/x-netcdf nc cdf
-application/x-sh sh
-application/x-shar shar
-application/x-shockwave-flash swf
-application/x-stuffit sit
-application/x-sv4cpio sv4cpio
-application/x-sv4crc sv4crc
-application/x-tar tar
-application/x-tcl tcl
-application/x-tex tex
-application/x-texinfo texinfo texi
-application/x-troff t tr roff
-application/x-troff-man man
-application/x-troff-me me
-application/x-troff-ms ms
-application/x-ustar ustar
-application/x-wais-source src
-application/x400-bp
-application/xhtml+xml xhtml xht
-application/xslt+xml xslt
-application/xml xml xsl
-application/xml-dtd dtd
-application/xml-external-parsed-entity
-application/zip zip
-audio/32kadpcm
-audio/amr
-audio/amr-wb
-audio/basic au snd
-audio/cn
-audio/dat12
-audio/dsr-es201108
-audio/dvi4
-audio/evrc
-audio/evrc0
-audio/g722
-audio/g.722.1
-audio/g723
-audio/g726-16
-audio/g726-24
-audio/g726-32
-audio/g726-40
-audio/g728
-audio/g729
-audio/g729D
-audio/g729E
-audio/gsm
-audio/gsm-efr
-audio/l8
-audio/l16
-audio/l20
-audio/l24
-audio/lpc
-audio/midi mid midi kar
-audio/mpa
-audio/mpa-robust
-audio/mp4a-latm
-audio/mpeg mpga mp2 mp3
-audio/parityfec
-audio/pcma
-audio/pcmu
-audio/prs.sid
-audio/qcelp
-audio/red
-audio/smv
-audio/smv0
-audio/telephone-event
-audio/tone
-audio/vdvi
-audio/vnd.3gpp.iufp
-audio/vnd.cisco.nse
-audio/vnd.cns.anp1
-audio/vnd.cns.inf1
-audio/vnd.digital-winds
-audio/vnd.everad.plj
-audio/vnd.lucent.voice
-audio/vnd.nortel.vbk
-audio/vnd.nuera.ecelp4800
-audio/vnd.nuera.ecelp7470
-audio/vnd.nuera.ecelp9600
-audio/vnd.octel.sbc
-audio/vnd.qcelp
-audio/vnd.rhetorex.32kadpcm
-audio/vnd.vmx.cvsd
-audio/x-aiff aif aiff aifc
-audio/x-alaw-basic
-audio/x-mpegurl m3u
-audio/x-pn-realaudio ram ra
-audio/x-pn-realaudio-plugin
-application/vnd.rn-realmedia rm
-audio/x-wav wav
-chemical/x-pdb pdb
-chemical/x-xyz xyz
-image/bmp bmp
-image/cgm cgm
-image/g3fax
-image/gif gif
-image/ief ief
-image/jpeg jpeg jpg jpe
-image/naplps
-image/png png
-image/prs.btif
-image/prs.pti
-image/svg+xml svg
-image/t38
-image/tiff tiff tif
-image/tiff-fx
-image/vnd.cns.inf2
-image/vnd.djvu djvu djv
-image/vnd.dwg
-image/vnd.dxf
-image/vnd.fastbidsheet
-image/vnd.fpx
-image/vnd.fst
-image/vnd.fujixerox.edmics-mmr
-image/vnd.fujixerox.edmics-rlc
-image/vnd.globalgraphics.pgb
-image/vnd.mix
-image/vnd.ms-modi
-image/vnd.net-fpx
-image/vnd.svf
-image/vnd.wap.wbmp wbmp
-image/vnd.xiff
-image/x-cmu-raster ras
-image/x-icon ico
-image/x-portable-anymap pnm
-image/x-portable-bitmap pbm
-image/x-portable-graymap pgm
-image/x-portable-pixmap ppm
-image/x-rgb rgb
-image/x-xbitmap xbm
-image/x-xpixmap xpm
-image/x-xwindowdump xwd
-message/delivery-status
-message/disposition-notification
-message/external-body
-message/http
-message/news
-message/partial
-message/rfc822
-message/s-http
-message/sip
-message/sipfrag
-model/iges igs iges
-model/mesh msh mesh silo
-model/vnd.dwf
-model/vnd.flatland.3dml
-model/vnd.gdl
-model/vnd.gs-gdl
-model/vnd.gtw
-model/vnd.mts
-model/vnd.parasolid.transmit.binary
-model/vnd.parasolid.transmit.text
-model/vnd.vtu
-model/vrml wrl vrml
-multipart/alternative
-multipart/appledouble
-multipart/byteranges
-multipart/digest
-multipart/encrypted
-multipart/form-data
-multipart/header-set
-multipart/mixed
-multipart/parallel
-multipart/related
-multipart/report
-multipart/signed
-multipart/voice-message
-text/calendar ics ifb
-text/css css
-text/directory
-text/enriched
-text/html html htm
-text/parityfec
-text/plain asc txt
-text/prs.lines.tag
-text/rfc822-headers
-text/richtext rtx
-text/rtf rtf
-text/sgml sgml sgm
-text/t140
-text/tab-separated-values tsv
-text/uri-list
-text/vnd.abc
-text/vnd.curl
-text/vnd.dmclientscript
-text/vnd.fly
-text/vnd.fmi.flexstor
-text/vnd.in3d.3dml
-text/vnd.in3d.spot
-text/vnd.iptc.nitf
-text/vnd.iptc.newsml
-text/vnd.latex-z
-text/vnd.motorola.reflex
-text/vnd.ms-mediapackage
-text/vnd.net2phone.commcenter.command
-text/vnd.sun.j2me.app-descriptor
-text/vnd.wap.si
-text/vnd.wap.sl
-text/vnd.wap.wml wml
-text/vnd.wap.wmlscript wmls
-text/x-setext etx
-text/xml
-text/xml-external-parsed-entity
-video/bmpeg
-video/bt656
-video/celb
-video/dv
-video/h261
-video/h263
-video/h263-1998
-video/h263-2000
-video/jpeg
-video/mp1s
-video/mp2p
-video/mp2t
-video/mp4v-es
-video/mpv
-video/mpeg mpeg mpg mpe
-video/nv
-video/parityfec
-video/pointer
-video/quicktime qt mov
-video/smpte292m
-video/vnd.fvt
-video/vnd.motorola.video
-video/vnd.motorola.videop
-video/vnd.mpegurl mxu m4u
-video/vnd.nokia.interleaved-multimedia
-video/vnd.objectvideo
-video/vnd.vivo
-video/x-msvideo avi
-video/x-sgi-movie movie
-x-conference/x-cooltalk ice
diff --git a/cpp/sca/modules/http/curl-test.cpp b/cpp/sca/modules/http/curl-test.cpp
deleted file mode 100644
index 863aa98828..0000000000
--- a/cpp/sca/modules/http/curl-test.cpp
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/* $Rev$ $Date$ */
-
-/**
- * Test HTTP client functions.
- */
-
-#include <assert.h>
-#include <sys/time.h>
-#include <time.h>
-#include <iostream>
-#include <sstream>
-#include <string>
-#include "slist.hpp"
-#include "curl.hpp"
-
-namespace tuscany {
-namespace http {
-
-const bool contains(const std::string& str, const std::string& pattern) {
- return str.find(pattern) != str.npos;
-}
-
-const double duration(struct timeval start, struct timeval end, int count) {
- long t = (end.tv_sec * 1000 + end.tv_usec / 1000) - (start.tv_sec * 1000 + start.tv_usec / 1000);
- return (double)t / (double)count;
-}
-
-std::ostringstream* curlWriter(const std::string& s, std::ostringstream* os) {
- (*os) << s;
- return os;
-}
-
-const bool testGet() {
- CURLHandle ch;
- {
- std::ostringstream os;
- const failable<list<std::ostringstream*>, std::string> r = get<std::ostringstream*>(curlWriter, &os, "http://localhost:8091", ch);
- assert(hasValue(r));
- assert(contains(os.str(), "HTTP/1.1 200 OK"));
- assert(contains(os.str(), "It works"));
- }
- {
- const failable<value, std::string> r = get("http://localhost:8091", ch);
- assert(hasValue(r));
- const value val = r;
- assert(contains(val, "It works"));
- }
- return true;
-}
-
-const bool testGetLoop(const int count, CURLHandle& ch) {
- if (count == 0)
- return true;
- const failable<value, std::string> r = get("http://localhost:8091", ch);
- assert(hasValue(r));
- const value val = r;
- assert(contains(val, "It works"));
- return testGetLoop(count - 1, ch);
-}
-
-const bool testGetPerf() {
- const int count = 50;
- CURLHandle ch;
- struct timeval start;
- struct timeval end;
- {
- testGetLoop(5, ch);
-
- gettimeofday(&start, NULL);
-
- testGetLoop(count, ch);
-
- gettimeofday(&end, NULL);
- std::cout << "Static GET test " << duration(start, end, count) << " ms" << std::endl;
- }
- return true;
-}
-
-const bool testEval() {
- CURLHandle ch;
- const value val = evalExpr(mklist<value>(std::string("echo"), std::string("Hello")), "http://localhost:8091/test", ch);
- assert(val == std::string("Hello"));
- return true;
-}
-
-const bool testEvalLoop(const int count, CURLHandle& ch) {
- if (count == 0)
- return true;
- const value val = evalExpr(mklist<value>(std::string("echo"), std::string("Hello")), "http://localhost:8091/test", ch);
- assert(val == std::string("Hello"));
- return testEvalLoop(count - 1, ch);
-}
-
-const value blob(std::string(3000, 'A'));
-const list<value> blobs = mklist(blob, blob, blob, blob, blob);
-
-const bool testBlobEvalLoop(const int count, CURLHandle& ch) {
- if (count == 0)
- return true;
- const value val = evalExpr(mklist<value>(std::string("echo"), blobs), "http://localhost:8091/test", ch);
- assert(val == blobs);
- return testBlobEvalLoop(count - 1, ch);
-}
-
-const bool testEvalPerf() {
- const int count = 50;
- CURLHandle ch;
- struct timeval start;
- struct timeval end;
- {
- testEvalLoop(5, ch);
-
- gettimeofday(&start, NULL);
-
- testEvalLoop(count, ch);
-
- gettimeofday(&end, NULL);
- std::cout << "JSON-RPC eval echo test " << duration(start, end, count) << " ms" << std::endl;
- }
- {
- testBlobEvalLoop(5, ch);
-
- gettimeofday(&start, NULL);
-
- testBlobEvalLoop(count, ch);
-
- gettimeofday(&end, NULL);
- std::cout << "JSON-RPC eval blob test " << duration(start, end, count) << " ms" << std::endl;
- }
- return true;
-}
-
-const bool testFeed() {
- return true;
-}
-
-bool testPost() {
- const list<value> i = list<value>()
- << (list<value>() << "name" << std::string("Apple"))
- << (list<value>() << "price" << std::string("$2.99"));
- const list<value> a = mklist<value>(std::string("item"), std::string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i);
- CURLHandle ch;
- value rc = post(a, "http://localhost:8091/test", ch);
- assert(rc == value(true));
- return true;
-}
-
-const bool testPostLoop(const int count, const value& val, CURLHandle& ch) {
- if (count == 0)
- return true;
- const value rc = post(val, "http://localhost:8091/test", ch);
- assert(rc == value(true));
- return testPostLoop(count - 1, val, ch);
-}
-
-const bool testPostPerf() {
- const int count = 50;
- CURLHandle ch;
- struct timeval start;
- struct timeval end;
- {
- const list<value> i = list<value>()
- << (list<value>() << "name" << std::string("Apple"))
- << (list<value>() << "price" << std::string("$2.99"));
- const list<value> val = mklist<value>(std::string("item"), std::string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i);
- testPostLoop(5, val, ch);
-
- gettimeofday(&start, NULL);
-
- testPostLoop(count, val, ch);
-
- gettimeofday(&end, NULL);
- std::cout << "ATOMPub POST small test " << duration(start, end, count) << " ms" << std::endl;
- }
- {
- const list<value> i = list<value>()
- << (list<value>() << "name" << std::string("Apple"))
- << (list<value>() << "blob1" << blob)
- << (list<value>() << "blob2" << blob)
- << (list<value>() << "blob3" << blob)
- << (list<value>() << "blob4" << blob)
- << (list<value>() << "blob5" << blob)
- << (list<value>() << "price" << std::string("$2.99"));
- const list<value> val = mklist<value>(std::string("item"), std::string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i);
- testPostLoop(5, val, ch);
-
- gettimeofday(&start, NULL);
-
- testPostLoop(count, val, ch);
-
- gettimeofday(&end, NULL);
- std::cout << "ATOMPub POST blob test " << duration(start, end, count) << " ms" << std::endl;
- }
- return true;
-}
-
-const bool testPut() {
- const list<value> i = list<value>()
- << (list<value>() << "name" << std::string("Apple"))
- << (list<value>() << "price" << std::string("$2.99"));
- const list<value> a = mklist<value>(std::string("item"), std::string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i);
- CURLHandle ch;
- value rc = put(a, "http://localhost:8091/test/111", ch);
- assert(rc == value(true));
- return true;
-}
-
-const bool testDel() {
- CURLHandle ch;
- value rc = del("http://localhost:8091/test/123456789", ch);
- assert(rc == value(true));
- return true;
-}
-
-}
-}
-
-int main() {
- std::cout << "Testing..." << std::endl;
-
- tuscany::http::testGet();
- tuscany::http::testGetPerf();
- tuscany::http::testPost();
- tuscany::http::testPostPerf();
- tuscany::http::testEval();
- tuscany::http::testEvalPerf();
- tuscany::http::testFeed();
- tuscany::http::testPut();
- tuscany::http::testDel();
-
- std::cout << "OK" << std::endl;
-
- return 0;
-}
diff --git a/cpp/sca/modules/http/curl.hpp b/cpp/sca/modules/http/curl.hpp
deleted file mode 100644
index 5ee3a090b0..0000000000
--- a/cpp/sca/modules/http/curl.hpp
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/* $Rev$ $Date$ */
-
-#ifndef tuscany_curl_hpp
-#define tuscany_curl_hpp
-
-/**
- * CURL HTTP client functions.
- */
-
-#include <curl/curl.h>
-#include <curl/types.h>
-#include <curl/easy.h>
-#include <string>
-#include "list.hpp"
-#include "value.hpp"
-#include "element.hpp"
-#include "monad.hpp"
-#include "../atom/atom.hpp"
-#include "../json/json.hpp"
-
-namespace tuscany {
-namespace http {
-
-/**
- * Set to true to log HTTP content.
- */
-bool logContent = false;
-
-/**
- * CURL library context, one per process.
- */
-class CURLContext {
-public:
- CURLContext() {
- curl_global_init(CURL_GLOBAL_ALL);
- }
- ~CURLContext() {
- curl_global_cleanup();
- }
-};
-
-CURLContext curlContext;
-
-/**
- * Represents a CURL session handle.
- */
-class CURLHandle {
-public:
- CURLHandle() : h(curl_easy_init()) {
- }
- ~CURLHandle() {
- curl_easy_cleanup(h);
- }
-
- operator CURL*() const {
- return h;
- }
-private:
- CURL* h;
-};
-
-/**
- * Context passed to the read callback function.
- */
-class CURLReadContext {
-public:
- CURLReadContext(const list<std::string>& ilist) : ilist(ilist) {
- }
- list<std::string> ilist;
-};
-
-/**
- * Called by CURL to read data to send.
- */
-size_t readCallback(void *ptr, size_t size, size_t nmemb, void *data) {
- CURLReadContext& rcx = *static_cast<CURLReadContext*>(data);
- if (isNil(rcx.ilist))
- return 0;
- rcx.ilist = fragment(rcx.ilist, size * nmemb);
- const std::string s = car(rcx.ilist);
- rcx.ilist = cdr(rcx.ilist);
- s.copy((char*)ptr, s.length());
- return s.length();
-}
-
-/**
- * Context passed to CURL write callback function.
- */
-template<typename R> class CURLWriteContext {
-public:
- CURLWriteContext(const lambda<R(std::string, R)>& reduce, const R& accum) : reduce(reduce), accum(accum) {
- }
- const lambda<R(std::string, R)> reduce;
- R accum;
-};
-
-/**
- * Called by CURL to write received data.
- */
-template<typename R> size_t writeCallback(void *ptr, size_t size, size_t nmemb, void *data) {
- CURLWriteContext<R>& wcx = *(static_cast<CURLWriteContext<R>*> (data));
- const size_t realsize = size * nmemb;
- wcx.accum = wcx.reduce(std::string((const char*)ptr, realsize), wcx.accum);
- return realsize;
-}
-
-/**
- * Called by CURL to write received header data.
- */
-template<typename R> size_t headerCallback(void *ptr, size_t size, size_t nmemb, void *data) {
- CURLWriteContext<R>& wcx = *(static_cast<CURLWriteContext<R>*> (data));
- const size_t realsize = size * nmemb;
- wcx.accum = wcx.reduce(std::string((const char*)ptr, realsize), wcx.accum);
- return realsize;
-}
-
-/**
- * Apply an HTTP verb to a list containing a list of headers and a list of content, and
- * a reduce function used to process the response.
- */
-curl_slist* headers(curl_slist* cl, const list<std::string>& h) {
- if (isNil(h))
- return cl;
- return headers(curl_slist_append(cl, std::string(car(h)).c_str()), cdr(h));
-}
-
-template<typename R> const failable<list<R>, std::string> apply(const list<list<std::string> >& req, const lambda<R(std::string, R)>& reduce, const R& initial, const std::string& url, const std::string& verb, const CURLHandle& ch) {
-
- // Init the curl session
- curl_easy_reset(ch);
- curl_easy_setopt(ch, CURLOPT_USERAGENT, "libcurl/1.0");
-
- //TODO use HTTP chunking, for now just convert request to a single string
- std::ostringstream os;
- write(cadr(req), os);
- const std::string s = os.str();
- const int sz = s.length();
- if (sz < 1400)
- curl_easy_setopt(ch, CURLOPT_TCP_NODELAY, true);
-
- // Setup the read, header and write callbacks
- CURLReadContext rcx(mklist(s));
- curl_easy_setopt(ch, CURLOPT_READFUNCTION, (size_t (*)(void*, size_t, size_t, void*))readCallback);
- curl_easy_setopt(ch, CURLOPT_READDATA, &rcx);
- CURLWriteContext<R> hcx(reduce, initial);
- curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, (size_t (*)(void*, size_t, size_t, void*))headerCallback<R>);
- curl_easy_setopt(ch, CURLOPT_HEADERDATA, &hcx);
- CURLWriteContext<R> wcx(reduce, initial);
- curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, (size_t (*)(void*, size_t, size_t, void*))writeCallback<R>);
- curl_easy_setopt(ch, CURLOPT_WRITEDATA, &wcx);
-
- // Set the request headers
- curl_slist* hl = headers(NULL, car(req));
- if (hl != NULL)
- curl_easy_setopt(ch, CURLOPT_HTTPHEADER, hl);
-
- // Apply the HTTP verb
- curl_easy_setopt(ch, CURLOPT_URL, url.c_str());
- if (verb == "POST") {
- curl_easy_setopt(ch, CURLOPT_POST, true);
- curl_easy_setopt(ch, CURLOPT_POSTFIELDSIZE, sz);
- } else if (verb == "PUT") {
- curl_easy_setopt(ch, CURLOPT_UPLOAD, true);
- curl_easy_setopt(ch, CURLOPT_INFILESIZE, sz);
- } else if (verb == "DELETE")
- curl_easy_setopt(ch, CURLOPT_CUSTOMREQUEST, "DELETE");
- const CURLcode rc = curl_easy_perform(ch);
-
- if (hl != NULL)
- curl_slist_free_all(hl);
-
- // Return the HTTP return code or content
- if (rc)
- return mkfailure<list<R>, std::string>(curl_easy_strerror(rc));
- long httprc;
- curl_easy_getinfo (ch, CURLINFO_RESPONSE_CODE, &httprc);
- if (httprc != 200 && httprc != 201) {
- std::ostringstream es;
- es << "HTTP code " << httprc;
- return mkfailure<list<R>, std::string>(es.str());
- }
- return mklist<R>(hcx.accum, wcx.accum);
-}
-
-/**
- * Evaluate an expression remotely, at the given URL.
- */
-const failable<value, std::string> evalExpr(const value& expr, const std::string& url, const CURLHandle& ch) {
-
- // Convert expression to a JSON-RPC request
- json::JSONContext cx;
- const failable<list<std::string>, std::string> jsreq = jsonRequest(1, car<value>(expr), cdr<value>(expr), cx);
- if (!hasValue(jsreq))
- return mkfailure<value, std::string>(reason(jsreq));
-
- if (logContent) {
- std::cout<< "content: " << std::endl;
- write(jsreq, std::cout);
- std::cout<< std::endl;
- std::cout.flush();
- }
-
- // POST it to the URL
- const list<std::string> h = mklist<std::string>("Content-Type: application/json-rpc");
- const failable<list<list<std::string> >, std::string> res = apply<list<std::string> >(mklist<list<std::string> >(h, jsreq), rcons<std::string>, list<std::string>(), url, "POST", ch);
- if (!hasValue(res))
- return mkfailure<value, std::string>(reason(res));
-
- // Return result
- if (logContent) {
- std::cout << "content:" << std::endl;
- write(cadr<list<std::string> >(res), std::cout);
- std::cout << std::endl;
- }
- const list<value> val = elementsToValues(json::readJSON(cadr<list<std::string> >(res), cx));
- return cadr<value>(cadr<value>(val));
-}
-
-/**
- * HTTP GET, return the resource at the given URL.
- */
-template<typename R> const failable<list<R>, std::string> get(const lambda<R(std::string, R)>& reduce, const R& initial, const std::string& url, const CURLHandle& ch) {
- const list<list<std::string> > req = mklist(list<std::string>(), list<std::string>());
- return apply(req, reduce, initial, url, "GET", ch);
-}
-
-/**
- * HTTP GET, return a list of values representing the resource at the given URL.
- */
-const failable<value, std::string> get(const std::string& url, const CURLHandle& ch) {
-
- // Get the contents of the resource at the given URL
- const failable<list<list<std::string> >, std::string> res = get<list<std::string> >(rcons<std::string>, list<std::string>(), url, ch);
- if (!hasValue(res))
- return mkfailure<value, std::string>(reason(res));
- const list<list<std::string> > ls = res;
-
- const std::string ct;
- if (ct.find("application/atom+xml") != std::string::npos) {
- // TODO Return an ATOM feed
- }
-
- // Return the content as a string value
- std::ostringstream os;
- write(reverse(cadr(ls)), os);
- return value(os.str());
-}
-
-/**
- * HTTP POST.
- */
-const failable<value, std::string> post(const value& val, const std::string& url, const CURLHandle& ch) {
-
- // Convert value to an ATOM entry
- const failable<list<std::string>, std::string> entry = atom::writeATOMEntry(atom::entryValuesToElements(val));
- if (!hasValue(entry))
- return mkfailure<value, std::string>(reason(entry));
- if (logContent) {
- std::cout << "content:" << std::endl;
- write(list<std::string>(entry), std::cout);
- std::cout << std::endl;
- }
-
- // POST it to the URL
- const list<std::string> h = mklist<std::string>("Content-Type: application/atom+xml");
- const list<list<std::string> > req = mklist<list<std::string> >(h, entry);
- const failable<list<list<std::string> >, std::string> res = apply<list<std::string> >(req, rcons<std::string>, list<std::string>(), url, "POST", ch);
- if (!hasValue(res))
- return mkfailure<value, std::string>(reason(res));
- return value(true);
-}
-
-/**
- * HTTP PUT.
- */
-const failable<value, std::string> put(const value& val, const std::string& url, const CURLHandle& ch) {
-
- // Convert value to an ATOM entry
- const failable<list<std::string>, std::string> entry = atom::writeATOMEntry(atom::entryValuesToElements(val));
- if (!hasValue(entry))
- return mkfailure<value, std::string>(reason(entry));
- if (logContent) {
- std::cout << "content:" << std::endl;
- write(list<std::string>(entry), std::cout);
- std::cout << std::endl;
- }
-
- // PUT it to the URL
- const list<std::string> h = mklist<std::string>("Content-Type: application/atom+xml");
- const list<list<std::string> > req = mklist<list<std::string> >(h, entry);
- const failable<list<list<std::string> >, std::string> res = apply<list<std::string> >(req, rcons<std::string>, list<std::string>(), url, "PUT", ch);
- if (!hasValue(res))
- return mkfailure<value, std::string>(reason(res));
- return value(true);
-}
-
-/**
- * HTTP DELETE.
- */
-const failable<value, std::string> del(const std::string& url, const CURLHandle& ch) {
- const list<list<std::string> > req = mklist(list<std::string>(), list<std::string>());
- const failable<list<list<std::string> >, std::string> res = apply<list<std::string> >(req, rcons<std::string>, list<std::string>(), url, "DELETE", ch);
- if (!hasValue(res))
- return mkfailure<value, std::string>(reason(res));
- return value(true);
-}
-
-/**
- * HTTP client proxy function.
- */
-struct proxy {
- proxy(const std::string& url, const CURLHandle& ch) : url(url), ch(ch) {
- }
-
- const value operator()(const list<value>& args) const {
- failable<value, std::string> val = evalExpr(args, url, ch);
- if (!hasValue(val))
- return value();
- return val;
- }
-
- const std::string url;
- const CURLHandle& ch;
-};
-
-}
-}
-
-#endif /* tuscany_curl_hpp */
diff --git a/cpp/sca/modules/http/htdocs/entry.xml b/cpp/sca/modules/http/htdocs/entry.xml
deleted file mode 100644
index 86b8a10547..0000000000
--- a/cpp/sca/modules/http/htdocs/entry.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><id>111</id><content type="application/xml"><item><javaClass>services.Item</javaClass><name>Apple</name><currencyCode>USD</currencyCode><currencySymbol>$</currencySymbol><price>2.99</price></item></content><link href="111"/></entry>
diff --git a/cpp/sca/modules/http/htdocs/feed.xml b/cpp/sca/modules/http/htdocs/feed.xml
deleted file mode 100644
index 5e37de6580..0000000000
--- a/cpp/sca/modules/http/htdocs/feed.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Sample Feed</title><id>123456789</id><entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><id>111</id><content type="application/xml"><item><javaClass>services.Item</javaClass><name>Apple</name><currencyCode>USD</currencyCode><currencySymbol>$</currencySymbol><price>2.99</price></item></content><link href="111"/></entry><entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><id>222</id><content type="application/xml"><item><javaClass>services.Item</javaClass><name>Orange</name><currencyCode>USD</currencyCode><currencySymbol>$</currencySymbol><price>3.55</price></item></content><link href="222"/></entry><entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><id>333</id><content type="application/xml"><item><javaClass>services.Item</javaClass><name>Pear</name><currencyCode>USD</currencyCode><currencySymbol>$</currencySymbol><price>1.55</price></item></content><link href="333"/></entry></feed>
diff --git a/cpp/sca/modules/http/htdocs/index.html b/cpp/sca/modules/http/htdocs/index.html
deleted file mode 100644
index 1bfb3e30c2..0000000000
--- a/cpp/sca/modules/http/htdocs/index.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-
-<html><body><h1>It works!</h1></body></html>
-
diff --git a/cpp/sca/modules/http/htdocs/json-request.txt b/cpp/sca/modules/http/htdocs/json-request.txt
deleted file mode 100644
index b4bd07fc46..0000000000
--- a/cpp/sca/modules/http/htdocs/json-request.txt
+++ /dev/null
@@ -1 +0,0 @@
-{"id":1,"method":"echo","params":["Hello"]}
diff --git a/cpp/sca/modules/http/htdocs/json-result.txt b/cpp/sca/modules/http/htdocs/json-result.txt
deleted file mode 100644
index 121bf74902..0000000000
--- a/cpp/sca/modules/http/htdocs/json-result.txt
+++ /dev/null
@@ -1 +0,0 @@
-{"id":1,"result":"Hello"} \ No newline at end of file
diff --git a/cpp/sca/modules/http/http-test b/cpp/sca/modules/http/http-test
deleted file mode 100755
index d70db8d469..0000000000
--- a/cpp/sca/modules/http/http-test
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# Setup
-./httpd-conf tmp 8091 htdocs
-cat >>tmp/conf/httpd.conf <<EOF
-
-<Location /test>
-SetHandler mod_tuscany_eval
-SCAContribution `pwd`/
-SCAComposite httpd-test.composite
-SCAComponent httpd-test
-</Location>
-EOF
-
-apachectl -k start -d `pwd`/tmp
-sleep 1
-
-# Test
-./curl-test
-rc=$?
-
-# Cleanup
-apachectl -k stop -d `pwd`/tmp
-sleep 2
-return $rc
diff --git a/cpp/sca/modules/http/httpd-client.scm b/cpp/sca/modules/http/httpd-client.scm
deleted file mode 100644
index 12275693f4..0000000000
--- a/cpp/sca/modules/http/httpd-client.scm
+++ /dev/null
@@ -1,25 +0,0 @@
-; JSON-RPC test case
-
-(define (echo x ref) (ref "echo" x))
-
-; ATOMPub test case
-
-(define (getall ref)
- (ref "getall")
-)
-
-(define (get id ref)
- (ref "get" id)
-)
-
-(define (post entry ref)
- (ref "post" entry)
-)
-
-(define (put id entry ref)
- (ref "put" id entry)
-)
-
-(define (delete id ref)
- (ref "delete" id)
-)
diff --git a/cpp/sca/modules/http/httpd-conf b/cpp/sca/modules/http/httpd-conf
deleted file mode 100755
index 10a5b47ac2..0000000000
--- a/cpp/sca/modules/http/httpd-conf
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/sh
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# Generate a minimal httpd.conf
-here=`readlink -f $0`; here=`dirname $here`
-root=`readlink -f $1`
-port=$2
-htdocs=`readlink -f $3`
-
-mkdir -p $root
-mkdir -p $root/logs
-mkdir -p $root/conf
-cat >$root/conf/httpd.conf <<EOF
-ServerName 127.0.0.1
-Listen $port
-DocumentRoot $htdocs
-TypesConfig $here/conf/mime.types
-LoadModule mod_tuscany_eval $here/.libs/libmod_tuscany_eval.so
-LoadModule mod_tuscany_wiring $here/.libs/libmod_tuscany_wiring.so
-EOF
-
diff --git a/cpp/sca/modules/http/httpd-test b/cpp/sca/modules/http/httpd-test
deleted file mode 100755
index 1d9b3cb34d..0000000000
--- a/cpp/sca/modules/http/httpd-test
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/sh
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-echo "Testing..."
-
-# Setup
-./httpd-conf tmp 8090 htdocs
-cat >>tmp/conf/httpd.conf <<EOF
-
-<Location /test>
-SetHandler mod_tuscany_eval
-SCAContribution `pwd`/
-SCAComposite httpd-test.composite
-SCAComponent httpd-test
-</Location>
-EOF
-
-apachectl -k start -d `pwd`/tmp
-sleep 1
-
-# Test HTTP GET
-curl http://localhost:8090/index.html 2>/dev/null >tmp/index.html
-diff tmp/index.html htdocs/index.html
-rc=$?
-
-# Test ATOMPub
-if [ "$rc" = "0" ]; then
- curl http://localhost:8090/test/ >tmp/feed.xml 2>/dev/null
- diff tmp/feed.xml htdocs/feed.xml
- rc=$?
-fi
-if [ "$rc" = "0" ]; then
- curl http://localhost:8090/test/111 >tmp/entry.xml 2>/dev/null
- diff tmp/entry.xml htdocs/entry.xml
- rc=$?
-fi
-if [ "$rc" = "0" ]; then
- curl http://localhost:8090/test/ -X POST -H "Content-type: application/atom+xml" --data @htdocs/entry.xml 2>/dev/null
- rc=$?
-fi
-if [ "$rc" = "0" ]; then
- curl http://localhost:8090/test/111 -X PUT -H "Content-type: application/atom+xml" --data @htdocs/entry.xml 2>/dev/null
- rc=$?
-fi
-if [ "$rc" = "0" ]; then
- curl http://localhost:8090/test/111 -X DELETE 2>/dev/null
- rc=$?
-fi
-
-# Test JSON-RPC
-if [ "$rc" = "0" ]; then
- curl http://localhost:8090/test/ -X POST -H "Content-type: application/json-rpc" --data @htdocs/json-request.txt >tmp/json-result.txt 2>/dev/null
- diff tmp/json-result.txt htdocs/json-result.txt
- rc=$?
-fi
-
-# Cleanup
-apachectl -k stop -d `pwd`/tmp
-sleep 2
-if [ "$rc" = "0" ]; then
- echo "OK"
-fi
-return $rc
diff --git a/cpp/sca/modules/http/httpd-test.composite b/cpp/sca/modules/http/httpd-test.composite
deleted file mode 100644
index 875d26ae1b..0000000000
--- a/cpp/sca/modules/http/httpd-test.composite
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
--->
-<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200903"
- xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1"
- targetNamespace="http://test"
- name="httpd-test">
-
- <component name="httpd-test">
- <t:implementation.scheme uri="httpd-test.scm"/>
- <service name="test">
- <t:binding.http uri="test"/>
- </service>
- </component>
-
- <component name="httpd-client">
- <t:implementation.scheme uri="httpd-client.scm"/>
- <service name="client">
- <t:binding.http uri="client"/>
- </service>
- <reference name="ref" target="test">
- <t:binding.http/>
- </reference>
- </component>
-
-</composite>
diff --git a/cpp/sca/modules/http/httpd-test.scm b/cpp/sca/modules/http/httpd-test.scm
deleted file mode 100644
index 0566eaf36f..0000000000
--- a/cpp/sca/modules/http/httpd-test.scm
+++ /dev/null
@@ -1,29 +0,0 @@
-; JSON-RPC test case
-
-(define (echo x) x)
-
-; ATOMPub test case
-
-(define (getall)
- '("Sample Feed" "123456789"
- ("Item" "111" ((javaClass "services.Item") (name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99)))
- ("Item" "222" ((javaClass "services.Item") (name "Orange") (currencyCode "USD") (currencySymbol "$") (price 3.55)))
- ("Item" "333" ((javaClass "services.Item") (name "Pear") (currencyCode "USD") (currencySymbol "$") (price 1.55))))
-)
-
-(define (get id)
- (define entry '((javaClass "services.Item") (name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99)))
- (cons "Item" (list id entry))
-)
-
-(define (post entry)
- "123456789"
-)
-
-(define (put id entry)
- true
-)
-
-(define (delete id)
- true
-)
diff --git a/cpp/sca/modules/http/httpd.hpp b/cpp/sca/modules/http/httpd.hpp
deleted file mode 100644
index 1271afc03c..0000000000
--- a/cpp/sca/modules/http/httpd.hpp
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/* $Rev$ $Date$ */
-
-#ifndef tuscany_httpd_hpp
-#define tuscany_httpd_hpp
-
-/**
- * HTTPD module utility functions.
- */
-
-#include <string>
-#include <iostream>
-
-#include "apr_strings.h"
-#include "apr_fnmatch.h"
-#include "apr_lib.h"
-#define APR_WANT_STRFUNC
-#include "apr_want.h"
-#include "ap_config.h"
-
-#include "httpd.h"
-#include "http_config.h"
-#include "http_core.h"
-#include "http_request.h"
-#include "http_protocol.h"
-#include "http_log.h"
-#include "http_main.h"
-#include "util_script.h"
-#include "util_md5.h"
-
-#include "mod_core.h"
-
-#include "list.hpp"
-#include "value.hpp"
-
-
-namespace tuscany {
-namespace httpd {
-
-/**
- * Set to true to log requests and content.
- */
-bool logRequests = false;
-bool logContent = false;
-
-/**
- * Convert a path string to a list of values.
- */
-const list<std::string> pathTokens(const char* p) {
- if (p == NULL || p[0] == '\0')
- return list<std::string>();
- return tokenize("/", p + 1);
-}
-
-const list<value> pathValues(const list<std::string>& l) {
- if (isNil(l))
- return list<value>();
- return cons<value>(car(l), pathValues(cdr(l)));
-}
-
-const list<value> path(const char* p) {
- return pathValues(pathTokens(p));
-}
-
-/**
- * Convert a path represented as a list of values to a string.
- */
-const std::string path(const list<value>& p) {
- if (isNil(p))
- return "";
- return "/" + car(p) + path(cdr(p));
-}
-
-/**
- * Return the content type of a request.
- */
-const char* optional(const char* s) {
- if (s == NULL)
- return "(null)";
- return s;
-}
-
-const std::string contentType(const request_rec* r) {
- return optional(apr_table_get(r->headers_in, "Content-Type"));
-}
-
-/**
- * Log HTTP request info.
- */
-int logHeader(void* r, const char* key, const char* value) {
- std::cout << "header key: " << key << ", value: " << value << std::endl;
- return 1;
-}
-
-const bool logRequest(request_rec* r, const std::string& msg) {
- std::cout << msg << std::endl;
- std::cout << "protocol: " << optional(r->protocol) << std::endl;
- std::cout << "method: " << optional(r->method) << std::endl;
- std::cout << "method number: " << r->method_number << std::endl;
- std::cout << "content type: " << contentType(r) << std::endl;
- std::cout << "content encoding: " << optional(r->content_encoding) << std::endl;
- apr_table_do(logHeader, r, r->headers_in, NULL);
- std::cout << "uri: " << optional(r->unparsed_uri) << std::endl;
- std::cout << "path: " << optional(r->uri) << std::endl;
- std::cout << "path info: " << optional(r->path_info) << std::endl;
- std::cout << "filename: " << optional(r->filename) << std::endl;
- std::cout << "path tokens: " << pathTokens(r->uri) << std::endl;
- std::cout << "args: " << optional(r->args) << std::endl;
- std::cout.flush();
- return true;
-}
-
-/**
- * Returns a list of key value pairs from the args in a query string.
- */
-const list<value> queryArg(const std::string& s) {
- const list<std::string> t = tokenize("=", s);
- return mklist<value>(car(t).c_str(), cadr(t));
-}
-
-const list<list<value> > queryArgs(const request_rec* r) {
- const char* a = r->args;
- if (a == NULL)
- return list<list<value> >();
- return map<std::string, list<value>>(queryArg, tokenize("&", a));
-}
-
-/**
- * Converts the args received in a POST to a list of key value pairs.
- */
-const list<list<value> > postArgs(const list<value>& a) {
- if (isNil(a))
- return list<list<value> >();
- const list<value> l = car(a);
- return cons(l, postArgs(cdr(a)));
-}
-
-}
-}
-
-#endif /* tuscany_httpd_hpp */
diff --git a/cpp/sca/modules/http/mod-eval.cpp b/cpp/sca/modules/http/mod-eval.cpp
deleted file mode 100644
index 6fef2be2cb..0000000000
--- a/cpp/sca/modules/http/mod-eval.cpp
+++ /dev/null
@@ -1,532 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/* $Rev$ $Date$ */
-
-/**
- * HTTPD module used to eval component implementations.
- */
-
-#include <sys/stat.h>
-
-#include <string>
-#include <iostream>
-#include <sstream>
-#include <fstream>
-
-#include "list.hpp"
-#include "slist.hpp"
-#include "value.hpp"
-#include "element.hpp"
-#include "monad.hpp"
-#include "../atom/atom.hpp"
-#include "../json/json.hpp"
-#include "../eval/driver.hpp"
-#include "../scdl/scdl.hpp"
-#include "../cache/cache.hpp"
-#include "curl.hpp"
-#include "httpd.hpp"
-
-extern "C" {
-extern module AP_MODULE_DECLARE_DATA mod_tuscany_eval;
-}
-
-namespace tuscany {
-namespace httpd {
-namespace modeval {
-
-/**
- * Server configuration.
- */
-class ServerConf {
-public:
- ServerConf() : home("") {
- }
- std::string home;
-};
-
-const ServerConf& serverConf(const request_rec* r) {
- return *(ServerConf*)ap_get_module_config(r->server->module_config, &mod_tuscany_eval);
-}
-
-/**
- * Port number used for wiring requests. Set it to zero to use the current
- * server port number, set it to a port number to direct wiring requests
- * to that port, for debugging or tracing for example.
- */
-int debugWiringPort = 0;
-
-/**
- * Directory configuration.
- */
-class DirConf {
-public:
- DirConf() : contributionPath(""), compositeName(""), componentName(""), implementationPath("") {
- }
- std::string contributionPath;
- std::string compositeName;
- std::string componentName;
- std::string implementationPath;
- cache::cached<failable<value, std::string> > component;
- cache::cached<failable<value, std::string> > implementation;
-};
-
-DirConf& dirConf(const request_rec* r) {
- return *(DirConf*)ap_get_module_config(r->per_dir_config, &mod_tuscany_eval);
-}
-
-/**
- * Evaluate an expression against a component implementation.
- */
-const failable<value, std::string> evalExpr(const value& expr, const value& impl) {
- gc_pool pool;
- eval::Env globalEnv = eval::setupEnvironment(pool);
- if (logContent) {
- std::cout<< "expr: " << expr << std::endl;
- std::cout.flush();
- }
- const value val = eval::evalScript(expr, impl, globalEnv, pool);
- if (logContent) {
- std::cout<< "val: " << val << std::endl;
- std::cout.flush();
- }
-
- if (isNil(val))
- return mkfailure<value, std::string>("Could not evaluate expression");
- return val;
-}
-
-/**
- * Returns a list of param values other than the id and method args from a list
- * of key value pairs.
- */
-const list<value> queryParams(const list<list<value> >& a) {
- if (isNil(a))
- return list<value>();
- const list<value> p = car(a);
- if (car(p) == value("id") || car(p) == value("method"))
- return queryParams(cdr(a));
- return cons(cadr(p), queryParams(cdr(a)));
-}
-
-/**
- * Write an HTTP result.
- */
-const failable<int, std::string> writeResult(const failable<list<std::string>, std::string>& ls, const std::string& ct, request_rec* r) {
- if (!hasValue(ls))
- return mkfailure<int, std::string>(reason(ls));
- std::ostringstream os;
- write(ls, os);
- if (logContent) {
- std::cout<< "content: " << std::endl << os.str() << std::endl;
- std::cout.flush();
- }
-
- const std::string etag(ap_md5(r->pool, (const unsigned char*)std::string(os.str()).c_str()));
- const char* match = apr_table_get(r->headers_in, "If-None-Match");
- apr_table_setn(r->headers_out, "ETag", apr_pstrdup(r->pool, etag.c_str()));
- if (match != NULL && etag == match) {
- r->status = HTTP_NOT_MODIFIED;
- return OK;
- }
- ap_set_content_type(r, ct.c_str());
- ap_rputs(std::string(os.str()).c_str(), r);
- return OK;
-}
-
-/**
- * Handle an HTTP GET.
- */
-const failable<int, std::string> get(request_rec* r, const value& impl, const list<value>& px) {
-
- // Inspect the query string
- const list<list<value> > args = queryArgs(r);
- const list<value> ia = assoc(value("id"), args);
- const list<value> ma = assoc(value("method"), args);
-
- // Evaluate a JSON-RPC request and return a JSON result
- if (!isNil(ia) && !isNil(ma)) {
-
- // Extract the request id, method and params
- const value id = cadr(ia);
- const value func = std::string(cadr(ma)).c_str();
- const list<value> params = queryParams(args);
-
- // Evaluate the request expression
- const failable<value, std::string> val = evalExpr(cons<value>(func, eval::quotedParameters(append(params, px))), impl);
- if (!hasValue(val))
- return mkfailure<int, std::string>(reason(val));
-
- // Return JSON result
- json::JSONContext cx;
- return writeResult(json::jsonResult(id, val, cx), "application/json-rpc", r);
- }
-
- // Evaluate an ATOM GET request and return an ATOM feed
- const list<value> id(path(r->path_info));
- if (isNil(id)) {
- const failable<value, std::string> val = evalExpr(cons<value>("getall", eval::quotedParameters(px)), impl);
- if (!hasValue(val))
- return mkfailure<int, std::string>(reason(val));
- const value feed = val;
- return writeResult(atom::writeATOMFeed(atom::feedValuesToElements(feed)), "application/atom+xml;type=feed", r);
- }
-
- // Evaluate an ATOM GET and return an ATOM entry
- const failable<value, std::string> val = evalExpr(cons<value>("get", eval::quotedParameters(cons<value>(car(id), px))), impl);
- if (!hasValue(val))
- return mkfailure<int, std::string>(reason(val));
- const value entry = val;
- return writeResult(atom::writeATOMEntry(atom::entryValuesToElements(entry)), "application/atom+xml;type=entry", r);
-
-}
-
-/**
- * Read the content of a POST.
- */
-const list<std::string> read(request_rec* r) {
- char b[2048];
- const int n = ap_get_client_block(r, b, 2048);
- if (n <= 0)
- return list<std::string>();
- return cons(std::string(b, n), read(r));
-}
-
-/**
- * Convert a URI value to an absolute URL.
- */
-const char* url(const value& v, request_rec* r) {
- std::string u = r->uri;
- u.append("/");
- u.append(v);
- return ap_construct_url(r->pool, u.c_str(), r);
-}
-
-/**
- * Convert an ATOM entry to a value.
- */
-const value feedEntry(const list<value>& e) {
- const list<value> v = elementsToValues(mklist<value>(caddr(e)));
- return cons(car(e), mklist<value>(cadr(e), cdr<value>(car(v))));
-}
-
-/**
- * Handle an HTTP POST.
- */
-const failable<int, std::string> post(request_rec* r, const value& impl, const list<value>& px) {
- const list<std::string> ls = read(r);
- if (logContent) {
- std::cout<< "content: " << std::endl;
- write(ls, std::cout);
- std::cout<< std::endl;
- std::cout.flush();
- }
-
- // Evaluate a JSON-RPC request and return a JSON result
- const std::string ct = contentType(r);
- if (ct.find("application/json-rpc") != std::string::npos || ct.find("text/plain") != std::string::npos) {
- json::JSONContext cx;
- const list<value> json = elementsToValues(json::readJSON(ls, cx));
- const list<list<value> > args = postArgs(json);
-
- // Extract the request id, method and params
- const value id = cadr(assoc(value("id"), args));
- const value func = std::string(cadr(assoc(value("method"), args))).c_str();
- const list<value> params = (list<value>)cadr(assoc(value("params"), args));
-
- // Evaluate the request expression
- const failable<value, std::string> val = evalExpr(cons<value>(func, eval::quotedParameters(append(params, px))), impl);
- if (!hasValue(val))
- return mkfailure<int, std::string>(reason(val));
-
- // Return JSON result
- return writeResult(json::jsonResult(id, val, cx), "application/json-rpc", r);
- }
-
- // Evaluate an ATOM POST request and return the created resource location
- if (ct.find("application/atom+xml") != std::string::npos) {
-
- // Evaluate the request expression
- const value entry = feedEntry(atom::readEntry(ls));
- const failable<value, std::string> val = evalExpr(cons<value>("post", eval::quotedParameters(cons<value>(entry, px))), impl);
- if (!hasValue(val))
- return mkfailure<int, std::string>(reason(val));
-
- // Return the created resource location
- apr_table_setn(r->headers_out, "Location", apr_pstrdup(r->pool, url(val, r)));
- r->status = HTTP_CREATED;
- return OK;
- }
-
- return HTTP_NOT_IMPLEMENTED;
-}
-
-/**
- * Handle an HTTP PUT.
- */
-const failable<int, std::string> put(request_rec* r, const value& impl, const list<value>& px) {
- const list<std::string> ls = read(r);
- if (logContent) {
- std::cout<< "content: " << std::endl;
- write(ls, std::cout);
- std::cout<< std::endl;
- std::cout.flush();
- }
-
- // Evaluate an ATOM PUT request
- const list<value> id(path(r->path_info));
- const value entry = feedEntry(atom::readEntry(ls));
- const failable<value, std::string> val = evalExpr(cons<value>("put", eval::quotedParameters(append(mklist<value>(entry, car(id)), px))), impl);
- if (!hasValue(val))
- return mkfailure<int, std::string>(reason(val));
- if (val == value(false))
- return HTTP_NOT_FOUND;
- return OK;
-}
-
-/**
- * Handle an HTTP DELETE.
- */
-const failable<int, std::string> del(request_rec* r, const value& impl, const list<value>& px) {
-
- // Evaluate an ATOM delete request
- const list<value> id(path(r->path_info));
- const failable<value, std::string> val = evalExpr(cons<value>("delete", eval::quotedParameters(cons<value>(car(id), px))), impl);
- if (!hasValue(val))
- return mkfailure<int, std::string>(reason(val));
- if (val == value(false))
- return HTTP_NOT_FOUND;
- return OK;
-}
-
-/**
- * Report request execution status.
- */
-const int reportStatus(const failable<int, std::string>& rc) {
- if (!hasValue(rc))
- return HTTP_INTERNAL_SERVER_ERROR;
- return rc;
-}
-
-/**
- * Read the SCDL configuration of a component.
- */
-const failable<value, std::string> readComponent(const std::string& path, const std::string& name) {
-
- // Read composite
- std::ifstream is(path);
- if (is.fail() || is.bad())
- return mkfailure<value, std::string>("Could not read composite: " + path);
-
- // Return the component
- const list<value> c = scdl::components(readXML(streamList(is)));
- const value comp = scdl::named(name, c);
- if (isNil(comp))
- return mkfailure<value, std::string>("Could not find component: " + name);
- return comp;
-}
-
-const cache::cached<failable<value, std::string> > component(DirConf* conf) {
- const std::string path(conf->contributionPath + conf->compositeName);
- const lambda<failable<value, std::string>(std::string, std::string)> rc(readComponent);
- const lambda<unsigned long(std::string)> ft(cache::latestFileTime);
- return cache::cached<failable<value, std::string> >(curry(rc, path, conf->componentName), curry(ft, path));
-}
-
-/**
- * Read a component implementation.
- */
-const failable<value, std::string> readImplementation(const std::string path) {
- std::ifstream is(path.c_str(), std::ios_base::in);
- if (is.fail() || is.bad())
- return mkfailure<value, std::string>("Could not read implementation: " + path);
- const value impl = eval::readScript(is);
- if (isNil(impl))
- return mkfailure<value, std::string>("Could not read implementation: " + path);
- return impl;
-}
-
-const cache::cached<failable<value, std::string> > implementation(const std::string& path) {
- const lambda<failable<value, std::string>(std::string)> ri(readImplementation);
- const lambda<unsigned long(std::string)> ft(cache::latestFileTime);
- return cache::cached<failable<value, std::string> >(curry(ri, path), curry(ft, path));
-}
-
-/**
- * Convert a list of component references to a list of HTTP proxy lambdas.
- */
-const value mkproxy(const value& ref, const std::string& base, const http::CURLHandle& ch) {
- return eval::primitiveProcedure(http::proxy(base + std::string(scdl::name(ref)), ch));
-}
-
-const list<value> proxies(const list<value>& refs, const std::string& base, const http::CURLHandle& ch) {
- if (isNil(refs))
- return refs;
- return cons(mkproxy(car(refs), base, ch), proxies(cdr(refs), base, ch));
-}
-
-/**
- * HTTP request handler.
- */
-int handler(request_rec *r) {
- if(strcmp(r->handler, "mod_tuscany_eval"))
- return DECLINED;
-
- // Log the request
- if(logRequests)
- logRequest(r, "mod_tuscany_eval::handler");
-
- // Set up the read policy
- const int rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
- if(rc != OK)
- return rc;
- ap_should_client_block(r);
- if(r->read_chunked == true && r->remaining == 0)
- r->chunked = true;
- //apr_table_setn(r->headers_out, "Connection", "close");
-
- // Retrieve the latest component configuration
- DirConf& conf = dirConf(r);
- conf.component = cache::latest(conf.component);
- const failable<value, std::string> comp(conf.component);
- if (!hasValue(comp))
- return HTTP_NOT_FOUND;
-
- // Retrieve the latest implementation
- const std::string path = conf.contributionPath + std::string(scdl::uri(scdl::implementation(comp)));
- if (path != conf.implementationPath) {
- conf.implementationPath = path;
- conf.implementation = cache::latest(implementation(path));
- }
- else
- conf.implementation = cache::latest(conf.implementation);
- const failable<value, std::string> impl(conf.implementation);
- if (!hasValue(impl))
- return HTTP_NOT_FOUND;
-
- // Convert component references to configured proxy lambdas
- std::ostringstream base;
- base << "http://localhost:" << (debugWiringPort == 0? ap_get_server_port(r) : debugWiringPort) << "/references/" << std::string(scdl::name(comp)) << "/";
- http::CURLHandle ch;
- const list<value> px(proxies(scdl::references(comp), base.str(), ch));
-
- // Handle HTTP method
- if (r->header_only)
- return OK;
- if(r->method_number == M_GET)
- return reportStatus(get(r, impl, px));
- if(r->method_number == M_POST)
- return reportStatus(post(r, impl, px));
- if(r->method_number == M_PUT)
- return reportStatus(put(r, impl, px));
- if(r->method_number == M_DELETE)
- return reportStatus(del(r, impl, px));
- return HTTP_NOT_IMPLEMENTED;
-}
-
-/**
- * Configuration commands.
- */
-const char *confHome(cmd_parms *cmd, void *dummy, const char *arg) {
- ServerConf *c = (ServerConf*)ap_get_module_config(cmd->server->module_config, &mod_tuscany_eval);
- c->home = arg;
- return NULL;
-}
-const char *confContribution(cmd_parms *cmd, void *c, const char *arg) {
- DirConf* conf = (DirConf*)c;
- conf->contributionPath = arg;
- conf->component = component(conf);
- return NULL;
-}
-const char *confComposite(cmd_parms *cmd, void *c, const char *arg) {
- DirConf* conf = (DirConf*)c;
- conf->compositeName = arg;
- conf->component = component(conf);
- return NULL;
-}
-const char *confComponent(cmd_parms *cmd, void *c, const char *arg) {
- DirConf* conf = (DirConf*)c;
- conf->componentName = arg;
- conf->component = component(conf);
- return NULL;
-}
-
-void *makeDirConf(apr_pool_t *p, char *dirspec) {
- DirConf* c = new (apr_palloc(p, sizeof(DirConf))) DirConf();
- apr_pool_cleanup_register(p, c, gc_pool_cleanupCallback<DirConf>, apr_pool_cleanup_null) ;
- return c;
-}
-void* makeServerConf(apr_pool_t *p, server_rec *s) {
- ServerConf* c = new (apr_palloc(p, sizeof(ServerConf))) ServerConf();
- apr_pool_cleanup_register(p, c, gc_pool_cleanupCallback<ServerConf>, apr_pool_cleanup_null) ;
- return c;
-}
-
-/**
- * HTTP server module declaration.
- */
-const command_rec commands[] = {
- AP_INIT_TAKE1("TuscanyHome", (const char*(*)())confHome, NULL, RSRC_CONF, "Tuscany home directory"),
- AP_INIT_TAKE1("SCAContribution", (const char*(*)())confContribution, NULL, ACCESS_CONF, "SCA contribution location"),
- AP_INIT_TAKE1("SCAComposite", (const char*(*)())confComposite, NULL, ACCESS_CONF, "SCA composite location"),
- AP_INIT_TAKE1("SCAComponent", (const char*(*)())confComponent, NULL, ACCESS_CONF, "SCA component name"),
- {NULL}
-};
-
-int postConfig(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) {
- return OK;
-}
-
-void childInit(apr_pool_t* p, server_rec* svr_rec) {
- ServerConf *c = (ServerConf*)ap_get_module_config(svr_rec->module_config, &mod_tuscany_eval);
- if(c == NULL) {
- std::cerr << "[Tuscany] Due to one or more errors mod_tuscany_eval loading failed. Causing apache to stop loading." << std::endl;
- exit(APEXIT_CHILDFATAL);
- }
-}
-
-void registerHooks(apr_pool_t *p) {
- ap_hook_post_config(postConfig, NULL, NULL, APR_HOOK_MIDDLE);
- ap_hook_child_init(childInit, NULL, NULL, APR_HOOK_MIDDLE);
- ap_hook_handler(handler, NULL, NULL, APR_HOOK_MIDDLE);
-}
-
-}
-}
-}
-
-extern "C" {
-
-module AP_MODULE_DECLARE_DATA mod_tuscany_eval = {
- STANDARD20_MODULE_STUFF,
- // dir config
- tuscany::httpd::modeval::makeDirConf,
- // dir merger, default is to override
- NULL,
- // server config
- tuscany::httpd::modeval::makeServerConf,
- // merge server config
- NULL,
- // command table
- tuscany::httpd::modeval::commands,
- // register hooks
- tuscany::httpd::modeval::registerHooks
-};
-
-}
diff --git a/cpp/sca/modules/http/mod-wiring.cpp b/cpp/sca/modules/http/mod-wiring.cpp
deleted file mode 100644
index 965d5a87fb..0000000000
--- a/cpp/sca/modules/http/mod-wiring.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/* $Rev$ $Date$ */
-
-/**
- * HTTPD module used to wire components.
- */
-
-#include <sys/stat.h>
-
-#include <string>
-#include <iostream>
-#include <sstream>
-#include <fstream>
-
-#include "list.hpp"
-#include "slist.hpp"
-#include "value.hpp"
-#include "monad.hpp"
-#include "../scdl/scdl.hpp"
-#include "../cache/cache.hpp"
-#include "httpd.hpp"
-
-extern "C" {
-extern module AP_MODULE_DECLARE_DATA mod_tuscany_wiring;
-}
-
-namespace tuscany {
-namespace httpd {
-namespace modwiring {
-
-/**
- * Server configuration.
- */
-class ServerConf {
-public:
- std::string home;
- ServerConf() : home("") {
- }
-};
-
-const ServerConf& serverConf(const request_rec* r) {
- return *(ServerConf*)ap_get_module_config(r->server->module_config, &mod_tuscany_wiring);
-}
-
-/**
- * Set to true to wire using mod_proxy, false to wire using HTTP client redirects.
- */
-const bool useModProxy = true;
-
-/**
- * Directory configuration.
- */
-class DirConf {
-public:
- DirConf() : contributionPath(""), compositeName("") {
- }
- std::string contributionPath;
- std::string compositeName;
- cache::cached<failable<list<value>, std::string> > components;
-};
-
-DirConf& dirConf(const request_rec* r) {
- return *(DirConf*)ap_get_module_config(r->per_dir_config, &mod_tuscany_wiring);
-}
-
-/**
- * Read the SCDL configuration of the deployed components.
- */
-const failable<list<value>, std::string> readComponents(const std::string& path) {
- std::ifstream is(path);
- if (is.fail() || is.bad())
- return mkfailure<list<value>, std::string>("Could not read composite: " + path);
- return scdl::components(readXML(streamList(is)));
-}
-
-const cache::cached<failable<list<value>, std::string> > components(DirConf* conf) {
- const std::string path(conf->contributionPath + conf->compositeName);
- const lambda<failable<list<value>, std::string>(std::string)> rc(readComponents);
- const lambda<unsigned long(std::string)> ft(cache::latestFileTime);
- return cache::cached<failable<list<value>, std::string> >(curry(rc, path), curry(ft, path));
-}
-
-/**
- * Returns true if a URI is absolute.
- */
-const bool isAbsolute(const std::string& uri) {
- return uri.find("://") != std::string::npos;
-}
-
-/**
- * Translate an HTTP request URI. Wire a URI in the form /references/component-name/reference-name
- * to the target of the reference.
- */
-int translate(request_rec *r) {
- if (strncmp(r->uri, "/references/", 12) != 0)
- return DECLINED;
- const list<value> rpath(path(r->uri));
-
- // Log the request
- if(logRequests)
- logRequest(r, "mod_tuscany_wiring::translate");
-
- // Find the requested component, reference and its target configuration
- DirConf& conf = dirConf(r);
- conf.components = cache::latest(conf.components);
- const failable<list<value>, std::string> comps(conf.components);
- if (!hasValue(comps))
- return HTTP_INTERNAL_SERVER_ERROR;
- const value comp(scdl::named(cadr(rpath), list<value>(comps)));
- if (isNil(comp))
- return HTTP_NOT_FOUND;
- const value ref(scdl::named(caddr(rpath), scdl::references(comp)));
- if (isNil(ref))
- return HTTP_NOT_FOUND;
- const std::string target(scdl::target(ref));
-
- // Absolute target URI
- if (isAbsolute(target)) {
-
- // Wire using mod_proxy
- if (useModProxy) {
- r->filename = apr_pstrdup(r->pool, std::string("proxy:" + target).c_str());
- r->proxyreq = PROXYREQ_REVERSE;
- r->handler = "proxy-server";
- return OK;
- }
-
- // Wire using an HTTP client redirect
- r->status = HTTP_MOVED_TEMPORARILY;
- apr_table_setn(r->headers_out, "Location", apr_pstrdup(r->pool, target.c_str()));
- r->handler = "mod_tuscany_wiring";
- return OK;
-
- }
-
- // Local internal redirect
- r->filename = apr_pstrdup(r->pool, std::string("/redirect:/" + target).c_str());
- r->handler = "mod_tuscany_wiring";
- return OK;
-}
-
-/**
- * Construct a redirect URI.
- */
-const std::string redirect(const std::string& file, const std::string& pi) {
- return file + pi;
-}
-
-const std::string redirect(const std::string& file, const std::string& pi, const std::string& args) {
- return file + pi + "?" + args;
-}
-
-/**
- * HTTP request internal redirect handler.
- */
-int handler(request_rec *r) {
- if(strcmp(r->handler, "mod_tuscany_wiring"))
- return DECLINED;
-
- // Log the request
- if(logRequests)
- logRequest(r, "mod_tuscany_wiring::handler");
-
- // Do an internal redirect
- if (r->filename == NULL || strncmp(r->filename, "/redirect:", 10) != 0)
- return DECLINED;
- if (r->args == NULL) {
- ap_internal_redirect(apr_pstrdup(r->pool, redirect(r->filename + 10, r->path_info).c_str()), r);
- return OK;
- }
- ap_internal_redirect(apr_pstrdup(r->pool, redirect(r->filename + 10, r->path_info, r->args).c_str()), r);
- return OK;
-}
-
-/**
- * Configuration commands.
- */
-const char *confHome(cmd_parms *cmd, void *dummy, const char *arg) {
- ServerConf *c = (ServerConf*)ap_get_module_config(cmd->server->module_config, &mod_tuscany_wiring);
- c->home = arg;
- return NULL;
-}
-const char *confContribution(cmd_parms *cmd, void *c, const char *arg) {
- DirConf* conf = (DirConf*)c;
- conf->contributionPath = arg;
- conf->components = components(conf);
- return NULL;
-}
-const char *confComposite(cmd_parms *cmd, void *c, const char *arg) {
- DirConf* conf = (DirConf*)c;
- conf->compositeName = arg;
- conf->components = components(conf);
- return NULL;
-}
-
-void *makeDirConf(apr_pool_t *p, char *dirspec) {
- DirConf* c = new (apr_palloc(p, sizeof(DirConf))) DirConf();
- apr_pool_cleanup_register(p, c, gc_pool_cleanupCallback<DirConf>, apr_pool_cleanup_null) ;
- return c;
-}
-void* makeServerConf(apr_pool_t *p, server_rec *s) {
- ServerConf* c = new (apr_palloc(p, sizeof(ServerConf))) ServerConf();
- apr_pool_cleanup_register(p, c, gc_pool_cleanupCallback<ServerConf>, apr_pool_cleanup_null) ;
- return c;
-}
-
-/**
- * HTTP server module declaration.
- */
-const command_rec commands[] = {
- AP_INIT_TAKE1("TuscanyHome", (const char*(*)())confHome, NULL, RSRC_CONF, "Tuscany home directory"),
- AP_INIT_TAKE1("SCAContribution", (const char*(*)())confContribution, NULL, ACCESS_CONF, "SCA contribution location"),
- AP_INIT_TAKE1("SCAComposite", (const char*(*)())confComposite, NULL, ACCESS_CONF, "SCA composite location"),
- {NULL}
-};
-
-int postConfig(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) {
- return OK;
-}
-
-void childInit(apr_pool_t* p, server_rec* svr_rec) {
- ServerConf *conf = (ServerConf*)ap_get_module_config(svr_rec->module_config, &mod_tuscany_wiring);
- if(conf == NULL) {
- std::cerr << "[Tuscany] Due to one or more errors mod_tuscany_wiring loading failed. Causing apache to stop loading." << std::endl;
- exit(APEXIT_CHILDFATAL);
- }
-}
-
-void registerHooks(apr_pool_t *p) {
- ap_hook_post_config(postConfig, NULL, NULL, APR_HOOK_MIDDLE);
- ap_hook_child_init(childInit, NULL, NULL, APR_HOOK_MIDDLE);
- ap_hook_handler(handler, NULL, NULL, APR_HOOK_MIDDLE);
- ap_hook_translate_name(translate, NULL, NULL, APR_HOOK_FIRST);
-}
-
-}
-}
-}
-
-extern "C" {
-
-module AP_MODULE_DECLARE_DATA mod_tuscany_wiring = {
- STANDARD20_MODULE_STUFF,
- // dir config
- tuscany::httpd::modwiring::makeDirConf,
- // dir merger, default is to override
- NULL,
- // server config
- tuscany::httpd::modwiring::makeServerConf,
- // merge server config
- NULL,
- // command table
- tuscany::httpd::modwiring::commands,
- // register hooks
- tuscany::httpd::modwiring::registerHooks
-};
-
-}
diff --git a/cpp/sca/modules/http/wiring-test b/cpp/sca/modules/http/wiring-test
deleted file mode 100755
index 0c3f36b513..0000000000
--- a/cpp/sca/modules/http/wiring-test
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/bin/sh
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-echo "Testing..."
-
-# Setup
-./httpd-conf tmp 8092 htdocs
-cat >>tmp/conf/httpd.conf <<EOF
-
-<Location /test>
-SetHandler mod_tuscany_eval
-SCAContribution `pwd`/
-SCAComposite httpd-test.composite
-SCAComponent httpd-test
-</Location>
-
-<Location /client>
-SetHandler mod_tuscany_eval
-SCAContribution /home/delfinoj/SCAZone/Source/tuscany-cpp/sca/modules/http/
-SCAComposite httpd-test.composite
-SCAComponent httpd-client
-</Location>
-
-<Location /references>
-SetHandler mod_tuscany_wiring
-SCAContribution `pwd`/
-SCAComposite httpd-test.composite
-</Location>
-EOF
-
-apachectl -k start -d `pwd`/tmp
-sleep 1
-
-# Test HTTP GET
-curl http://localhost:8092/index.html 2>/dev/null >tmp/index.html
-diff tmp/index.html htdocs/index.html
-rc=$?
-
-# Test ATOMPub
-if [ "$rc" = "0" ]; then
- curl http://localhost:8092/client/ >tmp/feed.xml 2>/dev/null
- diff tmp/feed.xml htdocs/feed.xml
- rc=$?
-fi
-if [ "$rc" = "0" ]; then
- curl http://localhost:8092/client/111 >tmp/entry.xml 2>/dev/null
- diff tmp/entry.xml htdocs/entry.xml
- rc=$?
-fi
-if [ "$rc" = "0" ]; then
- curl http://localhost:8092/client/ -X POST -H "Content-type: application/atom+xml" --data @htdocs/entry.xml 2>/dev/null
- rc=$?
-fi
-if [ "$rc" = "0" ]; then
- curl http://localhost:8092/client/111 -X PUT -H "Content-type: application/atom+xml" --data @htdocs/entry.xml 2>/dev/null
- rc=$?
-fi
-if [ "$rc" = "0" ]; then
- curl http://localhost:8092/client/111 -X DELETE 2>/dev/null
- rc=$?
-fi
-
-# Test JSON-RPC
-if [ "$rc" = "0" ]; then
- curl http://localhost:8092/client/ -X POST -H "Content-type: application/json-rpc" --data @htdocs/json-request.txt >tmp/json-result.txt 2>/dev/null
- diff tmp/json-result.txt htdocs/json-result.txt
- rc=$?
-fi
-
-# Cleanup
-apachectl -k stop -d `pwd`/tmp
-sleep 2
-if [ "$rc" = "0" ]; then
- echo "OK"
-fi
-return $rc