diff options
Diffstat (limited to 'cpp/sca/modules/http')
-rw-r--r-- | cpp/sca/modules/http/Makefile.am | 37 | ||||
-rw-r--r-- | cpp/sca/modules/http/conf/mime.types | 607 | ||||
-rw-r--r-- | cpp/sca/modules/http/curl-test.cpp | 253 | ||||
-rw-r--r-- | cpp/sca/modules/http/curl.hpp | 348 | ||||
-rw-r--r-- | cpp/sca/modules/http/htdocs/entry.xml | 2 | ||||
-rw-r--r-- | cpp/sca/modules/http/htdocs/feed.xml | 2 | ||||
-rw-r--r-- | cpp/sca/modules/http/htdocs/index.html | 21 | ||||
-rw-r--r-- | cpp/sca/modules/http/htdocs/json-request.txt | 1 | ||||
-rw-r--r-- | cpp/sca/modules/http/htdocs/json-result.txt | 1 | ||||
-rwxr-xr-x | cpp/sca/modules/http/http-test | 42 | ||||
-rw-r--r-- | cpp/sca/modules/http/httpd-client.scm | 25 | ||||
-rwxr-xr-x | cpp/sca/modules/http/httpd-conf | 37 | ||||
-rwxr-xr-x | cpp/sca/modules/http/httpd-test | 79 | ||||
-rw-r--r-- | cpp/sca/modules/http/httpd-test.composite | 42 | ||||
-rw-r--r-- | cpp/sca/modules/http/httpd-test.scm | 29 | ||||
-rw-r--r-- | cpp/sca/modules/http/httpd.hpp | 159 | ||||
-rw-r--r-- | cpp/sca/modules/http/mod-eval.cpp | 532 | ||||
-rw-r--r-- | cpp/sca/modules/http/mod-wiring.cpp | 276 | ||||
-rwxr-xr-x | cpp/sca/modules/http/wiring-test | 92 |
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 |