1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996 |
- <?php
- $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = 9;
- class nusoap_base {
-
- public $title = 'NuSOAP';
-
- public $version = '0.7.3';
-
- public $revision = '$Revision: 1.114 $';
-
- public $error_str = '';
-
- public $debug_str = '';
-
- public $charencoding = true;
-
- public $debugLevel;
-
- public $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema';
-
- public $soap_defencoding = 'ISO-8859-1';
-
-
- public $namespaces = array(
- 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
- 'xsd' => 'http://www.w3.org/2001/XMLSchema',
- 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
- 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/'
- );
-
- public $usedNamespaces = array();
-
- public $typemap = array(
- 'http://www.w3.org/2001/XMLSchema' => array(
- 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double',
- 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'',
- 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string',
-
- 'anyType'=>'string','anySimpleType'=>'string',
-
- 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'',
- 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer',
- 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer',
- 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''),
- 'http://www.w3.org/2000/10/XMLSchema' => array(
- 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double',
- 'float'=>'double','dateTime'=>'string',
- 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'),
- 'http://www.w3.org/1999/XMLSchema' => array(
- 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double',
- 'float'=>'double','dateTime'=>'string',
- 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'),
- 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'),
- 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'),
- 'http://xml.apache.org/xml-soap' => array('Map')
- );
-
- public $xmlEntities = array('quot' => '"','amp' => '&',
- 'lt' => '<','gt' => '>','apos' => "'");
-
- function nusoap_base() {
- $this->debugLevel = $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel;
- }
-
- function getGlobalDebugLevel() {
- return $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel;
- }
-
- function setGlobalDebugLevel($level) {
- $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = $level;
- }
-
- function getDebugLevel() {
- return $this->debugLevel;
- }
-
- function setDebugLevel($level) {
- $this->debugLevel = $level;
- }
-
- function debug($string){
- if ($this->debugLevel > 0) {
- $this->appendDebug($this->getmicrotime().' '.get_class($this).": $string\n");
- }
- }
-
- function appendDebug($string){
- if ($this->debugLevel > 0) {
-
-
- $this->debug_str .= $string;
- }
- }
-
- function clearDebug() {
-
-
- $this->debug_str = '';
- }
-
- function &getDebug() {
-
-
- return $this->debug_str;
- }
-
- function &getDebugAsXMLComment() {
-
-
- while (strpos($this->debug_str, '--')) {
- $this->debug_str = str_replace('--', '- -', $this->debug_str);
- }
- $ret = "<!--\n" . $this->debug_str . "\n-->";
- return $ret;
- }
-
- function expandEntities($val) {
- if ($this->charencoding) {
- $val = str_replace('&', '&', $val);
- $val = str_replace("'", ''', $val);
- $val = str_replace('"', '"', $val);
- $val = str_replace('<', '<', $val);
- $val = str_replace('>', '>', $val);
- }
- return $val;
- }
-
- function getError(){
- if($this->error_str != ''){
- return $this->error_str;
- }
- return false;
- }
-
- function setError($str){
- $this->error_str = $str;
- }
-
- function isArraySimpleOrStruct($val) {
- $keyList = array_keys($val);
- foreach ($keyList as $keyListValue) {
- if (!is_int($keyListValue)) {
- return 'arrayStruct';
- }
- }
- return 'arraySimple';
- }
-
- function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded',$soapval=false) {
- $this->debug("in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use, soapval=$soapval");
- $this->appendDebug('value=' . $this->varDump($val));
- $this->appendDebug('attributes=' . $this->varDump($attributes));
- if (is_object($val) && get_class($val) == 'soapval' && (! $soapval)) {
- $this->debug("serialize_val: serialize soapval");
- $xml = $val->serialize($use);
- $this->appendDebug($val->getDebug());
- $val->clearDebug();
- $this->debug("serialize_val of soapval returning $xml");
- return $xml;
- }
-
- if (is_numeric($name)) {
- $name = '__numeric_' . $name;
- } elseif (! $name) {
- $name = 'noname';
- }
-
- $xmlns = '';
- if($name_ns){
- $prefix = 'nu'.rand(1000,9999);
- $name = $prefix.':'.$name;
- $xmlns .= " xmlns:$prefix=\"$name_ns\"";
- }
-
- if($type_ns != '' && $type_ns == $this->namespaces['xsd']){
-
-
- $type_prefix = 'xsd';
- } elseif($type_ns){
- $type_prefix = 'ns'.rand(1000,9999);
- $xmlns .= " xmlns:$type_prefix=\"$type_ns\"";
- }
-
- $atts = '';
- if($attributes){
- foreach($attributes as $k => $v){
- $atts .= " $k=\"".$this->expandEntities($v).'"';
- }
- }
-
- if (is_null($val)) {
- $this->debug("serialize_val: serialize null");
- if ($use == 'literal') {
-
- $xml = "<$name$xmlns$atts/>";
- $this->debug("serialize_val returning $xml");
- return $xml;
- } else {
- if (isset($type) && isset($type_prefix)) {
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = '';
- }
- $xml = "<$name$xmlns$type_str$atts xsi:nil=\"true\"/>";
- $this->debug("serialize_val returning $xml");
- return $xml;
- }
- }
-
- if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){
- $this->debug("serialize_val: serialize xsd built-in primitive type");
- if (is_bool($val)) {
- if ($type == 'boolean') {
- $val = $val ? 'true' : 'false';
- } elseif (! $val) {
- $val = 0;
- }
- } else if (is_string($val)) {
- $val = $this->expandEntities($val);
- }
- if ($use == 'literal') {
- $xml = "<$name$xmlns$atts>$val</$name>";
- $this->debug("serialize_val returning $xml");
- return $xml;
- } else {
- $xml = "<$name$xmlns xsi:type=\"xsd:$type\"$atts>$val</$name>";
- $this->debug("serialize_val returning $xml");
- return $xml;
- }
- }
-
- $xml = '';
- switch(true) {
- case (is_bool($val) || $type == 'boolean'):
- $this->debug("serialize_val: serialize boolean");
- if ($type == 'boolean') {
- $val = $val ? 'true' : 'false';
- } elseif (! $val) {
- $val = 0;
- }
- if ($use == 'literal') {
- $xml .= "<$name$xmlns$atts>$val</$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val</$name>";
- }
- break;
- case (is_int($val) || is_long($val) || $type == 'int'):
- $this->debug("serialize_val: serialize int");
- if ($use == 'literal') {
- $xml .= "<$name$xmlns$atts>$val</$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:int\"$atts>$val</$name>";
- }
- break;
- case (is_float($val)|| is_double($val) || $type == 'float'):
- $this->debug("serialize_val: serialize float");
- if ($use == 'literal') {
- $xml .= "<$name$xmlns$atts>$val</$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val</$name>";
- }
- break;
- case (is_string($val) || $type == 'string'):
- $this->debug("serialize_val: serialize string");
- $val = $this->expandEntities($val);
- if ($use == 'literal') {
- $xml .= "<$name$xmlns$atts>$val</$name>";
- } else {
- $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val</$name>";
- }
- break;
- case is_object($val):
- $this->debug("serialize_val: serialize object");
- if (get_class($val) == 'soapval') {
- $this->debug("serialize_val: serialize soapval object");
- $pXml = $val->serialize($use);
- $this->appendDebug($val->getDebug());
- $val->clearDebug();
- } else {
- if (! $name) {
- $name = get_class($val);
- $this->debug("In serialize_val, used class name $name as element name");
- } else {
- $this->debug("In serialize_val, do not override name $name for element name for class " . get_class($val));
- }
- foreach(get_object_vars($val) as $k => $v){
- $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use);
- }
- }
- if(isset($type) && isset($type_prefix)){
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = '';
- }
- if ($use == 'literal') {
- $xml .= "<$name$xmlns$atts>$pXml</$name>";
- } else {
- $xml .= "<$name$xmlns$type_str$atts>$pXml</$name>";
- }
- break;
- break;
- case (is_array($val) || $type):
-
- $valueType = $this->isArraySimpleOrStruct($val);
- if($valueType=='arraySimple' || ereg('^ArrayOf',$type)){
- $this->debug("serialize_val: serialize array");
- $i = 0;
- if(is_array($val) && count($val)> 0){
- foreach($val as $v){
- if(is_object($v) && get_class($v) == 'soapval'){
- $tt_ns = $v->type_ns;
- $tt = $v->type;
- } elseif (is_array($v)) {
- $tt = $this->isArraySimpleOrStruct($v);
- } else {
- $tt = gettype($v);
- }
- $array_types[$tt] = 1;
-
- $xml .= $this->serialize_val($v,'item',false,false,false,false,$use);
- ++$i;
- }
- if(count($array_types) > 1){
- $array_typename = 'xsd:anyType';
- } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) {
- if ($tt == 'integer') {
- $tt = 'int';
- }
- $array_typename = 'xsd:'.$tt;
- } elseif(isset($tt) && $tt == 'arraySimple'){
- $array_typename = 'SOAP-ENC:Array';
- } elseif(isset($tt) && $tt == 'arrayStruct'){
- $array_typename = 'unnamed_struct_use_soapval';
- } else {
-
- if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){
- $array_typename = 'xsd:' . $tt;
- } elseif ($tt_ns) {
- $tt_prefix = 'ns' . rand(1000, 9999);
- $array_typename = "$tt_prefix:$tt";
- $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\"";
- } else {
- $array_typename = $tt;
- }
- }
- $array_type = $i;
- if ($use == 'literal') {
- $type_str = '';
- } else if (isset($type) && isset($type_prefix)) {
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\"";
- }
-
- } else {
- if ($use == 'literal') {
- $type_str = '';
- } else if (isset($type) && isset($type_prefix)) {
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\"";
- }
- }
-
- $xml = "<$name$xmlns$type_str$atts>".$xml."</$name>";
- } else {
-
- $this->debug("serialize_val: serialize struct");
- if(isset($type) && isset($type_prefix)){
- $type_str = " xsi:type=\"$type_prefix:$type\"";
- } else {
- $type_str = '';
- }
- if ($use == 'literal') {
- $xml .= "<$name$xmlns$atts>";
- } else {
- $xml .= "<$name$xmlns$type_str$atts>";
- }
- foreach($val as $k => $v){
-
- if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') {
- $xml .= '<item>';
- $xml .= $this->serialize_val($k,'key',false,false,false,false,$use);
- $xml .= $this->serialize_val($v,'value',false,false,false,false,$use);
- $xml .= '</item>';
- } else {
- $xml .= $this->serialize_val($v,$k,false,false,false,false,$use);
- }
- }
- $xml .= "</$name>";
- }
- break;
- default:
- $this->debug("serialize_val: serialize unknown");
- $xml .= 'not detected, got '.gettype($val).' for '.$val;
- break;
- }
- $this->debug("serialize_val returning $xml");
- return $xml;
- }
-
- function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded',$encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'){
-
-
-
- $this->debug("In serializeEnvelope length=" . strlen($body) . " body (max 1000 characters)=" . substr($body, 0, 1000) . " style=$style use=$use encodingStyle=$encodingStyle");
- $this->debug("headers:");
- $this->appendDebug($this->varDump($headers));
- $this->debug("namespaces:");
- $this->appendDebug($this->varDump($namespaces));
-
- $ns_string = '';
- foreach(array_merge($this->namespaces,$namespaces) as $k => $v){
- $ns_string .= " xmlns:$k=\"$v\"";
- }
- if($encodingStyle) {
- $ns_string = " SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string";
- }
-
- if($headers){
- if (is_array($headers)) {
- $xml = '';
- foreach ($headers as $k => $v) {
- if (is_object($v) && get_class($v) == 'soapval') {
- $xml .= $this->serialize_val($v, false, false, false, false, false, $use);
- } else {
- $xml .= $this->serialize_val($v, $k, false, false, false, false, $use);
- }
- }
- $headers = $xml;
- $this->debug("In serializeEnvelope, serialized array of headers to $headers");
- }
- $headers = "<SOAP-ENV:Header>".$headers."</SOAP-ENV:Header>";
- }
-
- return
- '<?xml version="1.0" encoding="'.$this->soap_defencoding .'"?'.">".
- '<SOAP-ENV:Envelope'.$ns_string.">".
- $headers.
- "<SOAP-ENV:Body>".
- $body.
- "</SOAP-ENV:Body>".
- "</SOAP-ENV:Envelope>";
- }
-
- function formatDump($str){
- $str = htmlspecialchars($str);
- return nl2br($str);
- }
-
- function contractQname($qname){
-
-
- if (strrpos($qname, ':')) {
-
- $name = substr($qname, strrpos($qname, ':') + 1);
-
- $ns = substr($qname, 0, strrpos($qname, ':'));
- $p = $this->getPrefixFromNamespace($ns);
- if ($p) {
- return $p . ':' . $name;
- }
- return $qname;
- } else {
- return $qname;
- }
- }
-
- function expandQname($qname){
-
- if(strpos($qname,':') && !ereg('^http://',$qname)){
-
- $name = substr(strstr($qname,':'),1);
-
- $prefix = substr($qname,0,strpos($qname,':'));
- if(isset($this->namespaces[$prefix])){
- return $this->namespaces[$prefix].':'.$name;
- } else {
- return $qname;
- }
- } else {
- return $qname;
- }
- }
-
- function getLocalPart($str){
- if($sstr = strrchr($str,':')){
-
- return substr( $sstr, 1 );
- } else {
- return $str;
- }
- }
-
- function getPrefix($str){
- if($pos = strrpos($str,':')){
-
- return substr($str,0,$pos);
- }
- return false;
- }
-
- function getNamespaceFromPrefix($prefix){
- if (isset($this->namespaces[$prefix])) {
- return $this->namespaces[$prefix];
- }
-
- return false;
- }
-
- function getPrefixFromNamespace($ns) {
- foreach ($this->namespaces as $p => $n) {
- if ($ns == $n || $ns == $p) {
- $this->usedNamespaces[$p] = $n;
- return $p;
- }
- }
- return false;
- }
-
- function getmicrotime() {
- if (function_exists('gettimeofday')) {
- $tod = gettimeofday();
- $sec = $tod['sec'];
- $usec = $tod['usec'];
- } else {
- $sec = time();
- $usec = 0;
- }
- return strftime('%Y-%m-%d %H:%M:%S', $sec) . '.' . sprintf('%06d', $usec);
- }
-
- function varDump($data) {
- ob_start();
- var_dump($data);
- $ret_val = ob_get_contents();
- ob_end_clean();
- return $ret_val;
- }
-
- function __toString() {
- return $this->varDump($this);
- }
- }
- function timestamp_to_iso8601($timestamp,$utc=true){
- $datestr = date('Y-m-d\TH:i:sO',$timestamp);
- if($utc){
- $eregStr =
- '([0-9]{4})-'.
- '([0-9]{2})-'.
- '([0-9]{2})'.
- 'T'.
- '([0-9]{2}):'.
- '([0-9]{2}):'.
- '([0-9]{2})(\.[0-9]*)?'.
- '(Z|[+\-][0-9]{2}:?[0-9]{2})?';
- if(ereg($eregStr,$datestr,$regs)){
- return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]);
- }
- return false;
- } else {
- return $datestr;
- }
- }
- function iso8601_to_timestamp($datestr){
- $eregStr =
- '([0-9]{4})-'.
- '([0-9]{2})-'.
- '([0-9]{2})'.
- 'T'.
- '([0-9]{2}):'.
- '([0-9]{2}):'.
- '([0-9]{2})(\.[0-9]+)?'.
- '(Z|[+\-][0-9]{2}:?[0-9]{2})?';
- if(ereg($eregStr,$datestr,$regs)){
-
- if($regs[8] != 'Z'){
- $op = substr($regs[8],0,1);
- $h = substr($regs[8],1,2);
- $m = substr($regs[8],strlen($regs[8])-2,2);
- if($op == '-'){
- $regs[4] = $regs[4] + $h;
- $regs[5] = $regs[5] + $m;
- } elseif($op == '+'){
- $regs[4] = $regs[4] - $h;
- $regs[5] = $regs[5] - $m;
- }
- }
- return gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
- } else {
- return false;
- }
- }
- function usleepWindows($usec)
- {
- $start = gettimeofday();
- do
- {
- $stop = gettimeofday();
- $timePassed = 1000000 * ($stop['sec'] - $start['sec'])
- + $stop['usec'] - $start['usec'];
- }
- while ($timePassed < $usec);
- }
- ?><?php
- class nusoap_fault extends nusoap_base {
-
- public $faultcode;
-
- public $faultactor;
-
- public $faultstring;
-
- public $faultdetail;
-
- function nusoap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){
- parent::nusoap_base();
- $this->faultcode = $faultcode;
- $this->faultactor = $faultactor;
- $this->faultstring = $faultstring;
- $this->faultdetail = $faultdetail;
- }
-
- function serialize(){
- $ns_string = '';
- foreach($this->namespaces as $k => $v){
- $ns_string .= "\n xmlns:$k=\"$v\"";
- }
- $return_msg =
- '<?xml version="1.0" encoding="'.$this->soap_defencoding.'"?>'.
- '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"'.$ns_string.">\n".
- '<SOAP-ENV:Body>'.
- '<SOAP-ENV:Fault>'.
- $this->serialize_val($this->faultcode, 'faultcode').
- $this->serialize_val($this->faultactor, 'faultactor').
- $this->serialize_val($this->faultstring, 'faultstring').
- $this->serialize_val($this->faultdetail, 'detail').
- '</SOAP-ENV:Fault>'.
- '</SOAP-ENV:Body>'.
- '</SOAP-ENV:Envelope>';
- return $return_msg;
- }
- }
- class soap_fault extends nusoap_fault {
- }
- ?><?php
- class nusoap_xmlschema extends nusoap_base {
-
- public $schema = '';
- public $xml = '';
-
- public $enclosingNamespaces;
-
- public $schemaInfo = array();
- public $schemaTargetNamespace = '';
-
- public $attributes = array();
- public $complexTypes = array();
- public $complexTypeStack = array();
- public $currentComplexType = null;
- public $elements = array();
- public $elementStack = array();
- public $currentElement = null;
- public $simpleTypes = array();
- public $simpleTypeStack = array();
- public $currentSimpleType = null;
-
- public $imports = array();
-
- public $parser;
- public $position = 0;
- public $depth = 0;
- public $depth_array = array();
- public $message = array();
- public $defaultNamespace = array();
-
- function nusoap_xmlschema($schema='',$xml='',$namespaces=array()){
- parent::nusoap_base();
- $this->debug('nusoap_xmlschema class instantiated, inside constructor');
-
- $this->schema = $schema;
- $this->xml = $xml;
-
- $this->enclosingNamespaces = $namespaces;
- $this->namespaces = array_merge($this->namespaces, $namespaces);
-
- if($schema != ''){
- $this->debug('initial schema file: '.$schema);
- $this->parseFile($schema, 'schema');
- }
-
- if($xml != ''){
- $this->debug('initial xml file: '.$xml);
- $this->parseFile($xml, 'xml');
- }
- }
-
- function parseFile($xml,$type){
-
- if($xml != ""){
- $xmlStr = @join("",@file($xml));
- if($xmlStr == ""){
- $msg = 'Error reading XML from '.$xml;
- $this->setError($msg);
- $this->debug($msg);
- return false;
- } else {
- $this->debug("parsing $xml");
- $this->parseString($xmlStr,$type);
- $this->debug("done parsing $xml");
- return true;
- }
- }
- return false;
- }
-
- function parseString($xml,$type){
-
- if($xml != ""){
-
- $this->parser = xml_parser_create();
-
- xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
-
- xml_set_object($this->parser, $this);
-
- if($type == "schema"){
- xml_set_element_handler($this->parser, 'schemaStartElement','schemaEndElement');
- xml_set_character_data_handler($this->parser,'schemaCharacterData');
- } elseif($type == "xml"){
- xml_set_element_handler($this->parser, 'xmlStartElement','xmlEndElement');
- xml_set_character_data_handler($this->parser,'xmlCharacterData');
- }
-
- if(!xml_parse($this->parser,$xml,true)){
-
- $errstr = sprintf('XML error parsing XML schema on line %d: %s',
- xml_get_current_line_number($this->parser),
- xml_error_string(xml_get_error_code($this->parser))
- );
- $this->debug($errstr);
- $this->debug("XML payload:\n" . $xml);
- $this->setError($errstr);
- }
- xml_parser_free($this->parser);
- } else{
- $this->debug('no xml passed to parseString()!!');
- $this->setError('no xml passed to parseString()!!');
- }
- }
-
- function CreateTypeName($ename) {
- $scope = '';
- for ($i = 0; $i < count($this->complexTypeStack); $i++) {
- $scope .= $this->complexTypeStack[$i] . '_';
- }
- return $scope . $ename . '_ContainedType';
- }
-
- function schemaStartElement($parser, $name, $attrs) {
-
- $pos = $this->position++;
- $depth = $this->depth++;
-
- $this->depth_array[$depth] = $pos;
- $this->message[$pos] = array('cdata' => '');
- if ($depth > 0) {
- $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[$depth - 1]];
- } else {
- $this->defaultNamespace[$pos] = false;
- }
-
- if($prefix = $this->getPrefix($name)){
-
- $name = $this->getLocalPart($name);
- } else {
- $prefix = '';
- }
-
- if(count($attrs) > 0){
- foreach($attrs as $k => $v){
-
- if(ereg("^xmlns",$k)){
-
-
- if($ns_prefix = substr(strrchr($k,':'),1)){
-
- $this->namespaces[$ns_prefix] = $v;
- } else {
- $this->defaultNamespace[$pos] = $v;
- if (! $this->getPrefixFromNamespace($v)) {
- $this->namespaces['ns'.(count($this->namespaces)+1)] = $v;
- }
- }
- if($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema'){
- $this->XMLSchemaVersion = $v;
- $this->namespaces['xsi'] = $v.'-instance';
- }
- }
- }
- foreach($attrs as $k => $v){
-
- $k = strpos($k,':') ? $this->expandQname($k) : $k;
- $v = strpos($v,':') ? $this->expandQname($v) : $v;
- $eAttrs[$k] = $v;
- }
- $attrs = $eAttrs;
- } else {
- $attrs = array();
- }
-
- switch($name){
- case 'all':
- case 'choice':
- case 'group':
- case 'sequence':
-
- $this->complexTypes[$this->currentComplexType]['compositor'] = $name;
-
-
-
- break;
- case 'attribute':
-
- $this->xdebug("parsing attribute:");
- $this->appendDebug($this->varDump($attrs));
- if (!isset($attrs['form'])) {
- $attrs['form'] = $this->schemaInfo['attributeFormDefault'];
- }
- if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) {
- $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
- if (!strpos($v, ':')) {
-
- if ($this->defaultNamespace[$pos]) {
-
- $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] . ':' . $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
- }
- }
- }
- if(isset($attrs['name'])){
- $this->attributes[$attrs['name']] = $attrs;
- $aname = $attrs['name'];
- } elseif(isset($attrs['ref']) && $attrs['ref'] == 'http://schemas.xmlsoap.org/soap/encoding/:arrayType'){
- if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) {
- $aname = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
- } else {
- $aname = '';
- }
- } elseif(isset($attrs['ref'])){
- $aname = $attrs['ref'];
- $this->attributes[$attrs['ref']] = $attrs;
- }
- if($this->currentComplexType){
- $this->complexTypes[$this->currentComplexType]['attrs'][$aname] = $attrs;
- }
-
- if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->getLocalPart($aname) == 'arrayType'){
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'array';
- $prefix = $this->getPrefix($aname);
- if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])){
- $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'];
- } else {
- $v = '';
- }
- if(strpos($v,'[,]')){
- $this->complexTypes[$this->currentComplexType]['multidimensional'] = true;
- }
- $v = substr($v,0,strpos($v,'['));
- if(!strpos($v,':') && isset($this->typemap[$this->XMLSchemaVersion][$v])){
- $v = $this->XMLSchemaVersion.':'.$v;
- }
- $this->complexTypes[$this->currentComplexType]['arrayType'] = $v;
- }
- break;
- case 'complexContent':
- break;
- case 'complexType':
- array_push($this->complexTypeStack, $this->currentComplexType);
- if(isset($attrs['name'])){
-
-
- $this->xdebug('processing named complexType '.$attrs['name']);
-
- $this->currentComplexType = $attrs['name'];
- $this->complexTypes[$this->currentComplexType] = $attrs;
- $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType';
-
-
-
-
-
-
-
- if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){
- $this->xdebug('complexType is unusual array');
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'array';
- } else {
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct';
- }
- } else {
- $name = $this->CreateTypeName($this->currentElement);
- $this->xdebug('processing unnamed complexType for element ' . $this->currentElement . ' named ' . $name);
- $this->currentComplexType = $name;
-
- $this->complexTypes[$this->currentComplexType] = $attrs;
- $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType';
-
-
-
-
-
-
-
- if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){
- $this->xdebug('complexType is unusual array');
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'array';
- } else {
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct';
- }
- }
- break;
- case 'element':
- array_push($this->elementStack, $this->currentElement);
- if (!isset($attrs['form'])) {
- $attrs['form'] = $this->schemaInfo['elementFormDefault'];
- }
- if(isset($attrs['type'])){
- $this->xdebug("processing typed element ".$attrs['name']." of type ".$attrs['type']);
- if (! $this->getPrefix($attrs['type'])) {
- if ($this->defaultNamespace[$pos]) {
- $attrs['type'] = $this->defaultNamespace[$pos] . ':' . $attrs['type'];
- $this->xdebug('used default namespace to make type ' . $attrs['type']);
- }
- }
-
-
-
-
-
-
-
- if ($this->currentComplexType && $this->complexTypes[$this->currentComplexType]['phpType'] == 'array') {
- $this->xdebug('arrayType for unusual array is ' . $attrs['type']);
- $this->complexTypes[$this->currentComplexType]['arrayType'] = $attrs['type'];
- }
- $this->currentElement = $attrs['name'];
- $ename = $attrs['name'];
- } elseif(isset($attrs['ref'])){
- $this->xdebug("processing element as ref to ".$attrs['ref']);
- $this->currentElement = "ref to ".$attrs['ref'];
- $ename = $this->getLocalPart($attrs['ref']);
- } else {
- $type = $this->CreateTypeName($this->currentComplexType . '_' . $attrs['name']);
- $this->xdebug("processing untyped element " . $attrs['name'] . ' type ' . $type);
- $this->currentElement = $attrs['name'];
- $attrs['type'] = $this->schemaTargetNamespace . ':' . $type;
- $ename = $attrs['name'];
- }
- if (isset($ename) && $this->currentComplexType) {
- $this->xdebug("add element $ename to complexType $this->currentComplexType");
- $this->complexTypes[$this->currentComplexType]['elements'][$ename] = $attrs;
- } elseif (!isset($attrs['ref'])) {
- $this->xdebug("add element $ename to elements array");
- $this->elements[ $attrs['name'] ] = $attrs;
- $this->elements[ $attrs['name'] ]['typeClass'] = 'element';
- }
- break;
- case 'enumeration':
- $this->xdebug('enumeration ' . $attrs['value']);
- if ($this->currentSimpleType) {
- $this->simpleTypes[$this->currentSimpleType]['enumeration'][] = $attrs['value'];
- } elseif ($this->currentComplexType) {
- $this->complexTypes[$this->currentComplexType]['enumeration'][] = $attrs['value'];
- }
- break;
- case 'extension':
- $this->xdebug('extension ' . $attrs['base']);
- if ($this->currentComplexType) {
- $this->complexTypes[$this->currentComplexType]['extensionBase'] = $attrs['base'];
- }
- break;
- case 'import':
- if (isset($attrs['schemaLocation'])) {
-
- $this->imports[$attrs['namespace']][] = array('location' => $attrs['schemaLocation'], 'loaded' => false);
- } else {
-
- $this->imports[$attrs['namespace']][] = array('location' => '', 'loaded' => true);
- if (! $this->getPrefixFromNamespace($attrs['namespace'])) {
- $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace'];
- }
- }
- break;
- case 'list':
- break;
- case 'restriction':
- $this->xdebug('restriction ' . $attrs['base']);
- if($this->currentSimpleType){
- $this->simpleTypes[$this->currentSimpleType]['type'] = $attrs['base'];
- } elseif($this->currentComplexType){
- $this->complexTypes[$this->currentComplexType]['restrictionBase'] = $attrs['base'];
- if(strstr($attrs['base'],':') == ':Array'){
- $this->complexTypes[$this->currentComplexType]['phpType'] = 'array';
- }
- }
- break;
- case 'schema':
- $this->schemaInfo = $attrs;
- $this->schemaInfo['schemaVersion'] = $this->getNamespaceFromPrefix($prefix);
- if (isset($attrs['targetNamespace'])) {
- $this->schemaTargetNamespace = $attrs['targetNamespace'];
- }
- if (!isset($attrs['elementFormDefault'])) {
- $this->schemaInfo['elementFormDefault'] = 'unqualified';
- }
- if (!isset($attrs['attributeFormDefault'])) {
- $this->schemaInfo['attributeFormDefault'] = 'unqualified';
- }
- break;
- case 'simpleContent':
- break;
- case 'simpleType':
- array_push($this->simpleTypeStack, $this->currentSimpleType);
- if(isset($attrs['name'])){
- $this->xdebug("processing simpleType for name " . $attrs['name']);
- $this->currentSimpleType = $attrs['name'];
- $this->simpleTypes[ $attrs['name'] ] = $attrs;
- $this->simpleTypes[ $attrs['name'] ]['typeClass'] = 'simpleType';
- $this->simpleTypes[ $attrs['name'] ]['phpType'] = 'scalar';
- } else {
- $name = $this->CreateTypeName($this->currentComplexType . '_' . $this->currentElement);
- $this->xdebug('processing unnamed simpleType for element ' . $this->currentElement . ' named ' . $name);
- $this->currentSimpleType = $name;
-
- $this->simpleTypes[$this->currentSimpleType] = $attrs;
- $this->simpleTypes[$this->currentSimpleType]['phpType'] = 'scalar';
- }
- break;
- case 'union':
- break;
- default:
-
- }
- }
-
- function schemaEndElement($parser, $name) {
-
- $this->depth--;
-
- if(isset($this->depth_array[$this->depth])){
- $pos = $this->depth_array[$this->depth];
- }
-
- if ($prefix = $this->getPrefix($name)){
-
- $name = $this->getLocalPart($name);
- } else {
- $prefix = '';
- }
-
- if($name == 'complexType'){
- $this->xdebug('done processing complexType ' . ($this->currentComplexType ? $this->currentComplexType : '(unknown)'));
- $this->currentComplexType = array_pop($this->complexTypeStack);
-
- }
- if($name == 'element'){
- $this->xdebug('done processing element ' . ($this->currentElement ? $this->currentElement : '(unknown)'));
- $this->currentElement = array_pop($this->elementStack);
- }
- if($name == 'simpleType'){
- $this->xdebug('done processing simpleType ' . ($this->currentSimpleType ? $this->currentSimpleType : '(unknown)'));
- $this->currentSimpleType = array_pop($this->simpleTypeStack);
- }
- }
-
- function schemaCharacterData($parser, $data){
- $pos = $this->depth_array[$this->depth - 1];
- $this->message[$pos]['cdata'] .= $data;
- }
-
- function serializeSchema(){
- $schemaPrefix = $this->getPrefixFromNamespace($this->XMLSchemaVersion);
- $xml = '';
-
- if (sizeof($this->imports) > 0) {
- foreach($this->imports as $ns => $list) {
- foreach ($list as $ii) {
- if ($ii['location'] != '') {
- $xml .= " <$schemaPrefix:import location=\"" . $ii['location'] . '" namespace="' . $ns . "\" />\n";
- } else {
- $xml .= " <$schemaPrefix:import namespace=\"" . $ns . "\" />\n";
- }
- }
- }
- }
-
- foreach($this->complexTypes as $typeName => $attrs){
- $contentStr = '';
-
- if(isset($attrs['elements']) && (count($attrs['elements']) > 0)){
- foreach($attrs['elements'] as $element => $eParts){
- if(isset($eParts['ref'])){
- $contentStr .= " <$schemaPrefix:element ref=\"$element\"/>\n";
- } else {
- $contentStr .= " <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts['type']) . "\"";
- foreach ($eParts as $aName => $aValue) {
-
- if ($aName != 'name' && $aName != 'type') {
- $contentStr .= " $aName=\"$aValue\"";
- }
- }
- $contentStr .= "/>\n";
- }
- }
-
- if (isset($attrs['compositor']) && ($attrs['compositor'] != '')) {
- $contentStr = " <$schemaPrefix:$attrs[compositor]>\n".$contentStr." </$schemaPrefix:$attrs[compositor]>\n";
- }
- }
-
- if(isset($attrs['attrs']) && (count($attrs['attrs']) >= 1)){
- foreach($attrs['attrs'] as $attr => $aParts){
- $contentStr .= " <$schemaPrefix:attribute";
- foreach ($aParts as $a => $v) {
- if ($a == 'ref' || $a == 'type') {
- $contentStr .= " $a=\"".$this->contractQName($v).'"';
- } elseif ($a == 'http://schemas.xmlsoap.org/wsdl/:arrayType') {
- $this->usedNamespaces['wsdl'] = $this->namespaces['wsdl'];
- $contentStr .= ' wsdl:arrayType="'.$this->contractQName($v).'"';
- } else {
- $contentStr .= " $a=\"$v\"";
- }
- }
- $contentStr .= "/>\n";
- }
- }
-
- if (isset($attrs['restrictionBase']) && $attrs['restrictionBase'] != ''){
- $contentStr = " <$schemaPrefix:restriction base=\"".$this->contractQName($attrs['restrictionBase'])."\">\n".$contentStr." </$schemaPrefix:restriction>\n";
-
- if ((isset($attrs['elements']) && count($attrs['elements']) > 0) || (isset($attrs['attrs']) && count($attrs['attrs']) > 0)){
- $contentStr = " <$schemaPrefix:complexContent>\n".$contentStr." </$schemaPrefix:complexContent>\n";
- }
- }
-
- if($contentStr != ''){
- $contentStr = " <$schemaPrefix:complexType name=\"$typeName\">\n".$contentStr." </$schemaPrefix:complexType>\n";
- } else {
- $contentStr = " <$schemaPrefix:complexType name=\"$typeName\"/>\n";
- }
- $xml .= $contentStr;
- }
-
- if(isset($this->simpleTypes) && count($this->simpleTypes) > 0){
- foreach($this->simpleTypes as $typeName => $eParts){
- $xml .= " <$schemaPrefix:simpleType name=\"$typeName\">\n <$schemaPrefix:restriction base=\"".$this->contractQName($eParts['type'])."\">\n";
- if (isset($eParts['enumeration'])) {
- foreach ($eParts['enumeration'] as $e) {
- $xml .= " <$schemaPrefix:enumeration value=\"$e\"/>\n";
- }
- }
- $xml .= " </$schemaPrefix:restriction>\n </$schemaPrefix:simpleType>";
- }
- }
-
- if(isset($this->elements) && count($this->elements) > 0){
- foreach($this->elements as $element => $eParts){
- $xml .= " <$schemaPrefix:element name=\"$element\" type=\"".$this->contractQName($eParts['type'])."\"/>\n";
- }
- }
-
- if(isset($this->attributes) && count($this->attributes) > 0){
- foreach($this->attributes as $attr => $aParts){
- $xml .= " <$schemaPrefix:attribute name=\"$attr\" type=\"".$this->contractQName($aParts['type'])."\"\n/>";
- }
- }
-
- $attr = '';
- foreach ($this->schemaInfo as $k => $v) {
- if ($k == 'elementFormDefault' || $k == 'attributeFormDefault') {
- $attr .= " $k=\"$v\"";
- }
- }
- $el = "<$schemaPrefix:schema$attr targetNamespace=\"$this->schemaTargetNamespace\"\n";
- foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) {
- $el .= " xmlns:$nsp=\"$ns\"";
- }
- $xml = $el . ">\n".$xml."</$schemaPrefix:schema>\n";
- return $xml;
- }
-
- function xdebug($string){
- $this->debug('<' . $this->schemaTargetNamespace . '> '.$string);
- }
-
- function getPHPType($type,$ns){
- if(isset($this->typemap[$ns][$type])){
-
- return $this->typemap[$ns][$type];
- } elseif(isset($this->complexTypes[$type])){
-
- return $this->complexTypes[$type]['phpType'];
- }
- return false;
- }
-
- function getTypeDef($type){
-
- if (substr($type, -1) == '^') {
- $is_element = 1;
- $type = substr($type, 0, -1);
- } else {
- $is_element = 0;
- }
- if((! $is_element) && isset($this->complexTypes[$type])){
- $this->xdebug("in getTypeDef, found complexType $type");
- return $this->complexTypes[$type];
- } elseif((! $is_element) && isset($this->simpleTypes[$type])){
- $this->xdebug("in getTypeDef, found simpleType $type");
- if (!isset($this->simpleTypes[$type]['phpType'])) {
-
-
- $uqType = substr($this->simpleTypes[$type]['type'], strrpos($this->simpleTypes[$type]['type'], ':') + 1);
- $ns = substr($this->simpleTypes[$type]['type'], 0, strrpos($this->simpleTypes[$type]['type'], ':'));
- $etype = $this->getTypeDef($uqType);
- if ($etype) {
- $this->xdebug("in getTypeDef, found type for simpleType $type:");
- $this->xdebug($this->varDump($etype));
- if (isset($etype['phpType'])) {
- $this->simpleTypes[$type]['phpType'] = $etype['phpType'];
- }
- if (isset($etype['elements'])) {
- $this->simpleTypes[$type]['elements'] = $etype['elements'];
- }
- }
- }
- return $this->simpleTypes[$type];
- } elseif(isset($this->elements[$type])){
- $this->xdebug("in getTypeDef, found element $type");
- if (!isset($this->elements[$type]['phpType'])) {
-
- $uqType = substr($this->elements[$type]['type'], strrpos($this->elements[$type]['type'], ':') + 1);
- $ns = substr($this->elements[$type]['type'], 0, strrpos($this->elements[$type]['type'], ':'));
- $etype = $this->getTypeDef($uqType);
- if ($etype) {
- $this->xdebug("in getTypeDef, found type for element $type:");
- $this->xdebug($this->varDump($etype));
- if (isset($etype['phpType'])) {
- $this->elements[$type]['phpType'] = $etype['phpType'];
- }
- if (isset($etype['elements'])) {
- $this->elements[$type]['elements'] = $etype['elements'];
- }
- } elseif ($ns == 'http://www.w3.org/2001/XMLSchema') {
- $this->xdebug("in getTypeDef, element $type is an XSD type");
- $this->elements[$type]['phpType'] = 'scalar';
- }
- }
- return $this->elements[$type];
- } elseif(isset($this->attributes[$type])){
- $this->xdebug("in getTypeDef, found attribute $type");
- return $this->attributes[$type];
- } elseif (ereg('_ContainedType$', $type)) {
- $this->xdebug("in getTypeDef, have an untyped element $type");
- $typeDef['typeClass'] = 'simpleType';
- $typeDef['phpType'] = 'scalar';
- $typeDef['type'] = 'http://www.w3.org/2001/XMLSchema:string';
- return $typeDef;
- }
- $this->xdebug("in getTypeDef, did not find $type");
- return false;
- }
-
- function serializeTypeDef($type){
-
- if($typeDef = $this->getTypeDef($type)){
- $str .= '<'.$type;
- if(is_array($typeDef['attrs'])){
- foreach($typeDef['attrs'] as $attName => $data){
- $str .= " $attName=\"{type = ".$data['type']."}\"";
- }
- }
- $str .= " xmlns=\"".$this->schema['targetNamespace']."\"";
- if(count($typeDef['elements']) > 0){
- $str .= ">";
- foreach($typeDef['elements'] as $element => $eData){
- $str .= $this->serializeTypeDef($element);
- }
- $str .= "</$type>";
- } elseif($typeDef['typeClass'] == 'element') {
- $str .= "></$type>";
- } else {
- $str .= "/>";
- }
- return $str;
- }
- return false;
- }
-
- function typeToForm($name,$type){
-
- if($typeDef = $this->getTypeDef($type)){
-
- if($typeDef['phpType'] == 'struct'){
- $buffer .= '<table>';
- foreach($typeDef['elements'] as $child => $childDef){
- $buffer .= "
- <tr><td align='right'>$childDef[name] (type: ".$this->getLocalPart($childDef['type'])."):</td>
- <td><input type='text' name='parameters[".$name."][$childDef[name]]'></td></tr>";
- }
- $buffer .= '</table>';
-
- } elseif($typeDef['phpType'] == 'array'){
- $buffer .= '<table>';
- for($i=0;$i < 3; $i++){
- $buffer .= "
- <tr><td align='right'>array item (type: $typeDef[arrayType]):</td>
- <td><input type='text' name='parameters[".$name."][]'></td></tr>";
- }
- $buffer .= '</table>';
-
- } else {
- $buffer .= "<input type='text' name='parameters[$name]'>";
- }
- } else {
- $buffer .= "<input type='text' name='parameters[$name]'>";
- }
- return $buffer;
- }
-
- function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType=''){
- $this->complexTypes[$name] = array(
- 'name' => $name,
- 'typeClass' => $typeClass,
- 'phpType' => $phpType,
- 'compositor'=> $compositor,
- 'restrictionBase' => $restrictionBase,
- 'elements' => $elements,
- 'attrs' => $attrs,
- 'arrayType' => $arrayType
- );
- $this->xdebug("addComplexType $name:");
- $this->appendDebug($this->varDump($this->complexTypes[$name]));
- }
-
- function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) {
- $this->simpleTypes[$name] = array(
- 'name' => $name,
- 'typeClass' => $typeClass,
- 'phpType' => $phpType,
- 'type' => $restrictionBase,
- 'enumeration' => $enumeration
- );
- $this->xdebug("addSimpleType $name:");
- $this->appendDebug($this->varDump($this->simpleTypes[$name]));
- }
-
- function addElement($attrs) {
- if (! $this->getPrefix($attrs['type'])) {
- $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['type'];
- }
- $this->elements[ $attrs['name'] ] = $attrs;
- $this->elements[ $attrs['name'] ]['typeClass'] = 'element';
- $this->xdebug("addElement " . $attrs['name']);
- $this->appendDebug($this->varDump($this->elements[ $attrs['name'] ]));
- }
- }
- class XMLSchema extends nusoap_xmlschema {
- }
- ?><?php
- class soapval extends nusoap_base {
-
- public $name;
-
- public $type;
-
- public $value;
-
- public $element_ns;
-
- public $type_ns;
-
- public $attributes;
-
- function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) {
- parent::nusoap_base();
- $this->name = $name;
- $this->type = $type;
- $this->value = $value;
- $this->element_ns = $element_ns;
- $this->type_ns = $type_ns;
- $this->attributes = $attributes;
- }
-
- function serialize($use='encoded') {
- return $this->serialize_val($this->value, $this->name, $this->type, $this->element_ns, $this->type_ns, $this->attributes, $use, true);
- }
-
- function decode(){
- return $this->value;
- }
- }
- ?><?php
- class soap_transport_http extends nusoap_base {
- public $url = '';
- public $uri = '';
- public $digest_uri = '';
- public $scheme = '';
- public $host = '';
- public $port = '';
- public $path = '';
- public $request_method = 'POST';
- public $protocol_version = '1.0';
- public $encoding = '';
- public $outgoing_headers = array();
- public $incoming_headers = array();
- public $incoming_cookies = array();
- public $outgoing_payload = '';
- public $incoming_payload = '';
- public $response_status_line;
- public $useSOAPAction = true;
- public $persistentConnection = false;
- public $ch = false;
- public $ch_options = array();
- public $use_curl = false;
- public $proxy = null;
- public $username = '';
- public $password = '';
- public $authtype = '';
- public $digestRequest = array();
- public $certRequest = array();
-
-
-
-
-
-
-
-
- function soap_transport_http($url, $curl_options = NULL, $use_curl = false){
- parent::nusoap_base();
- $this->debug("ctor url=$url use_curl=$use_curl curl_options:");
- $this->appendDebug($this->varDump($curl_options));
- $this->setURL($url);
- if (is_array($curl_options)) {
- $this->ch_options = $curl_options;
- }
- $this->use_curl = $use_curl;
- ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev);
- $this->setHeader('User-Agent', $this->title.'/'.$this->version.' ('.$rev[1].')');
- }
-
- function setCurlOption($option, $value) {
- $this->debug("setCurlOption option=$option, value=");
- $this->appendDebug($this->varDump($value));
- curl_setopt($this->ch, $option, $value);
- }
-
- function setHeader($name, $value) {
- $this->outgoing_headers[$name] = $value;
- $this->debug("set header $name: $value");
- }
-
- function unsetHeader($name) {
- if (isset($this->outgoing_headers[$name])) {
- $this->debug("unset header $name");
- unset($this->outgoing_headers[$name]);
- }
- }
-
- function setURL($url) {
- $this->url = $url;
- $u = parse_url($url);
- foreach($u as $k => $v){
- $this->debug("parsed URL $k = $v");
- $this->$k = $v;
- }
-
- if(isset($u['query']) && $u['query'] != ''){
- $this->path .= '?' . $u['query'];
- }
-
- if(!isset($u['port'])){
- if($u['scheme'] == 'https'){
- $this->port = 443;
- } else {
- $this->port = 80;
- }
- }
- $this->uri = $this->path;
- $this->digest_uri = $this->uri;
-
- if (!isset($u['port'])) {
- $this->setHeader('Host', $this->host);
- } else {
- $this->setHeader('Host', $this->host.':'.$this->port);
- }
- if (isset($u['user']) && $u['user'] != '') {
- $this->setCredentials(urldecode($u['user']), isset($u['pass']) ? urldecode($u['pass']) : '');
- }
- }
-
- function io_method() {
- if ($this->use_curl || ($this->scheme == 'https') || ($this->scheme == 'http' && $this->authtype == 'ntlm') || ($this->scheme == 'http' && is_array($this->proxy) && $this->proxy['authtype'] == 'ntlm'))
- return 'curl';
- if (($this->scheme == 'http' || $this->scheme == 'ssl') && $this->authtype != 'ntlm' && (!is_array($this->proxy) || $this->proxy['authtype'] != 'ntlm'))
- return 'socket';
- return 'unknown';
- }
-
- function connect($connection_timeout=0,$response_timeout=30){
-
-
-
-
- $this->debug("connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port");
- if ($this->io_method() == 'socket') {
- if (!is_array($this->proxy)) {
- $host = $this->host;
- $port = $this->port;
- } else {
- $host = $this->proxy['host'];
- $port = $this->proxy['port'];
- }
-
- if($this->persistentConnection && isset($this->fp) && is_resource($this->fp)){
- if (!feof($this->fp)) {
- $this->debug('Re-use persistent connection');
- return true;
- }
- fclose($this->fp);
- $this->debug('Closed persistent connection at EOF');
- }
-
- if ($this->scheme == 'ssl') {
- $host = 'ssl://' . $host;
- }
- $this->debug('calling fsockopen with host ' . $host . ' connection_timeout ' . $connection_timeout);
-
- if($connection_timeout > 0){
- $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str, $connection_timeout);
- } else {
- $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str);
- }
-
- if(!$this->fp) {
- $msg = 'Couldn\'t open socket connection to server ' . $this->url;
- if ($this->errno) {
- $msg .= ', Error ('.$this->errno.'): '.$this->error_str;
- } else {
- $msg .= ' prior to connect(). This is often a problem looking up the host name.';
- }
- $this->debug($msg);
- $this->setError($msg);
- return false;
- }
-
- $this->debug('set response timeout to ' . $response_timeout);
- socket_set_timeout( $this->fp, $response_timeout);
- $this->debug('socket connected');
- return true;
- } else if ($this->io_method() == 'curl') {
- if (!extension_loaded('curl')) {
- $this->setError('The PHP cURL Extension is required for HTTPS or NLTM. You will need to re-build or update your PHP to included cURL.');
- return false;
- }
-
- if (defined('CURLOPT_CONNECTIONTIMEOUT'))
- $CURLOPT_CONNECTIONTIMEOUT = CURLOPT_CONNECTIONTIMEOUT;
- else
- $CURLOPT_CONNECTIONTIMEOUT = 78;
- if (defined('CURLOPT_HTTPAUTH'))
- $CURLOPT_HTTPAUTH = CURLOPT_HTTPAUTH;
- else
- $CURLOPT_HTTPAUTH = 107;
- if (defined('CURLOPT_PROXYAUTH'))
- $CURLOPT_PROXYAUTH = CURLOPT_PROXYAUTH;
- else
- $CURLOPT_PROXYAUTH = 111;
- if (defined('CURLAUTH_BASIC'))
- $CURLAUTH_BASIC = CURLAUTH_BASIC;
- else
- $CURLAUTH_BASIC = 1;
- if (defined('CURLAUTH_DIGEST'))
- $CURLAUTH_DIGEST = CURLAUTH_DIGEST;
- else
- $CURLAUTH_DIGEST = 2;
- if (defined('CURLAUTH_NTLM'))
- $CURLAUTH_NTLM = CURLAUTH_NTLM;
- else
- $CURLAUTH_NTLM = 8;
- $this->debug('connect using cURL');
-
- $this->ch = curl_init();
-
- $hostURL = ($this->port != '') ? "$this->scheme://$this->host:$this->port" : "$this->scheme://$this->host";
-
- $hostURL .= $this->path;
- $this->setCurlOption(CURLOPT_URL, $hostURL);
-
- if (ini_get('safe_mode') || ini_get('open_basedir')) {
- $this->debug('safe_mode or open_basedir set, so do not set CURLOPT_FOLLOWLOCATION');
- $this->debug('safe_mode = ');
- $this->appendDebug($this->varDump(ini_get('safe_mode')));
- $this->debug('open_basedir = ');
- $this->appendDebug($this->varDump(ini_get('open_basedir')));
- } else {
- $this->setCurlOption(CURLOPT_FOLLOWLOCATION, 1);
- }
-
- $this->setCurlOption(CURLOPT_HEADER, 1);
-
- $this->setCurlOption(CURLOPT_RETURNTRANSFER, 1);
-
-
-
- if ($this->persistentConnection) {
-
-
-
-
-
- $this->persistentConnection = false;
- $this->setHeader('Connection', 'close');
- }
-
- if ($connection_timeout != 0) {
- $this->setCurlOption($CURLOPT_CONNECTIONTIMEOUT, $connection_timeout);
- }
- if ($response_timeout != 0) {
- $this->setCurlOption(CURLOPT_TIMEOUT, $response_timeout);
- }
- if ($this->scheme == 'https') {
- $this->debug('set cURL SSL verify options');
-
-
-
-
- $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, 0);
- $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, 0);
-
- if ($this->authtype == 'certificate') {
- $this->debug('set cURL certificate options');
- if (isset($this->certRequest['cainfofile'])) {
- $this->setCurlOption(CURLOPT_CAINFO, $this->certRequest['cainfofile']);
- }
- if (isset($this->certRequest['verifypeer'])) {
- $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, $this->certRequest['verifypeer']);
- } else {
- $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, 1);
- }
- if (isset($this->certRequest['verifyhost'])) {
- $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, $this->certRequest['verifyhost']);
- } else {
- $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, 1);
- }
- if (isset($this->certRequest['sslcertfile'])) {
- $this->setCurlOption(CURLOPT_SSLCERT, $this->certRequest['sslcertfile']);
- }
- if (isset($this->certRequest['sslkeyfile'])) {
- $this->setCurlOption(CURLOPT_SSLKEY, $this->certRequest['sslkeyfile']);
- }
- if (isset($this->certRequest['passphrase'])) {
- $this->setCurlOption(CURLOPT_SSLKEYPASSWD, $this->certRequest['passphrase']);
- }
- if (isset($this->certRequest['certpassword'])) {
- $this->setCurlOption(CURLOPT_SSLCERTPASSWD, $this->certRequest['certpassword']);
- }
- }
- }
- if ($this->authtype && ($this->authtype != 'certificate')) {
- if ($this->username) {
- $this->debug('set cURL username/password');
- $this->setCurlOption(CURLOPT_USERPWD, "$this->username:$this->password");
- }
- if ($this->authtype == 'basic') {
- $this->debug('set cURL for Basic authentication');
- $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_BASIC);
- }
- if ($this->authtype == 'digest') {
- $this->debug('set cURL for digest authentication');
- $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_DIGEST);
- }
- if ($this->authtype == 'ntlm') {
- $this->debug('set cURL for NTLM authentication');
- $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_NTLM);
- }
- }
- if (is_array($this->proxy)) {
- $this->debug('set cURL proxy options');
- if ($this->proxy['port'] != '') {
- $this->setCurlOption(CURLOPT_PROXY, $this->proxy['host'].':'.$this->proxy['port']);
- } else {
- $this->setCurlOption(CURLOPT_PROXY, $this->proxy['host']);
- }
- if ($this->proxy['username'] || $this->proxy['password']) {
- $this->debug('set cURL proxy authentication options');
- $this->setCurlOption(CURLOPT_PROXYUSERPWD, $this->proxy['username'].':'.$this->proxy['password']);
- if ($this->proxy['authtype'] == 'basic') {
- $this->setCurlOption($CURLOPT_PROXYAUTH, $CURLAUTH_BASIC);
- }
- if ($this->proxy['authtype'] == 'ntlm') {
- $this->setCurlOption($CURLOPT_PROXYAUTH, $CURLAUTH_NTLM);
- }
- }
- }
- $this->debug('cURL connection set up');
- return true;
- } else {
- $this->setError('Unknown scheme ' . $this->scheme);
- $this->debug('Unknown scheme ' . $this->scheme);
- return false;
- }
- }
-
- function send($data, $timeout=0, $response_timeout=30, $cookies=NULL) {
- $this->debug('entered send() with data of length: '.strlen($data));
- $this->tryagain = true;
- $tries = 0;
- while ($this->tryagain) {
- $this->tryagain = false;
- if ($tries++ < 2) {
-
- if (!$this->connect($timeout, $response_timeout)){
- return false;
- }
-
- if (!$this->sendRequest($data, $cookies)){
- return false;
- }
-
- $respdata = $this->getResponse();
- } else {
- $this->setError("Too many tries to get an OK response ($this->response_status_line)");
- }
- }
- $this->debug('end of send()');
- return $respdata;
- }
-
- function sendHTTPS($data, $timeout=0, $response_timeout=30, $cookies) {
- return $this->send($data, $timeout, $response_timeout, $cookies);
- }
-
- function setCredentials($username, $password, $authtype = 'basic', $digestRequest = array(), $certRequest = array()) {
- $this->debug("setCredentials username=$username authtype=$authtype digestRequest=");
- $this->appendDebug($this->varDump($digestRequest));
- $this->debug("certRequest=");
- $this->appendDebug($this->varDump($certRequest));
-
- if ($authtype == 'basic') {
- $this->setHeader('Authorization', 'Basic '.base64_encode(str_replace(':','',$username).':'.$password));
- } elseif ($authtype == 'digest') {
- if (isset($digestRequest['nonce'])) {
- $digestRequest['nc'] = isset($digestRequest['nc']) ? $digestRequest['nc']++ : 1;
-
-
- $A1 = $username. ':' . (isset($digestRequest['realm']) ? $digestRequest['realm'] : '') . ':' . $password;
-
- $HA1 = md5($A1);
-
- $A2 = $this->request_method . ':' . $this->digest_uri;
-
- $HA2 = md5($A2);
-
-
-
-
-
-
-
-
-
-
- $unhashedDigest = '';
- $nonce = isset($digestRequest['nonce']) ? $digestRequest['nonce'] : '';
- $cnonce = $nonce;
- if ($digestRequest['qop'] != '') {
- $unhashedDigest = $HA1 . ':' . $nonce . ':' . sprintf("%08d", $digestRequest['nc']) . ':' . $cnonce . ':' . $digestRequest['qop'] . ':' . $HA2;
- } else {
- $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2;
- }
- $hashedDigest = md5($unhashedDigest);
- $opaque = '';
- if (isset($digestRequest['opaque'])) {
- $opaque = ', opaque="' . $digestRequest['opaque'] . '"';
- }
- $this->setHeader('Authorization', 'Digest username="' . $username . '", realm="' . $digestRequest['realm'] . '", nonce="' . $nonce . '", uri="' . $this->digest_uri . $opaque . '", cnonce="' . $cnonce . '", nc=' . sprintf("%08x", $digestRequest['nc']) . ', qop="' . $digestRequest['qop'] . '", response="' . $hashedDigest . '"');
- }
- } elseif ($authtype == 'certificate') {
- $this->certRequest = $certRequest;
- $this->debug('Authorization header not set for certificate');
- } elseif ($authtype == 'ntlm') {
-
- $this->debug('Authorization header not set for ntlm');
- }
- $this->username = $username;
- $this->password = $password;
- $this->authtype = $authtype;
- $this->digestRequest = $digestRequest;
- }
-
- function setSOAPAction($soapaction) {
- $this->setHeader('SOAPAction', '"' . $soapaction . '"');
- }
-
- function setEncoding($enc='gzip, deflate') {
- if (function_exists('gzdeflate')) {
- $this->protocol_version = '1.1';
- $this->setHeader('Accept-Encoding', $enc);
- if (!isset($this->outgoing_headers['Connection'])) {
- $this->setHeader('Connection', 'close');
- $this->persistentConnection = false;
- }
- set_magic_quotes_runtime(0);
-
- $this->encoding = $enc;
- }
- }
-
- function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '', $proxyauthtype = 'basic') {
- if ($proxyhost) {
- $this->proxy = array(
- 'host' => $proxyhost,
- 'port' => $proxyport,
- 'username' => $proxyusername,
- 'password' => $proxypassword,
- 'authtype' => $proxyauthtype
- );
- if ($proxyusername != '' && $proxypassword != '' && $proxyauthtype = 'basic') {
- $this->setHeader('Proxy-Authorization', ' Basic '.base64_encode($proxyusername.':'.$proxypassword));
- }
- } else {
- $this->debug('remove proxy');
- $proxy = null;
- unsetHeader('Proxy-Authorization');
- }
- }
-
- function isSkippableCurlHeader(&$data) {
- $skipHeaders = array( 'HTTP/1.1 100',
- 'HTTP/1.0 301',
- 'HTTP/1.1 301',
- 'HTTP/1.0 302',
- 'HTTP/1.1 302',
- 'HTTP/1.0 401',
- 'HTTP/1.1 401',
- 'HTTP/1.0 200 Connection established');
- foreach ($skipHeaders as $hd) {
- $prefix = substr($data, 0, strlen($hd));
- if ($prefix == $hd) return true;
- }
- return false;
- }
-
- function decodeChunked($buffer, $lb){
-
- $length = 0;
- $new = '';
-
-
- $chunkend = strpos($buffer, $lb);
- if ($chunkend == FALSE) {
- $this->debug('no linebreak found in decodeChunked');
- return $new;
- }
- $temp = substr($buffer,0,$chunkend);
- $chunk_size = hexdec( trim($temp) );
- $chunkstart = $chunkend + strlen($lb);
-
- while ($chunk_size > 0) {
- $this->debug("chunkstart: $chunkstart chunk_size: $chunk_size");
- $chunkend = strpos( $buffer, $lb, $chunkstart + $chunk_size);
-
- if ($chunkend == FALSE) {
- $chunk = substr($buffer,$chunkstart);
-
- $new .= $chunk;
- $length += strlen($chunk);
- break;
- }
-
- $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart);
-
- $new .= $chunk;
-
- $length += strlen($chunk);
-
- $chunkstart = $chunkend + strlen($lb);
- $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb);
- if ($chunkend == FALSE) {
- break;
- }
- $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart);
- $chunk_size = hexdec( trim($temp) );
- $chunkstart = $chunkend;
- }
- return $new;
- }
-
- function buildPayload($data, $cookie_str = '') {
-
-
-
-
- $this->setHeader('Content-Length', strlen($data));
-
- if ($this->proxy) {
- $uri = $this->url;
- } else {
- $uri = $this->uri;
- }
- $req = "$this->request_method $uri HTTP/$this->protocol_version";
- $this->debug("HTTP request: $req");
- $this->outgoing_payload = "$req\r\n";
-
- foreach($this->outgoing_headers as $k => $v){
- $hdr = $k.': '.$v;
- $this->debug("HTTP header: $hdr");
- $this->outgoing_payload .= "$hdr\r\n";
- }
-
- if ($cookie_str != '') {
- $hdr = 'Cookie: '.$cookie_str;
- $this->debug("HTTP header: $hdr");
- $this->outgoing_payload .= "$hdr\r\n";
- }
-
- $this->outgoing_payload .= "\r\n";
-
- $this->outgoing_payload .= $data;
- }
-
- function sendRequest($data, $cookies = NULL) {
-
- $cookie_str = $this->getCookiesForRequest($cookies, (($this->scheme == 'ssl') || ($this->scheme == 'https')));
-
- $this->buildPayload($data, $cookie_str);
- if ($this->io_method() == 'socket') {
-
- if(!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) {
- $this->setError('couldn\'t write message data to socket');
- $this->debug('couldn\'t write message data to socket');
- return false;
- }
- $this->debug('wrote data to socket, length = ' . strlen($this->outgoing_payload));
- return true;
- } else if ($this->io_method() == 'curl') {
-
-
-
-
-
- $curl_headers = array();
- foreach($this->outgoing_headers as $k => $v){
- if ($k == 'Connection' || $k == 'Content-Length' || $k == 'Host' || $k == 'Authorization' || $k == 'Proxy-Authorization') {
- $this->debug("Skip cURL header $k: $v");
- } else {
- $curl_headers[] = "$k: $v";
- }
- }
- if ($cookie_str != '') {
- $curl_headers[] = 'Cookie: ' . $cookie_str;
- }
- $this->setCurlOption(CURLOPT_HTTPHEADER, $curl_headers);
- $this->debug('set cURL HTTP headers');
- if ($this->request_method == "POST") {
- $this->setCurlOption(CURLOPT_POST, 1);
- $this->setCurlOption(CURLOPT_POSTFIELDS, $data);
- $this->debug('set cURL POST data');
- } else {
- }
-
- foreach ($this->ch_options as $key => $val) {
- $this->setCurlOption($key, $val);
- }
- $this->debug('set cURL payload');
- return true;
- }
- }
-
- function getResponse(){
- $this->incoming_payload = '';
- if ($this->io_method() == 'socket') {
-
- $data = '';
- while (!isset($lb)){
-
- if(feof($this->fp)) {
- $this->incoming_payload = $data;
- $this->debug('found no headers before EOF after length ' . strlen($data));
- $this->debug("received before EOF:\n" . $data);
- $this->setError('server failed to send headers');
- return false;
- }
- $tmp = fgets($this->fp, 256);
- $tmplen = strlen($tmp);
- $this->debug("read line of $tmplen bytes: " . trim($tmp));
- if ($tmplen == 0) {
- $this->incoming_payload = $data;
- $this->debug('socket read of headers timed out after length ' . strlen($data));
- $this->debug("read before timeout: " . $data);
- $this->setError('socket read of headers timed out');
- return false;
- }
- $data .= $tmp;
- $pos = strpos($data,"\r\n\r\n");
- if($pos > 1){
- $lb = "\r\n";
- } else {
- $pos = strpos($data,"\n\n");
- if($pos > 1){
- $lb = "\n";
- }
- }
-
- if (isset($lb) && ereg('^HTTP/1.1 100',$data)) {
- unset($lb);
- $data = '';
- }
- }
-
- $this->incoming_payload .= $data;
- $this->debug('found end of headers after length ' . strlen($data));
-
- $header_data = trim(substr($data,0,$pos));
- $header_array = explode($lb,$header_data);
- $this->incoming_headers = array();
- $this->incoming_cookies = array();
- foreach($header_array as $header_line){
- $arr = explode(':',$header_line, 2);
- if(count($arr) > 1){
- $header_name = strtolower(trim($arr[0]));
- $this->incoming_headers[$header_name] = trim($arr[1]);
- if ($header_name == 'set-cookie') {
-
- $cookie = $this->parseCookie(trim($arr[1]));
- if ($cookie) {
- $this->incoming_cookies[] = $cookie;
- $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']);
- } else {
- $this->debug('did not find cookie in ' . trim($arr[1]));
- }
- }
- } else if (isset($header_name)) {
-
- $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line;
- }
- }
-
- if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') {
- $content_length = 2147483647;
- $chunked = true;
- $this->debug("want to read chunked content");
- } elseif (isset($this->incoming_headers['content-length'])) {
- $content_length = $this->incoming_headers['content-length'];
- $chunked = false;
- $this->debug("want to read content of length $content_length");
- } else {
- $content_length = 2147483647;
- $chunked = false;
- $this->debug("want to read content to EOF");
- }
- $data = '';
- do {
- if ($chunked) {
- $tmp = fgets($this->fp, 256);
- $tmplen = strlen($tmp);
- $this->debug("read chunk line of $tmplen bytes");
- if ($tmplen == 0) {
- $this->incoming_payload = $data;
- $this->debug('socket read of chunk length timed out after length ' . strlen($data));
- $this->debug("read before timeout:\n" . $data);
- $this->setError('socket read of chunk length timed out');
- return false;
- }
- $content_length = hexdec(trim($tmp));
- $this->debug("chunk length $content_length");
- }
- $strlen = 0;
- while (($strlen < $content_length) && (!feof($this->fp))) {
- $readlen = min(8192, $content_length - $strlen);
- $tmp = fread($this->fp, $readlen);
- $tmplen = strlen($tmp);
- $this->debug("read buffer of $tmplen bytes");
- if (($tmplen == 0) && (!feof($this->fp))) {
- $this->incoming_payload = $data;
- $this->debug('socket read of body timed out after length ' . strlen($data));
- $this->debug("read before timeout:\n" . $data);
- $this->setError('socket read of body timed out');
- return false;
- }
- $strlen += $tmplen;
- $data .= $tmp;
- }
- if ($chunked && ($content_length > 0)) {
- $tmp = fgets($this->fp, 256);
- $tmplen = strlen($tmp);
- $this->debug("read chunk terminator of $tmplen bytes");
- if ($tmplen == 0) {
- $this->incoming_payload = $data;
- $this->debug('socket read of chunk terminator timed out after length ' . strlen($data));
- $this->debug("read before timeout:\n" . $data);
- $this->setError('socket read of chunk terminator timed out');
- return false;
- }
- }
- } while ($chunked && ($content_length > 0) && (!feof($this->fp)));
- if (feof($this->fp)) {
- $this->debug('read to EOF');
- }
- $this->debug('read body of length ' . strlen($data));
- $this->incoming_payload .= $data;
- $this->debug('received a total of '.strlen($this->incoming_payload).' bytes of data from server');
-
- if(
- (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') ||
- (! $this->persistentConnection) || feof($this->fp)){
- fclose($this->fp);
- $this->fp = false;
- $this->debug('closed socket');
- }
-
- if($this->incoming_payload == ''){
- $this->setError('no response from server');
- return false;
- }
-
-
-
- } else if ($this->io_method() == 'curl') {
-
- $this->debug('send and receive with cURL');
- $this->incoming_payload = curl_exec($this->ch);
- $data = $this->incoming_payload;
- $cErr = curl_error($this->ch);
- if ($cErr != '') {
- $err = 'cURL ERROR: '.curl_errno($this->ch).': '.$cErr.'<br>';
-
- foreach(curl_getinfo($this->ch) as $k => $v){
- $err .= "$k: $v<br>";
- }
- $this->debug($err);
- $this->setError($err);
- curl_close($this->ch);
- return false;
- } else {
-
-
-
- }
-
- $this->debug('No cURL error, closing cURL');
- curl_close($this->ch);
-
- $savedata = $data;
- while ($this->isSkippableCurlHeader($data)) {
- $this->debug("Found HTTP header to skip");
- if ($pos = strpos($data,"\r\n\r\n")) {
- $data = ltrim(substr($data,$pos));
- } elseif($pos = strpos($data,"\n\n") ) {
- $data = ltrim(substr($data,$pos));
- }
- }
- if ($data == '') {
-
- $data = $savedata;
- while (ereg('^HTTP/1.1 100',$data)) {
- if ($pos = strpos($data,"\r\n\r\n")) {
- $data = ltrim(substr($data,$pos));
- } elseif($pos = strpos($data,"\n\n") ) {
- $data = ltrim(substr($data,$pos));
- }
- }
- }
-
- if ($pos = strpos($data,"\r\n\r\n")) {
- $lb = "\r\n";
- } elseif( $pos = strpos($data,"\n\n")) {
- $lb = "\n";
- } else {
- $this->debug('no proper separation of headers and document');
- $this->setError('no proper separation of headers and document');
- return false;
- }
- $header_data = trim(substr($data,0,$pos));
- $header_array = explode($lb,$header_data);
- $data = ltrim(substr($data,$pos));
- $this->debug('found proper separation of headers and document');
- $this->debug('cleaned data, stringlen: '.strlen($data));
-
- foreach ($header_array as $header_line) {
- $arr = explode(':',$header_line,2);
- if(count($arr) > 1){
- $header_name = strtolower(trim($arr[0]));
- $this->incoming_headers[$header_name] = trim($arr[1]);
- if ($header_name == 'set-cookie') {
-
- $cookie = $this->parseCookie(trim($arr[1]));
- if ($cookie) {
- $this->incoming_cookies[] = $cookie;
- $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']);
- } else {
- $this->debug('did not find cookie in ' . trim($arr[1]));
- }
- }
- } else if (isset($header_name)) {
-
- $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line;
- }
- }
- }
- $this->response_status_line = $header_array[0];
- $arr = explode(' ', $this->response_status_line, 3);
- $http_version = $arr[0];
- $http_status = intval($arr[1]);
- $http_reason = count($arr) > 2 ? $arr[2] : '';
-
- if (isset($this->incoming_headers['location']) && ($http_status == 301 || $http_status == 302)) {
- $this->debug("Got $http_status $http_reason with Location: " . $this->incoming_headers['location']);
- $this->setURL($this->incoming_headers['location']);
- $this->tryagain = true;
- return false;
- }
-
- if (isset($this->incoming_headers['www-authenticate']) && $http_status == 401) {
- $this->debug("Got 401 $http_reason with WWW-Authenticate: " . $this->incoming_headers['www-authenticate']);
- if (strstr($this->incoming_headers['www-authenticate'], "Digest ")) {
- $this->debug('Server wants digest authentication');
-
- $digestString = str_replace('Digest ', '', $this->incoming_headers['www-authenticate']);
-
- $digestElements = explode(',', $digestString);
- foreach ($digestElements as $val) {
- $tempElement = explode('=', trim($val), 2);
- $digestRequest[$tempElement[0]] = str_replace("\"", '', $tempElement[1]);
- }
-
- if (isset($digestRequest['nonce'])) {
- $this->setCredentials($this->username, $this->password, 'digest', $digestRequest);
- $this->tryagain = true;
- return false;
- }
- }
- $this->debug('HTTP authentication failed');
- $this->setError('HTTP authentication failed');
- return false;
- }
- if (
- ($http_status >= 300 && $http_status <= 307) ||
- ($http_status >= 400 && $http_status <= 417) ||
- ($http_status >= 501 && $http_status <= 505)
- ) {
- $this->setError("Unsupported HTTP response status $http_status $http_reason (soapclient->response has contents of the response)");
- return false;
- }
-
- if(isset($this->incoming_headers['content-encoding']) && $this->incoming_headers['content-encoding'] != ''){
- if(strtolower($this->incoming_headers['content-encoding']) == 'deflate' || strtolower($this->incoming_headers['content-encoding']) == 'gzip'){
-
- if(function_exists('gzinflate')){
-
-
-
- $this->debug('The gzinflate function exists');
- $datalen = strlen($data);
- if ($this->incoming_headers['content-encoding'] == 'deflate') {
- if ($degzdata = @gzinflate($data)) {
- $data = $degzdata;
- $this->debug('The payload has been inflated to ' . strlen($data) . ' bytes');
- if (strlen($data) < $datalen) {
-
- $this->debug('The inflated payload is smaller than the gzipped one; try again');
- if ($degzdata = @gzinflate($data)) {
- $data = $degzdata;
- $this->debug('The payload has been inflated again to ' . strlen($data) . ' bytes');
- }
- }
- } else {
- $this->debug('Error using gzinflate to inflate the payload');
- $this->setError('Error using gzinflate to inflate the payload');
- }
- } elseif ($this->incoming_headers['content-encoding'] == 'gzip') {
- if ($degzdata = @gzinflate(substr($data, 10))) {
- $data = $degzdata;
- $this->debug('The payload has been un-gzipped to ' . strlen($data) . ' bytes');
- if (strlen($data) < $datalen) {
-
- $this->debug('The un-gzipped payload is smaller than the gzipped one; try again');
- if ($degzdata = @gzinflate(substr($data, 10))) {
- $data = $degzdata;
- $this->debug('The payload has been un-gzipped again to ' . strlen($data) . ' bytes');
- }
- }
- } else {
- $this->debug('Error using gzinflate to un-gzip the payload');
- $this->setError('Error using gzinflate to un-gzip the payload');
- }
- }
-
-
-
- $this->incoming_payload = $header_data.$lb.$lb.$data;
- } else {
- $this->debug('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.');
- $this->setError('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.');
- }
- } else {
- $this->debug('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']);
- $this->setError('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']);
- }
- } else {
- $this->debug('No Content-Encoding header');
- }
- if(strlen($data) == 0){
- $this->debug('no data after headers!');
- $this->setError('no data present after HTTP headers');
- return false;
- }
- return $data;
- }
-
- function setContentType($type, $charset = false) {
- $this->setHeader('Content-Type', $type . ($charset ? '; charset=' . $charset : ''));
- }
-
- function usePersistentConnection(){
- if (isset($this->outgoing_headers['Accept-Encoding'])) {
- return false;
- }
- $this->protocol_version = '1.1';
- $this->persistentConnection = true;
- $this->setHeader('Connection', 'Keep-Alive');
- return true;
- }
-
-
- function parseCookie($cookie_str) {
- $cookie_str = str_replace('; ', ';', $cookie_str) . ';';
- $data = split(';', $cookie_str);
- $value_str = $data[0];
- $cookie_param = 'domain=';
- $start = strpos($cookie_str, $cookie_param);
- if ($start > 0) {
- $domain = substr($cookie_str, $start + strlen($cookie_param));
- $domain = substr($domain, 0, strpos($domain, ';'));
- } else {
- $domain = '';
- }
- $cookie_param = 'expires=';
- $start = strpos($cookie_str, $cookie_param);
- if ($start > 0) {
- $expires = substr($cookie_str, $start + strlen($cookie_param));
- $expires = substr($expires, 0, strpos($expires, ';'));
- } else {
- $expires = '';
- }
- $cookie_param = 'path=';
- $start = strpos($cookie_str, $cookie_param);
- if ( $start > 0 ) {
- $path = substr($cookie_str, $start + strlen($cookie_param));
- $path = substr($path, 0, strpos($path, ';'));
- } else {
- $path = '/';
- }
- $cookie_param = ';secure;';
- if (strpos($cookie_str, $cookie_param) !== FALSE) {
- $secure = true;
- } else {
- $secure = false;
- }
- $sep_pos = strpos($value_str, '=');
- if ($sep_pos) {
- $name = substr($value_str, 0, $sep_pos);
- $value = substr($value_str, $sep_pos + 1);
- $cookie= array( 'name' => $name,
- 'value' => $value,
- 'domain' => $domain,
- 'path' => $path,
- 'expires' => $expires,
- 'secure' => $secure
- );
- return $cookie;
- }
- return false;
- }
-
- function getCookiesForRequest($cookies, $secure=false) {
- $cookie_str = '';
- if ((! is_null($cookies)) && (is_array($cookies))) {
- foreach ($cookies as $cookie) {
- if (! is_array($cookie)) {
- continue;
- }
- $this->debug("check cookie for validity: ".$cookie['name'].'='.$cookie['value']);
- if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) {
- if (strtotime($cookie['expires']) <= time()) {
- $this->debug('cookie has expired');
- continue;
- }
- }
- if ((isset($cookie['domain'])) && (! empty($cookie['domain']))) {
- $domain = preg_quote($cookie['domain']);
- if (! preg_match("'.*$domain$'i", $this->host)) {
- $this->debug('cookie has different domain');
- continue;
- }
- }
- if ((isset($cookie['path'])) && (! empty($cookie['path']))) {
- $path = preg_quote($cookie['path']);
- if (! preg_match("'^$path.*'i", $this->path)) {
- $this->debug('cookie is for a different path');
- continue;
- }
- }
- if ((! $secure) && (isset($cookie['secure'])) && ($cookie['secure'])) {
- $this->debug('cookie is secure, transport is not');
- continue;
- }
- $cookie_str .= $cookie['name'] . '=' . $cookie['value'] . '; ';
- $this->debug('add cookie to Cookie-String: ' . $cookie['name'] . '=' . $cookie['value']);
- }
- }
- return $cookie_str;
- }
- }
- ?><?php
- class nusoap_server extends nusoap_base {
-
- public $headers = array();
-
- public $request = '';
-
- public $requestHeaders = '';
-
- public $requestHeader = NULL;
-
- public $document = '';
-
- public $requestSOAP = '';
-
- public $methodURI = '';
-
- public $methodname = '';
-
- public $methodparams = array();
-
- public $SOAPAction = '';
-
- public $xml_encoding = '';
-
- public $decode_utf8 = true;
-
- public $outgoing_headers = array();
-
- public $response = '';
-
- public $responseHeaders = '';
-
- public $responseSOAP = '';
-
- public $methodreturn = false;
-
- public $methodreturnisliteralxml = false;
-
- public $fault = false;
-
- public $result = 'successful';
-
- public $operations = array();
-
- public $wsdl = false;
-
- public $externalWSDLURL = false;
-
- public $debug_flag = false;
-
- function nusoap_server($wsdl=false){
- parent::nusoap_base();
-
- global $debug;
- global $HTTP_SERVER_VARS;
- if (isset($_SERVER)) {
- $this->debug("_SERVER is defined:");
- $this->appendDebug($this->varDump($_SERVER));
- } elseif (isset($HTTP_SERVER_VARS)) {
- $this->debug("HTTP_SERVER_VARS is defined:");
- $this->appendDebug($this->varDump($HTTP_SERVER_VARS));
- } else {
- $this->debug("Neither _SERVER nor HTTP_SERVER_VARS is defined.");
- }
- if (isset($debug)) {
- $this->debug("In nusoap_server, set debug_flag=$debug based on global flag");
- $this->debug_flag = $debug;
- } elseif (isset($_SERVER['QUERY_STRING'])) {
- $qs = explode('&', $_SERVER['QUERY_STRING']);
- foreach ($qs as $v) {
- if (substr($v, 0, 6) == 'debug=') {
- $this->debug("In nusoap_server, set debug_flag=" . substr($v, 6) . " based on query string #1");
- $this->debug_flag = substr($v, 6);
- }
- }
- } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
- $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']);
- foreach ($qs as $v) {
- if (substr($v, 0, 6) == 'debug=') {
- $this->debug("In nusoap_server, set debug_flag=" . substr($v, 6) . " based on query string #2");
- $this->debug_flag = substr($v, 6);
- }
- }
- }
-
- if($wsdl){
- $this->debug("In nusoap_server, WSDL is specified");
- if (is_object($wsdl) && (get_class($wsdl) == 'wsdl')) {
- $this->wsdl = $wsdl;
- $this->externalWSDLURL = $this->wsdl->wsdl;
- $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL);
- } else {
- $this->debug('Create wsdl from ' . $wsdl);
- $this->wsdl = new wsdl($wsdl);
- $this->externalWSDLURL = $wsdl;
- }
- $this->appendDebug($this->wsdl->getDebug());
- $this->wsdl->clearDebug();
- if($err = $this->wsdl->getError()){
- die('WSDL ERROR: '.$err);
- }
- }
- }
-
- function service($data){
- global $HTTP_SERVER_VARS;
- if (isset($_SERVER['QUERY_STRING'])) {
- $qs = $_SERVER['QUERY_STRING'];
- } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) {
- $qs = $HTTP_SERVER_VARS['QUERY_STRING'];
- } else {
- $qs = '';
- }
- $this->debug("In service, query string=$qs");
- if (ereg('wsdl', $qs) ){
- $this->debug("In service, this is a request for WSDL");
- if($this->externalWSDLURL){
- if (strpos($this->externalWSDLURL,"://")!==false) {
- header('Location: '.$this->externalWSDLURL);
- } else {
- header("Content-Type: text/xml\r\n");
- $fp = fopen($this->externalWSDLURL, 'r');
- fpassthru($fp);
- }
- } elseif ($this->wsdl) {
- header("Content-Type: text/xml; charset=ISO-8859-1\r\n");
- print $this->wsdl->serialize($this->debug_flag);
- if ($this->debug_flag) {
- $this->debug('wsdl:');
- $this->appendDebug($this->varDump($this->wsdl));
- print $this->getDebugAsXMLComment();
- }
- } else {
- header("Content-Type: text/html; charset=ISO-8859-1\r\n");
- print "This service does not provide WSDL";
- }
- } elseif ($data == '' && $this->wsdl) {
- $this->debug("In service, there is no data, so return Web description");
- print $this->wsdl->webDescription();
- } else {
- $this->debug("In service, invoke the request");
- $this->parse_request($data);
- if (! $this->fault) {
- $this->invoke_method();
- }
- if (! $this->fault) {
- $this->serialize_return();
- }
- $this->send_response();
- }
- }
-
- function parse_http_headers() {
- global $HTTP_SERVER_VARS;
- $this->request = '';
- $this->SOAPAction = '';
- if(function_exists('getallheaders')){
- $this->debug("In parse_http_headers, use getallheaders");
- $headers = getallheaders();
- foreach($headers as $k=>$v){
- $k = strtolower($k);
- $this->headers[$k] = $v;
- $this->request .= "$k: $v\r\n";
- $this->debug("$k: $v");
- }
-
- if(isset($this->headers['soapaction'])){
- $this->SOAPAction = str_replace('"','',$this->headers['soapaction']);
- }
-
- if(isset($this->headers['content-type']) && strpos($this->headers['content-type'],'=')){
- $enc = str_replace('"','',substr(strstr($this->headers["content-type"],'='),1));
- if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
-
- $this->xml_encoding = 'ISO-8859-1';
- }
- } elseif(isset($_SERVER) && is_array($_SERVER)){
- $this->debug("In parse_http_headers, use _SERVER");
- foreach ($_SERVER as $k => $v) {
- if (substr($k, 0, 5) == 'HTTP_') {
- $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5))));
- } else {
- $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k)));
- }
- if ($k == 'soapaction') {
-
- $k = 'SOAPAction';
- $v = str_replace('"', '', $v);
- $v = str_replace('\\', '', $v);
- $this->SOAPAction = $v;
- } else if ($k == 'content-type') {
-
- if (strpos($v, '=')) {
- $enc = substr(strstr($v, '='), 1);
- $enc = str_replace('"', '', $enc);
- $enc = str_replace('\\', '', $enc);
- if (eregi('^(ISO-8859-1|US-ASCII|UTF-8)$', $enc)) {
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
-
- $this->xml_encoding = 'ISO-8859-1';
- }
- }
- $this->headers[$k] = $v;
- $this->request .= "$k: $v\r\n";
- $this->debug("$k: $v");
- }
- } elseif (is_array($HTTP_SERVER_VARS)) {
- $this->debug("In parse_http_headers, use HTTP_SERVER_VARS");
- foreach ($HTTP_SERVER_VARS as $k => $v) {
- if (substr($k, 0, 5) == 'HTTP_') {
- $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5));
- } else {
- $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k);
- }
- if ($k == 'soapaction') {
-
- $k = 'SOAPAction';
- $v = str_replace('"', '', $v);
- $v = str_replace('\\', '', $v);
- $this->SOAPAction = $v;
- } else if ($k == 'content-type') {
-
- if (strpos($v, '=')) {
- $enc = substr(strstr($v, '='), 1);
- $enc = str_replace('"', '', $enc);
- $enc = str_replace('\\', '', $enc);
- if (eregi('^(ISO-8859-1|US-ASCII|UTF-8)$', $enc)) {
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
-
- $this->xml_encoding = 'ISO-8859-1';
- }
- }
- $this->headers[$k] = $v;
- $this->request .= "$k: $v\r\n";
- $this->debug("$k: $v");
- }
- } else {
- $this->debug("In parse_http_headers, HTTP headers not accessible");
- $this->setError("HTTP headers not accessible");
- }
- }
-
- function parse_request($data='') {
- $this->debug('entering parse_request()');
- $this->parse_http_headers();
- $this->debug('got character encoding: '.$this->xml_encoding);
-
- if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') {
- $this->debug('got content encoding: ' . $this->headers['content-encoding']);
- if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') {
-
- if (function_exists('gzuncompress')) {
- if ($this->headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) {
- $data = $degzdata;
- } elseif ($this->headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) {
- $data = $degzdata;
- } else {
- $this->fault('SOAP-ENV:Client', 'Errors occurred when trying to decode the data');
- return;
- }
- } else {
- $this->fault('SOAP-ENV:Client', 'This Server does not support compressed data');
- return;
- }
- }
- }
- $this->request .= "\r\n".$data;
- $data = $this->parseRequest($this->headers, $data);
- $this->requestSOAP = $data;
- $this->debug('leaving parse_request');
- }
-
- function invoke_method() {
- $this->debug('in invoke_method, methodname=' . $this->methodname . ' methodURI=' . $this->methodURI . ' SOAPAction=' . $this->SOAPAction);
- if ($this->wsdl) {
- if ($this->opData = $this->wsdl->getOperationData($this->methodname)) {
- $this->debug('in invoke_method, found WSDL operation=' . $this->methodname);
- $this->appendDebug('opData=' . $this->varDump($this->opData));
- } elseif ($this->opData = $this->wsdl->getOperationDataForSoapAction($this->SOAPAction)) {
-
- $this->debug('in invoke_method, found WSDL soapAction=' . $this->SOAPAction . ' for operation=' . $this->opData['name']);
- $this->appendDebug('opData=' . $this->varDump($this->opData));
- $this->methodname = $this->opData['name'];
- } else {
- $this->debug('in invoke_method, no WSDL for operation=' . $this->methodname);
- $this->fault('SOAP-ENV:Client', "Operation '" . $this->methodname . "' is not defined in the WSDL for this service");
- return;
- }
- } else {
- $this->debug('in invoke_method, no WSDL to validate method');
- }
-
-
-
- $class = '';
- $method = '';
- if (strpos($this->methodname, '..') > 0) {
- $delim = '..';
- } else if (strpos($this->methodname, '.') > 0) {
- $delim = '.';
- } else {
- $delim = '';
- }
- if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1 &&
- class_exists(substr($this->methodname, 0, strpos($this->methodname, $delim)))) {
-
- $class = substr($this->methodname, 0, strpos($this->methodname, $delim));
- $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim));
- $this->debug("in invoke_method, class=$class method=$method delim=$delim");
- }
-
- if ($class == '') {
- if (!function_exists($this->methodname)) {
- $this->debug("in invoke_method, function '$this->methodname' not found!");
- $this->result = 'fault: method not found';
- $this->fault('SOAP-ENV:Client',"method '$this->methodname' not defined in service");
- return;
- }
- } else {
- $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method;
- if (!in_array($method_to_compare, get_class_methods($class))) {
- $this->debug("in invoke_method, method '$this->methodname' not found in class '$class'!");
- $this->result = 'fault: method not found';
- $this->fault('SOAP-ENV:Client',"method '$this->methodname' not defined in service");
- return;
- }
- }
-
-
- if(! $this->verify_method($this->methodname,$this->methodparams)){
-
- $this->debug('ERROR: request not verified against method signature');
- $this->result = 'fault: request failed validation against method signature';
-
- $this->fault('SOAP-ENV:Client',"Operation '$this->methodname' not defined in service.");
- return;
- }
-
- $this->debug('in invoke_method, params:');
- $this->appendDebug($this->varDump($this->methodparams));
- $this->debug("in invoke_method, calling '$this->methodname'");
- if (!function_exists('call_user_func_array')) {
- if ($class == '') {
- $this->debug('in invoke_method, calling function using eval()');
- $funcCall = "\$this->methodreturn = $this->methodname(";
- } else {
- if ($delim == '..') {
- $this->debug('in invoke_method, calling class method using eval()');
- $funcCall = "\$this->methodreturn = ".$class."::".$method."(";
- } else {
- $this->debug('in invoke_method, calling instance method using eval()');
-
- $instname = "\$inst_".time();
- $funcCall = $instname." = new ".$class."(); ";
- $funcCall .= "\$this->methodreturn = ".$instname."->".$method."(";
- }
- }
- if ($this->methodparams) {
- foreach ($this->methodparams as $param) {
- if (is_array($param) || is_object($param)) {
- $this->fault('SOAP-ENV:Client', 'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available');
- return;
- }
- $funcCall .= "\"$param\",";
- }
- $funcCall = substr($funcCall, 0, -1);
- }
- $funcCall .= ');';
- $this->debug('in invoke_method, function call: '.$funcCall);
- @eval($funcCall);
- } else {
- if ($class == '') {
- $this->debug('in invoke_method, calling function using call_user_func_array()');
- $call_arg = "$this->methodname";
- } elseif ($delim == '..') {
- $this->debug('in invoke_method, calling class method using call_user_func_array()');
- $call_arg = array ($class, $method);
- } else {
- $this->debug('in invoke_method, calling instance method using call_user_func_array()');
- $instance = new $class ();
- $call_arg = array(&$instance, $method);
- }
- if (is_array($this->methodparams)) {
- $this->methodreturn = call_user_func_array($call_arg, array_values($this->methodparams));
- } else {
- $this->methodreturn = call_user_func_array($call_arg, array());
- }
- }
- $this->debug('in invoke_method, methodreturn:');
- $this->appendDebug($this->varDump($this->methodreturn));
- $this->debug("in invoke_method, called method $this->methodname, received data of type ".gettype($this->methodreturn));
- }
-
- function serialize_return() {
- $this->debug('Entering serialize_return methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI);
-
- if (isset($this->methodreturn) && ((get_class($this->methodreturn) == 'soap_fault') || (get_class($this->methodreturn) == 'nusoap_fault'))) {
- $this->debug('got a fault object from method');
- $this->fault = $this->methodreturn;
- return;
- } elseif ($this->methodreturnisliteralxml) {
- $return_val = $this->methodreturn;
-
- } else {
- $this->debug('got a(n) '.gettype($this->methodreturn).' from method');
- $this->debug('serializing return value');
- if($this->wsdl){
- if (sizeof($this->opData['output']['parts']) > 1) {
- $this->debug('more than one output part, so use the method return unchanged');
- $opParams = $this->methodreturn;
- } elseif (sizeof($this->opData['output']['parts']) == 1) {
- $this->debug('exactly one output part, so wrap the method return in a simple array');
-
-
-
-
- $opParams = array($this->methodreturn);
- }
- $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams);
- $this->appendDebug($this->wsdl->getDebug());
- $this->wsdl->clearDebug();
- if($errstr = $this->wsdl->getError()){
- $this->debug('got wsdl error: '.$errstr);
- $this->fault('SOAP-ENV:Server', 'unable to serialize result');
- return;
- }
- } else {
- if (isset($this->methodreturn)) {
- $return_val = $this->serialize_val($this->methodreturn, 'return');
- } else {
- $return_val = '';
- $this->debug('in absence of WSDL, assume void return for backward compatibility');
- }
- }
- }
- $this->debug('return value:');
- $this->appendDebug($this->varDump($return_val));
- $this->debug('serializing response');
- if ($this->wsdl) {
- $this->debug('have WSDL for serialization: style is ' . $this->opData['style']);
- if ($this->opData['style'] == 'rpc') {
- $this->debug('style is rpc for serialization: use is ' . $this->opData['output']['use']);
- if ($this->opData['output']['use'] == 'literal') {
-
- $payload = '<ns1:'.$this->methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'</ns1:'.$this->methodname."Response>";
- } else {
- $payload = '<ns1:'.$this->methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'</ns1:'.$this->methodname."Response>";
- }
- } else {
- $this->debug('style is not rpc for serialization: assume document');
- $payload = $return_val;
- }
- } else {
- $this->debug('do not have WSDL for serialization: assume rpc/encoded');
- $payload = '<ns1:'.$this->methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'</ns1:'.$this->methodname."Response>";
- }
- $this->result = 'successful';
- if($this->wsdl){
-
- $this->appendDebug($this->wsdl->getDebug());
-
- if (isset($opData['output']['encodingStyle'])) {
- $encodingStyle = $opData['output']['encodingStyle'];
- } else {
- $encodingStyle = '';
- }
-
- $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style'],$this->opData['output']['use'],$encodingStyle);
- } else {
- $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders);
- }
- $this->debug("Leaving serialize_return");
- }
-
- function send_response() {
- $this->debug('Enter send_response');
- if ($this->fault) {
- $payload = $this->fault->serialize();
- $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error";
- $this->outgoing_headers[] = "Status: 500 Internal Server Error";
- } else {
- $payload = $this->responseSOAP;
-
-
-
-
-
- }
-
- if(isset($this->debug_flag) && $this->debug_flag){
- $payload .= $this->getDebugAsXMLComment();
- }
- $this->outgoing_headers[] = "Server: $this->title Server v$this->version";
- ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev);
- $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")";
-
-
- $payload = $this->getHTTPBody($payload);
- $type = $this->getHTTPContentType();
- $charset = $this->getHTTPContentTypeCharset();
- $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : '');
-
-
-
- if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['accept-encoding'])) {
- if (strstr($this->headers['accept-encoding'], 'gzip')) {
- if (function_exists('gzencode')) {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "<!-- Content being gzipped -->";
- }
- $this->outgoing_headers[] = "Content-Encoding: gzip";
- $payload = gzencode($payload);
- } else {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "<!-- Content will not be gzipped: no gzencode -->";
- }
- }
- } elseif (strstr($this->headers['accept-encoding'], 'deflate')) {
-
-
-
- if (function_exists('gzdeflate')) {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "<!-- Content being deflated -->";
- }
- $this->outgoing_headers[] = "Content-Encoding: deflate";
- $payload = gzdeflate($payload);
- } else {
- if (isset($this->debug_flag) && $this->debug_flag) {
- $payload .= "<!-- Content will not be deflated: no gzcompress -->";
- }
- }
- }
- }
-
- $this->outgoing_headers[] = "Content-Length: ".strlen($payload);
- reset($this->outgoing_headers);
- foreach($this->outgoing_headers as $hdr){
- header($hdr, false);
- }
- print $payload;
- $this->response = join("\r\n",$this->outgoing_headers)."\r\n\r\n".$payload;
- }
-
- function verify_method($operation,$request){
- if(isset($this->wsdl) && is_object($this->wsdl)){
- if($this->wsdl->getOperationData($operation)){
- return true;
- }
- } elseif(isset($this->operations[$operation])){
- return true;
- }
- return false;
- }
-
- function parseRequest($headers, $data) {
- $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']);
- if (!strstr($headers['content-type'], 'text/xml')) {
- $this->setError('Request not of type text/xml');
- return false;
- }
- if (strpos($headers['content-type'], '=')) {
- $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1));
- $this->debug('Got response encoding: ' . $enc);
- if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
-
- $this->xml_encoding = 'ISO-8859-1';
- }
- $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser');
-
- $parser = new nusoap_parser($data,$this->xml_encoding,'',$this->decode_utf8);
-
- $this->debug("parser debug: \n".$parser->getDebug());
-
- if($err = $parser->getError()){
- $this->result = 'fault: error in msg parsing: '.$err;
- $this->fault('SOAP-ENV:Client',"error in msg parsing:\n".$err);
-
- } else {
-
- $this->methodURI = $parser->root_struct_namespace;
- $this->methodname = $parser->root_struct_name;
- $this->debug('methodname: '.$this->methodname.' methodURI: '.$this->methodURI);
- $this->debug('calling parser->get_soapbody()');
- $this->methodparams = $parser->get_soapbody();
-
- $this->requestHeaders = $parser->getHeaders();
-
- $this->requestHeader = $parser->get_soapheader();
-
- $this->document = $parser->document;
- }
- }
-
- function getHTTPBody($soapmsg) {
- return $soapmsg;
- }
-
- function getHTTPContentType() {
- return 'text/xml';
- }
-
- function getHTTPContentTypeCharset() {
- return $this->soap_defencoding;
- }
-
- function add_to_map($methodname,$in,$out){
- $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out);
- }
-
- function register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle=''){
- global $HTTP_SERVER_VARS;
- if($this->externalWSDLURL){
- die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.');
- }
- if (! $name) {
- die('You must specify a name when you register an operation');
- }
- if (!is_array($in)) {
- die('You must provide an array for operation inputs');
- }
- if (!is_array($out)) {
- die('You must provide an array for operation outputs');
- }
- if(false == $namespace) {
- }
- if(false == $soapaction) {
- if (isset($_SERVER)) {
- $SERVER_NAME = $_SERVER['SERVER_NAME'];
- $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
- $HTTPS = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : (isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off');
- } elseif (isset($HTTP_SERVER_VARS)) {
- $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME'];
- $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME'];
- $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off';
- } else {
- $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available");
- }
- if ($HTTPS == '1' || $HTTPS == 'on') {
- $SCHEME = 'https';
- } else {
- $SCHEME = 'http';
- }
- $soapaction = "$SCHEME://$SERVER_NAME$SCRIPT_NAME/$name";
- }
- if(false == $style) {
- $style = "rpc";
- }
- if(false == $use) {
- $use = "encoded";
- }
- if ($use == 'encoded' && $encodingStyle = '') {
- $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
- }
- $this->operations[$name] = array(
- 'name' => $name,
- 'in' => $in,
- 'out' => $out,
- 'namespace' => $namespace,
- 'soapaction' => $soapaction,
- 'style' => $style);
- if($this->wsdl){
- $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation,$encodingStyle);
- }
- return true;
- }
-
- function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){
- if ($faultdetail == '' && $this->debug_flag) {
- $faultdetail = $this->getDebug();
- }
- $this->fault = new nusoap_fault($faultcode,$faultactor,$faultstring,$faultdetail);
- $this->fault->soap_defencoding = $this->soap_defencoding;
- }
-
- function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false)
- {
- global $HTTP_SERVER_VARS;
- if (isset($_SERVER)) {
- $SERVER_NAME = $_SERVER['SERVER_NAME'];
- $SERVER_PORT = $_SERVER['SERVER_PORT'];
- $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
- $HTTPS = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : (isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off');
- } elseif (isset($HTTP_SERVER_VARS)) {
- $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME'];
- $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT'];
- $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME'];
- $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off';
- } else {
- $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available");
- }
-
- $colon = strpos($SERVER_NAME,":");
- if ($colon) {
- $SERVER_NAME = substr($SERVER_NAME, 0, $colon);
- }
- if ($SERVER_PORT == 80) {
- $SERVER_PORT = '';
- } else {
- $SERVER_PORT = ':' . $SERVER_PORT;
- }
- if(false == $namespace) {
- $namespace = "http://$SERVER_NAME/soap/$serviceName";
- }
- if(false == $endpoint) {
- if ($HTTPS == '1' || $HTTPS == 'on') {
- $SCHEME = 'https';
- } else {
- $SCHEME = 'http';
- }
- $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME";
- }
- if(false == $schemaTargetNamespace) {
- $schemaTargetNamespace = $namespace;
- }
- $this->wsdl = new wsdl;
- $this->wsdl->serviceName = $serviceName;
- $this->wsdl->endpoint = $endpoint;
- $this->wsdl->namespaces['tns'] = $namespace;
- $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/';
- $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/';
- if ($schemaTargetNamespace != $namespace) {
- $this->wsdl->namespaces['types'] = $schemaTargetNamespace;
- }
- $this->wsdl->schemas[$schemaTargetNamespace][0] = new nusoap_xmlschema('', '', $this->wsdl->namespaces);
- if ($style == 'document') {
- $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaInfo['elementFormDefault'] = 'qualified';
- }
- $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace;
- $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true);
- $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true);
- $this->wsdl->bindings[$serviceName.'Binding'] = array(
- 'name'=>$serviceName.'Binding',
- 'style'=>$style,
- 'transport'=>$transport,
- 'portType'=>$serviceName.'PortType');
- $this->wsdl->ports[$serviceName.'Port'] = array(
- 'binding'=>$serviceName.'Binding',
- 'location'=>$endpoint,
- 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/');
- }
- }
- class soap_server extends nusoap_server {
- }
- ?><?php
- class wsdl extends nusoap_base {
-
- public $wsdl;
-
- public $schemas = array();
- public $currentSchema;
- public $message = array();
- public $complexTypes = array();
- public $messages = array();
- public $currentMessage;
- public $currentOperation;
- public $portTypes = array();
- public $currentPortType;
- public $bindings = array();
- public $currentBinding;
- public $ports = array();
- public $currentPort;
- public $opData = array();
- public $status = '';
- public $documentation = false;
- public $endpoint = '';
-
- public $import = array();
-
- public $parser;
- public $position = 0;
- public $depth = 0;
- public $depth_array = array();
-
- public $proxyhost = '';
- public $proxyport = '';
- public $proxyusername = '';
- public $proxypassword = '';
- public $timeout = 0;
- public $response_timeout = 30;
- public $curl_options = array();
- public $use_curl = false;
-
- public $username = '';
- public $password = '';
- public $authtype = '';
- public $certRequest = array();
-
- function wsdl($wsdl = '',$proxyhost=false,$proxyport=false,$proxyusername=false,$proxypassword=false,$timeout=0,$response_timeout=30,$curl_options=null,$use_curl=false){
- parent::nusoap_base();
- $this->debug("ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout");
- $this->proxyhost = $proxyhost;
- $this->proxyport = $proxyport;
- $this->proxyusername = $proxyusername;
- $this->proxypassword = $proxypassword;
- $this->timeout = $timeout;
- $this->response_timeout = $response_timeout;
- if (is_array($curl_options))
- $this->curl_options = $curl_options;
- $this->use_curl = $use_curl;
- $this->fetchWSDL($wsdl);
- }
-
- function fetchWSDL($wsdl) {
- $this->debug("parse and process WSDL path=$wsdl");
- $this->wsdl = $wsdl;
-
- if ($this->wsdl != "") {
- $this->parseWSDL($this->wsdl);
- }
-
-
- $imported_urls = array();
- $imported = 1;
- while ($imported > 0) {
- $imported = 0;
-
- foreach ($this->schemas as $ns => $list) {
- foreach ($list as $xs) {
- $wsdlparts = parse_url($this->wsdl);
- foreach ($xs->imports as $ns2 => $list2) {
- for ($ii = 0; $ii < count($list2); $ii++) {
- if (! $list2[$ii]['loaded']) {
- $this->schemas[$ns]->imports[$ns2][$ii]['loaded'] = true;
- $url = $list2[$ii]['location'];
- if ($url != '') {
- $urlparts = parse_url($url);
- if (!isset($urlparts['host'])) {
- $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' .$wsdlparts['port'] : '') .
- substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path'];
- }
- if (! in_array($url, $imported_urls)) {
- $this->parseWSDL($url);
- $imported++;
- $imported_urls[] = $url;
- }
- } else {
- $this->debug("Unexpected scenario: empty URL for unloaded import");
- }
- }
- }
- }
- }
- }
-
- $wsdlparts = parse_url($this->wsdl);
- foreach ($this->import as $ns => $list) {
- for ($ii = 0; $ii < count($list); $ii++) {
- if (! $list[$ii]['loaded']) {
- $this->import[$ns][$ii]['loaded'] = true;
- $url = $list[$ii]['location'];
- if ($url != '') {
- $urlparts = parse_url($url);
- if (!isset($urlparts['host'])) {
- $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' . $wsdlparts['port'] : '') .
- substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path'];
- }
- if (! in_array($url, $imported_urls)) {
- $this->parseWSDL($url);
- $imported++;
- $imported_urls[] = $url;
- }
- } else {
- $this->debug("Unexpected scenario: empty URL for unloaded import");
- }
- }
- }
- }
- }
-
- foreach($this->bindings as $binding => $bindingData) {
- if (isset($bindingData['operations']) && is_array($bindingData['operations'])) {
- foreach($bindingData['operations'] as $operation => $data) {
- $this->debug('post-parse data gathering for ' . $operation);
- $this->bindings[$binding]['operations'][$operation]['input'] =
- isset($this->bindings[$binding]['operations'][$operation]['input']) ?
- array_merge($this->bindings[$binding]['operations'][$operation]['input'], $this->portTypes[ $bindingData['portType'] ][$operation]['input']) :
- $this->portTypes[ $bindingData['portType'] ][$operation]['input'];
- $this->bindings[$binding]['operations'][$operation]['output'] =
- isset($this->bindings[$binding]['operations'][$operation]['output']) ?
- array_merge($this->bindings[$binding]['operations'][$operation]['output'], $this->portTypes[ $bindingData['portType'] ][$operation]['output']) :
- $this->portTypes[ $bindingData['portType'] ][$operation]['output'];
- if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ])){
- $this->bindings[$binding]['operations'][$operation]['input']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ];
- }
- if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ])){
- $this->bindings[$binding]['operations'][$operation]['output']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ];
- }
-
- if (isset($bindingData['style']) && !isset($this->bindings[$binding]['operations'][$operation]['style'])) {
- $this->bindings[$binding]['operations'][$operation]['style'] = $bindingData['style'];
- }
- $this->bindings[$binding]['operations'][$operation]['transport'] = isset($bindingData['transport']) ? $bindingData['transport'] : '';
- $this->bindings[$binding]['operations'][$operation]['documentation'] = isset($this->portTypes[ $bindingData['portType'] ][$operation]['documentation']) ? $this->portTypes[ $bindingData['portType'] ][$operation]['documentation'] : '';
- $this->bindings[$binding]['operations'][$operation]['endpoint'] = isset($bindingData['endpoint']) ? $bindingData['endpoint'] : '';
- }
- }
- }
- }
-
- function parseWSDL($wsdl = '') {
- $this->debug("parse WSDL at path=$wsdl");
- if ($wsdl == '') {
- $this->debug('no wsdl passed to parseWSDL()!!');
- $this->setError('no wsdl passed to parseWSDL()!!');
- return false;
- }
-
- $wsdl_props = parse_url($wsdl);
- if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'http' || $wsdl_props['scheme'] == 'https')) {
- $this->debug('getting WSDL http(s) URL ' . $wsdl);
-
- $tr = new soap_transport_http($wsdl, $this->curl_options, $this->use_curl);
- $tr->request_method = 'GET';
- $tr->useSOAPAction = false;
- if($this->proxyhost && $this->proxyport){
- $tr->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword);
- }
- if ($this->authtype != '') {
- $tr->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest);
- }
- $tr->setEncoding('gzip, deflate');
- $wsdl_string = $tr->send('', $this->timeout, $this->response_timeout);
-
-
- $this->appendDebug($tr->getDebug());
-
- if($err = $tr->getError() ){
- $errstr = 'HTTP ERROR: '.$err;
- $this->debug($errstr);
- $this->setError($errstr);
- unset($tr);
- return false;
- }
- unset($tr);
- $this->debug("got WSDL URL");
- } else {
-
- if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'file') && isset($wsdl_props['path'])) {
- $path = isset($wsdl_props['host']) ? ($wsdl_props['host'] . ':' . $wsdl_props['path']) : $wsdl_props['path'];
- } else {
- $path = $wsdl;
- }
- $this->debug('getting WSDL file ' . $path);
- if ($fp = @fopen($path, 'r')) {
- $wsdl_string = '';
- while ($data = fread($fp, 32768)) {
- $wsdl_string .= $data;
- }
- fclose($fp);
- } else {
- $errstr = "Bad path to WSDL file $path";
- $this->debug($errstr);
- $this->setError($errstr);
- return false;
- }
- }
- $this->debug('Parse WSDL');
-
-
- $this->parser = xml_parser_create();
-
-
- xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
-
- xml_set_object($this->parser, $this);
-
- xml_set_element_handler($this->parser, 'start_element', 'end_element');
- xml_set_character_data_handler($this->parser, 'character_data');
-
- if (!xml_parse($this->parser, $wsdl_string, true)) {
-
- $errstr = sprintf(
- 'XML error parsing WSDL from %s on line %d: %s',
- $wsdl,
- xml_get_current_line_number($this->parser),
- xml_error_string(xml_get_error_code($this->parser))
- );
- $this->debug($errstr);
- $this->debug("XML payload:\n" . $wsdl_string);
- $this->setError($errstr);
- return false;
- }
-
- xml_parser_free($this->parser);
- $this->debug('Parsing WSDL done');
-
- if($this->getError()){
- return false;
- }
- return true;
- }
-
- function start_element($parser, $name, $attrs)
- {
- if ($this->status == 'schema') {
- $this->currentSchema->schemaStartElement($parser, $name, $attrs);
- $this->appendDebug($this->currentSchema->getDebug());
- $this->currentSchema->clearDebug();
- } elseif (ereg('schema$', $name)) {
- $this->debug('Parsing WSDL schema');
-
- $this->status = 'schema';
- $this->currentSchema = new nusoap_xmlschema('', '', $this->namespaces);
- $this->currentSchema->schemaStartElement($parser, $name, $attrs);
- $this->appendDebug($this->currentSchema->getDebug());
- $this->currentSchema->clearDebug();
- } else {
-
- $pos = $this->position++;
- $depth = $this->depth++;
-
- $this->depth_array[$depth] = $pos;
- $this->message[$pos] = array('cdata' => '');
-
- if (count($attrs) > 0) {
-
- foreach($attrs as $k => $v) {
- if (ereg("^xmlns", $k)) {
- if ($ns_prefix = substr(strrchr($k, ':'), 1)) {
- $this->namespaces[$ns_prefix] = $v;
- } else {
- $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v;
- }
- if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema') {
- $this->XMLSchemaVersion = $v;
- $this->namespaces['xsi'] = $v . '-instance';
- }
- }
- }
-
- foreach($attrs as $k => $v) {
- $k = strpos($k, ':') ? $this->expandQname($k) : $k;
- if ($k != 'location' && $k != 'soapAction' && $k != 'namespace') {
- $v = strpos($v, ':') ? $this->expandQname($v) : $v;
- }
- $eAttrs[$k] = $v;
- }
- $attrs = $eAttrs;
- } else {
- $attrs = array();
- }
-
- if (ereg(':', $name)) {
-
- $prefix = substr($name, 0, strpos($name, ':'));
-
- $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] : '';
-
- $name = substr(strstr($name, ':'), 1);
- }
-
-
- switch ($this->status) {
- case 'message':
- if ($name == 'part') {
- if (isset($attrs['type'])) {
- $this->debug("msg " . $this->currentMessage . ": found part (with type) $attrs[name]: " . implode(',', $attrs));
- $this->messages[$this->currentMessage][$attrs['name']] = $attrs['type'];
- }
- if (isset($attrs['element'])) {
- $this->debug("msg " . $this->currentMessage . ": found part (with element) $attrs[name]: " . implode(',', $attrs));
- $this->messages[$this->currentMessage][$attrs['name']] = $attrs['element'] . '^';
- }
- }
- break;
- case 'portType':
- switch ($name) {
- case 'operation':
- $this->currentPortOperation = $attrs['name'];
- $this->debug("portType $this->currentPortType operation: $this->currentPortOperation");
- if (isset($attrs['parameterOrder'])) {
- $this->portTypes[$this->currentPortType][$attrs['name']]['parameterOrder'] = $attrs['parameterOrder'];
- }
- break;
- case 'documentation':
- $this->documentation = true;
- break;
-
- default:
- $m = isset($attrs['message']) ? $this->getLocalPart($attrs['message']) : '';
- $this->portTypes[$this->currentPortType][$this->currentPortOperation][$name]['message'] = $m;
- break;
- }
- break;
- case 'binding':
- switch ($name) {
- case 'binding':
-
- if (isset($attrs['style'])) {
- $this->bindings[$this->currentBinding]['prefix'] = $prefix;
- }
- $this->bindings[$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs);
- break;
- case 'header':
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus]['headers'][] = $attrs;
- break;
- case 'operation':
- if (isset($attrs['soapAction'])) {
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['soapAction'] = $attrs['soapAction'];
- }
- if (isset($attrs['style'])) {
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['style'] = $attrs['style'];
- }
- if (isset($attrs['name'])) {
- $this->currentOperation = $attrs['name'];
- $this->debug("current binding operation: $this->currentOperation");
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['name'] = $attrs['name'];
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['binding'] = $this->currentBinding;
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['endpoint'] = isset($this->bindings[$this->currentBinding]['endpoint']) ? $this->bindings[$this->currentBinding]['endpoint'] : '';
- }
- break;
- case 'input':
- $this->opStatus = 'input';
- break;
- case 'output':
- $this->opStatus = 'output';
- break;
- case 'body':
- if (isset($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus])) {
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = array_merge($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus], $attrs);
- } else {
- $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = $attrs;
- }
- break;
- }
- break;
- case 'service':
- switch ($name) {
- case 'port':
- $this->currentPort = $attrs['name'];
- $this->debug('current port: ' . $this->currentPort);
- $this->ports[$this->currentPort]['binding'] = $this->getLocalPart($attrs['binding']);
- break;
- case 'address':
- $this->ports[$this->currentPort]['location'] = $attrs['location'];
- $this->ports[$this->currentPort]['bindingType'] = $namespace;
- $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['bindingType'] = $namespace;
- $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['endpoint'] = $attrs['location'];
- break;
- }
- break;
- }
-
- switch ($name) {
- case 'import':
- if (isset($attrs['location'])) {
- $this->import[$attrs['namespace']][] = array('location' => $attrs['location'], 'loaded' => false);
- $this->debug('parsing import ' . $attrs['namespace']. ' - ' . $attrs['location'] . ' (' . count($this->import[$attrs['namespace']]).')');
- } else {
- $this->import[$attrs['namespace']][] = array('location' => '', 'loaded' => true);
- if (! $this->getPrefixFromNamespace($attrs['namespace'])) {
- $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace'];
- }
- $this->debug('parsing import ' . $attrs['namespace']. ' - [no location] (' . count($this->import[$attrs['namespace']]).')');
- }
- break;
-
-
-
-
- case 'message':
- $this->status = 'message';
- $this->messages[$attrs['name']] = array();
- $this->currentMessage = $attrs['name'];
- break;
- case 'portType':
- $this->status = 'portType';
- $this->portTypes[$attrs['name']] = array();
- $this->currentPortType = $attrs['name'];
- break;
- case "binding":
- if (isset($attrs['name'])) {
-
- if (strpos($attrs['name'], ':')) {
- $this->currentBinding = $this->getLocalPart($attrs['name']);
- } else {
- $this->currentBinding = $attrs['name'];
- }
- $this->status = 'binding';
- $this->bindings[$this->currentBinding]['portType'] = $this->getLocalPart($attrs['type']);
- $this->debug("current binding: $this->currentBinding of portType: " . $attrs['type']);
- }
- break;
- case 'service':
- $this->serviceName = $attrs['name'];
- $this->status = 'service';
- $this->debug('current service: ' . $this->serviceName);
- break;
- case 'definitions':
- foreach ($attrs as $name => $value) {
- $this->wsdl_info[$name] = $value;
- }
- break;
- }
- }
- }
-
- function end_element($parser, $name){
-
- if ( ereg('schema$', $name)) {
- $this->status = "";
- $this->appendDebug($this->currentSchema->getDebug());
- $this->currentSchema->clearDebug();
- $this->schemas[$this->currentSchema->schemaTargetNamespace][] = $this->currentSchema;
- $this->debug('Parsing WSDL schema done');
- }
- if ($this->status == 'schema') {
- $this->currentSchema->schemaEndElement($parser, $name);
- } else {
-
- $this->depth--;
- }
-
- if ($this->documentation) {
-
-
- $this->documentation = false;
- }
- }
-
- function character_data($parser, $data)
- {
- $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[$this->depth] : 0;
- if (isset($this->message[$pos]['cdata'])) {
- $this->message[$pos]['cdata'] .= $data;
- }
- if ($this->documentation) {
- $this->documentation .= $data;
- }
- }
-
- function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) {
- $this->debug("setCredentials username=$username authtype=$authtype certRequest=");
- $this->appendDebug($this->varDump($certRequest));
- $this->username = $username;
- $this->password = $password;
- $this->authtype = $authtype;
- $this->certRequest = $certRequest;
- }
- function getBindingData($binding)
- {
- if (is_array($this->bindings[$binding])) {
- return $this->bindings[$binding];
- }
- }
-
- function getOperations($bindingType = 'soap') {
- $ops = array();
- if ($bindingType == 'soap') {
- $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/';
- } elseif ($bindingType == 'soap12') {
- $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/';
- }
-
- foreach($this->ports as $port => $portData) {
-
- if ($portData['bindingType'] == $bindingType) {
-
-
-
-
- if (isset($this->bindings[ $portData['binding'] ]['operations'])) {
- $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']);
- }
- }
- }
- return $ops;
- }
-
- function getOperationData($operation, $bindingType = 'soap')
- {
- if ($bindingType == 'soap') {
- $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/';
- } elseif ($bindingType == 'soap12') {
- $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/';
- }
-
- foreach($this->ports as $port => $portData) {
-
- if ($portData['bindingType'] == $bindingType) {
-
-
- foreach(array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) {
-
- if ($operation == $bOperation) {
- $opData = $this->bindings[ $portData['binding'] ]['operations'][$operation];
- return $opData;
- }
- }
- }
- }
- }
-
- function getOperationDataForSoapAction($soapAction, $bindingType = 'soap') {
- if ($bindingType == 'soap') {
- $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/';
- } elseif ($bindingType == 'soap12') {
- $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/';
- }
-
- foreach($this->ports as $port => $portData) {
-
- if ($portData['bindingType'] == $bindingType) {
-
- foreach ($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) {
- if ($opData['soapAction'] == $soapAction) {
- return $opData;
- }
- }
- }
- }
- }
-
- function getTypeDef($type, $ns) {
- $this->debug("in getTypeDef: type=$type, ns=$ns");
- if ((! $ns) && isset($this->namespaces['tns'])) {
- $ns = $this->namespaces['tns'];
- $this->debug("in getTypeDef: type namespace forced to $ns");
- }
- if (!isset($this->schemas[$ns])) {
- foreach ($this->schemas as $ns0 => $schema0) {
- if (strcasecmp($ns, $ns0) == 0) {
- $this->debug("in getTypeDef: replacing schema namespace $ns with $ns0");
- $ns = $ns0;
- break;
- }
- }
- }
- if (isset($this->schemas[$ns])) {
- $this->debug("in getTypeDef: have schema for namespace $ns");
- for ($i = 0; $i < count($this->schemas[$ns]); $i++) {
- $xs = &$this->schemas[$ns][$i];
- $t = $xs->getTypeDef($type);
-
-
- if ($t) {
- if (!isset($t['phpType'])) {
-
- $uqType = substr($t['type'], strrpos($t['type'], ':') + 1);
- $ns = substr($t['type'], 0, strrpos($t['type'], ':'));
- $etype = $this->getTypeDef($uqType, $ns);
- if ($etype) {
- $this->debug("found type for [element] $type:");
- $this->debug($this->varDump($etype));
- if (isset($etype['phpType'])) {
- $t['phpType'] = $etype['phpType'];
- }
- if (isset($etype['elements'])) {
- $t['elements'] = $etype['elements'];
- }
- if (isset($etype['attrs'])) {
- $t['attrs'] = $etype['attrs'];
- }
- }
- }
- return $t;
- }
- }
- } else {
- $this->debug("in getTypeDef: do not have schema for namespace $ns");
- }
- return false;
- }
-
- function webDescription(){
- global $HTTP_SERVER_VARS;
- if (isset($_SERVER)) {
- $PHP_SELF = $_SERVER['PHP_SELF'];
- } elseif (isset($HTTP_SERVER_VARS)) {
- $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];
- } else {
- $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available");
- }
- $b = '
- <html><head><title>NuSOAP: '.$this->serviceName.'</title>
- <style type="text/css">
- body { font-family: arial; color: #000000; background-color: #ffffff; margin: 0px 0px 0px 0px; }
- p { font-family: arial; color: #000000; margin-top: 0px; margin-bottom: 12px; }
- pre { background-color: silver; padding: 5px; font-family: Courier New; font-size: x-small; color: #000000;}
- ul { margin-top: 10px; margin-left: 20px; }
- li { list-style-type: none; margin-top: 10px; color: #000000; }
- .content{
- margin-left: 0px; padding-bottom: 2em; }
- .nav {
- padding-top: 10px; padding-bottom: 10px; padding-left: 15px; font-size: .70em;
- margin-top: 10px; margin-left: 0px; color: #000000;
- background-color: #ccccff; width: 20%; margin-left: 20px; margin-top: 20px; }
- .title {
- font-family: arial; font-size: 26px; color: #ffffff;
- background-color: #999999; width: 105%; margin-left: 0px;
- padding-top: 10px; padding-bottom: 10px; padding-left: 15px;}
- .hidden {
- position: absolute; visibility: hidden; z-index: 200; left: 250px; top: 100px;
- font-family: arial; overflow: hidden; width: 600;
- padding: 20px; font-size: 10px; background-color: #999999;
- layer-background-color:#FFFFFF; }
- a,a:active { color: charcoal; font-weight: bold; }
- a:visited { color: #666666; font-weight: bold; }
- a:hover { color: cc3300; font-weight: bold; }
- </style>
- <script language="JavaScript" type="text/javascript">
- <!--
- // POP-UP CAPTIONS...
- function lib_bwcheck(){ //Browsercheck (needed)
- this.ver=navigator.appVersion
- this.agent=navigator.userAgent
- this.dom=document.getElementById?1:0
- this.opera5=this.agent.indexOf("Opera 5")>-1
- this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0;
- this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0;
- this.ie4=(document.all && !this.dom && !this.opera5)?1:0;
- this.ie=this.ie4||this.ie5||this.ie6
- this.mac=this.agent.indexOf("Mac")>-1
- this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0;
- this.ns4=(document.layers && !this.dom)?1:0;
- this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5)
- return this
- }
- var bw = new lib_bwcheck()
- //Makes crossbrowser object.
- function makeObj(obj){
- this.evnt=bw.dom? document.getElementById(obj):bw.ie4?document.all[obj]:bw.ns4?document.layers[obj]:0;
- if(!this.evnt) return false
- this.css=bw.dom||bw.ie4?this.evnt.style:bw.ns4?this.evnt:0;
- this.wref=bw.dom||bw.ie4?this.evnt:bw.ns4?this.css.document:0;
- this.writeIt=b_writeIt;
- return this
- }
- // A unit of measure that will be added when setting the position of a layer.
- //var px = bw.ns4||window.opera?"":"px";
- function b_writeIt(text){
- if (bw.ns4){this.wref.write(text);this.wref.close()}
- else this.wref.innerHTML = text
- }
- //Shows the messages
- var oDesc;
- function popup(divid){
- if(oDesc = new makeObj(divid)){
- oDesc.css.visibility = "visible"
- }
- }
- function popout(){ // Hides message
- if(oDesc) oDesc.css.visibility = "hidden"
- }
- //-->
- </script>
- </head>
- <body>
- <div class=content>
- <br><br>
- <div class=title>'.$this->serviceName.'</div>
- <div class=nav>
- <p>View the <a href="'.$PHP_SELF.'?wsdl">WSDL</a> for the service.
- Click on an operation name to view it's details.</p>
- <ul>';
- foreach($this->getOperations() as $op => $data){
- $b .= "<li><a href='#' onclick=\"popout();popup('$op')\">$op</a></li>";
-
- $b .= "<div id='$op' class='hidden'>
- <a href='#' onclick='popout()'><font color='#ffffff'>Close</font></a><br><br>";
- foreach($data as $donnie => $marie){
- if($donnie == 'input' || $donnie == 'output'){
- $b .= "<font color='white'>".ucfirst($donnie).':</font><br>';
- foreach($marie as $captain => $tenille){
- if($captain == 'parts'){
- $b .= " $captain:<br>";
-
- foreach($tenille as $joanie => $chachi){
- $b .= " $joanie: $chachi<br>";
- }
-
- } else {
- $b .= " $captain: $tenille<br>";
- }
- }
- } else {
- $b .= "<font color='white'>".ucfirst($donnie).":</font> $marie<br>";
- }
- }
- $b .= '</div>';
- }
- $b .= '
- <ul>
- </div>
- </div></body></html>';
- return $b;
- }
-
- function serialize($debug = 0)
- {
- $xml = '<?xml version="1.0" encoding="ISO-8859-1"?>';
- $xml .= "\n<definitions";
- foreach($this->namespaces as $k => $v) {
- $xml .= " xmlns:$k=\"$v\"";
- }
-
- if (isset($this->namespaces['wsdl'])) {
- $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\"";
- }
- if (isset($this->namespaces['tns'])) {
- $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\"";
- }
- $xml .= '>';
-
- if (sizeof($this->import) > 0) {
- foreach($this->import as $ns => $list) {
- foreach ($list as $ii) {
- if ($ii['location'] != '') {
- $xml .= '<import location="' . $ii['location'] . '" namespace="' . $ns . '" />';
- } else {
- $xml .= '<import namespace="' . $ns . '" />';
- }
- }
- }
- }
-
- if (count($this->schemas)>=1) {
- $xml .= "\n<types>\n";
- foreach ($this->schemas as $ns => $list) {
- foreach ($list as $xs) {
- $xml .= $xs->serializeSchema();
- }
- }
- $xml .= '</types>';
- }
-
- if (count($this->messages) >= 1) {
- foreach($this->messages as $msgName => $msgParts) {
- $xml .= "\n<message name=\"" . $msgName . '">';
- if(is_array($msgParts)){
- foreach($msgParts as $partName => $partType) {
-
- if (strpos($partType, ':')) {
- $typePrefix = $this->getPrefixFromNamespace($this->getPrefix($partType));
- } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) {
-
- $typePrefix = 'xsd';
- } else {
- foreach($this->typemap as $ns => $types) {
- if (isset($types[$partType])) {
- $typePrefix = $this->getPrefixFromNamespace($ns);
- }
- }
- if (!isset($typePrefix)) {
- die("$partType has no namespace!");
- }
- }
- $ns = $this->getNamespaceFromPrefix($typePrefix);
- $localPart = $this->getLocalPart($partType);
- $typeDef = $this->getTypeDef($localPart, $ns);
- if ($typeDef['typeClass'] == 'element') {
- $elementortype = 'element';
- if (substr($localPart, -1) == '^') {
- $localPart = substr($localPart, 0, -1);
- }
- } else {
- $elementortype = 'type';
- }
- $xml .= "\n" . ' <part name="' . $partName . '" ' . $elementortype . '="' . $typePrefix . ':' . $localPart . '" />';
- }
- }
- $xml .= '</message>';
- }
- }
-
- if (count($this->bindings) >= 1) {
- $binding_xml = '';
- $portType_xml = '';
- foreach($this->bindings as $bindingName => $attrs) {
- $binding_xml .= "\n<binding name=\"" . $bindingName . '" type="tns:' . $attrs['portType'] . '">';
- $binding_xml .= "\n" . ' <soap:binding style="' . $attrs['style'] . '" transport="' . $attrs['transport'] . '"/>';
- $portType_xml .= "\n<portType name=\"" . $attrs['portType'] . '">';
- foreach($attrs['operations'] as $opName => $opParts) {
- $binding_xml .= "\n" . ' <operation name="' . $opName . '">';
- $binding_xml .= "\n" . ' <soap:operation soapAction="' . $opParts['soapAction'] . '" style="'. $opParts['style'] . '"/>';
- if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') {
- $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"';
- } else {
- $enc_style = '';
- }
- $binding_xml .= "\n" . ' <input><soap:body use="' . $opParts['input']['use'] . '" namespace="' . $opParts['input']['namespace'] . '"' . $enc_style . '/></input>';
- if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') {
- $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"';
- } else {
- $enc_style = '';
- }
- $binding_xml .= "\n" . ' <output><soap:body use="' . $opParts['output']['use'] . '" namespace="' . $opParts['output']['namespace'] . '"' . $enc_style . '/></output>';
- $binding_xml .= "\n" . ' </operation>';
- $portType_xml .= "\n" . ' <operation name="' . $opParts['name'] . '"';
- if (isset($opParts['parameterOrder'])) {
- $portType_xml .= ' parameterOrder="' . $opParts['parameterOrder'] . '"';
- }
- $portType_xml .= '>';
- if(isset($opParts['documentation']) && $opParts['documentation'] != '') {
- $portType_xml .= "\n" . ' <documentation>' . htmlspecialchars($opParts['documentation']) . '</documentation>';
- }
- $portType_xml .= "\n" . ' <input message="tns:' . $opParts['input']['message'] . '"/>';
- $portType_xml .= "\n" . ' <output message="tns:' . $opParts['output']['message'] . '"/>';
- $portType_xml .= "\n" . ' </operation>';
- }
- $portType_xml .= "\n" . '</portType>';
- $binding_xml .= "\n" . '</binding>';
- }
- $xml .= $portType_xml . $binding_xml;
- }
-
- $xml .= "\n<service name=\"" . $this->serviceName . '">';
- if (count($this->ports) >= 1) {
- foreach($this->ports as $pName => $attrs) {
- $xml .= "\n" . ' <port name="' . $pName . '" binding="tns:' . $attrs['binding'] . '">';
- $xml .= "\n" . ' <soap:address location="' . $attrs['location'] . ($debug ? '?debug=1' : '') . '"/>';
- $xml .= "\n" . ' </port>';
- }
- }
- $xml .= "\n" . '</service>';
- return $xml . "\n</definitions>";
- }
-
- function parametersMatchWrapped($type, &$parameters) {
- $this->debug("in parametersMatchWrapped type=$type, parameters=");
- $this->appendDebug($this->varDump($parameters));
-
- if (strpos($type, ':')) {
- $uqType = substr($type, strrpos($type, ':') + 1);
- $ns = substr($type, 0, strrpos($type, ':'));
- $this->debug("in parametersMatchWrapped: got a prefixed type: $uqType, $ns");
- if ($this->getNamespaceFromPrefix($ns)) {
- $ns = $this->getNamespaceFromPrefix($ns);
- $this->debug("in parametersMatchWrapped: expanded prefixed type: $uqType, $ns");
- }
- } else {
-
-
- $this->debug("in parametersMatchWrapped: No namespace for type $type");
- $ns = '';
- $uqType = $type;
- }
-
- if (!$typeDef = $this->getTypeDef($uqType, $ns)) {
- $this->debug("in parametersMatchWrapped: $type ($uqType) is not a supported type.");
- return false;
- }
- $this->debug("in parametersMatchWrapped: found typeDef=");
- $this->appendDebug($this->varDump($typeDef));
- if (substr($uqType, -1) == '^') {
- $uqType = substr($uqType, 0, -1);
- }
- $phpType = $typeDef['phpType'];
- $arrayType = (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '');
- $this->debug("in parametersMatchWrapped: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: $arrayType");
-
- if ($phpType != 'struct') {
- $this->debug("in parametersMatchWrapped: not a struct");
- return false;
- }
-
- if (isset($typeDef['elements']) && is_array($typeDef['elements'])) {
- $elements = 0;
- $matches = 0;
- $change = false;
- if ($this->isArraySimpleOrStruct($parameters) == 'arraySimple' && count($parameters) == count($typeDef['elements'])) {
- $this->debug("in parametersMatchWrapped: (wrapped return value kludge) correct number of elements in simple array, so change array and wrap");
- $change = true;
- }
- foreach ($typeDef['elements'] as $name => $attrs) {
- if ($change) {
- $this->debug("in parametersMatchWrapped: change parameter $element to name $name");
- $parameters[$name] = $parameters[$elements];
- unset($parameters[$elements]);
- $matches++;
- } elseif (isset($parameters[$name])) {
- $this->debug("in parametersMatchWrapped: have parameter named $name");
- $matches++;
- } else {
- $this->debug("in parametersMatchWrapped: do not have parameter named $name");
- }
- $elements++;
- }
- $this->debug("in parametersMatchWrapped: $matches parameter names match $elements wrapped parameter names");
- if ($matches == 0) {
- return false;
- }
- return true;
- }
-
-
- $this->debug("in parametersMatchWrapped: no elements type $ns:$uqType");
- return count($parameters) == 0;
- }
-
- function serializeRPCParameters($operation, $direction, $parameters, $bindingType = 'soap') {
- $this->debug("in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion, bindingType=$bindingType");
- $this->appendDebug('parameters=' . $this->varDump($parameters));
- if ($direction != 'input' && $direction != 'output') {
- $this->debug('The value of the \$direction argument needs to be either "input" or "output"');
- $this->setError('The value of the \$direction argument needs to be either "input" or "output"');
- return false;
- }
- if (!$opData = $this->getOperationData($operation, $bindingType)) {
- $this->debug('Unable to retrieve WSDL data for operation: ' . $operation . ' bindingType: ' . $bindingType);
- $this->setError('Unable to retrieve WSDL data for operation: ' . $operation . ' bindingType: ' . $bindingType);
- return false;
- }
- $this->debug('in serializeRPCParameters: opData:');
- $this->appendDebug($this->varDump($opData));
-
- $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
- if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) {
- $encodingStyle = $opData['output']['encodingStyle'];
- $enc_style = $encodingStyle;
- }
-
- $xml = '';
- if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) {
- $parts = &$opData[$direction]['parts'];
- $part_count = sizeof($parts);
- $style = $opData['style'];
- $use = $opData[$direction]['use'];
- $this->debug("have $part_count part(s) to serialize using $style/$use");
- if (is_array($parameters)) {
- $parametersArrayType = $this->isArraySimpleOrStruct($parameters);
- $parameter_count = count($parameters);
- $this->debug("have $parameter_count parameter(s) provided as $parametersArrayType to serialize");
-
- if ($style == 'document' && $use == 'literal' && $part_count == 1 && isset($parts['parameters'])) {
- $this->debug('check whether the caller has wrapped the parameters');
- if ((($parametersArrayType == 'arrayStruct' || $parameter_count == 0) && !isset($parameters['parameters'])) || ($direction == 'output' && $parametersArrayType == 'arraySimple' && $parameter_count == 1)) {
- $this->debug('check whether caller\'s parameters match the wrapped ones');
- if ($this->parametersMatchWrapped($parts['parameters'], $parameters)) {
- $this->debug('wrap the parameters for the caller');
- $parameters = array('parameters' => $parameters);
- $parameter_count = 1;
- }
- }
- }
- foreach ($parts as $name => $type) {
- $this->debug("serializing part $name of type $type");
-
- if (isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) {
- $encodingStyle = $opData[$direction]['encodingStyle'];
- $enc_style = $encodingStyle;
- } else {
- $enc_style = false;
- }
-
-
- if ($parametersArrayType == 'arraySimple') {
- $p = array_shift($parameters);
- $this->debug('calling serializeType w/indexed param');
- $xml .= $this->serializeType($name, $type, $p, $use, $enc_style);
- } elseif (isset($parameters[$name])) {
- $this->debug('calling serializeType w/named param');
- $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style);
- } else {
-
- $this->debug('calling serializeType w/null param');
- $xml .= $this->serializeType($name, $type, null, $use, $enc_style);
- }
- }
- } else {
- $this->debug('no parameters passed.');
- }
- }
- $this->debug("serializeRPCParameters returning: $xml");
- return $xml;
- }
-
- function serializeParameters($operation, $direction, $parameters)
- {
- $this->debug("in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion");
- $this->appendDebug('parameters=' . $this->varDump($parameters));
- if ($direction != 'input' && $direction != 'output') {
- $this->debug('The value of the \$direction argument needs to be either "input" or "output"');
- $this->setError('The value of the \$direction argument needs to be either "input" or "output"');
- return false;
- }
- if (!$opData = $this->getOperationData($operation)) {
- $this->debug('Unable to retrieve WSDL data for operation: ' . $operation);
- $this->setError('Unable to retrieve WSDL data for operation: ' . $operation);
- return false;
- }
- $this->debug('opData:');
- $this->appendDebug($this->varDump($opData));
-
- $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
- if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) {
- $encodingStyle = $opData['output']['encodingStyle'];
- $enc_style = $encodingStyle;
- }
-
- $xml = '';
- if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) {
- $use = $opData[$direction]['use'];
- $this->debug("use=$use");
- $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)');
- if (is_array($parameters)) {
- $parametersArrayType = $this->isArraySimpleOrStruct($parameters);
- $this->debug('have ' . $parametersArrayType . ' parameters');
- foreach($opData[$direction]['parts'] as $name => $type) {
- $this->debug('serializing part "'.$name.'" of type "'.$type.'"');
-
- if(isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) {
- $encodingStyle = $opData[$direction]['encodingStyle'];
- $enc_style = $encodingStyle;
- } else {
- $enc_style = false;
- }
-
-
- if ($parametersArrayType == 'arraySimple') {
- $p = array_shift($parameters);
- $this->debug('calling serializeType w/indexed param');
- $xml .= $this->serializeType($name, $type, $p, $use, $enc_style);
- } elseif (isset($parameters[$name])) {
- $this->debug('calling serializeType w/named param');
- $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style);
- } else {
-
- $this->debug('calling serializeType w/null param');
- $xml .= $this->serializeType($name, $type, null, $use, $enc_style);
- }
- }
- } else {
- $this->debug('no parameters passed.');
- }
- }
- $this->debug("serializeParameters returning: $xml");
- return $xml;
- }
-
- function serializeType($name, $type, $value, $use='encoded', $encodingStyle=false, $unqualified=false)
- {
- $this->debug("in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ? "unqualified" : "qualified"));
- $this->appendDebug("value=" . $this->varDump($value));
- if($use == 'encoded' && $encodingStyle) {
- $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"';
- }
-
- if (is_object($value) && get_class($value) == 'soapval') {
- if ($value->type_ns) {
- $type = $value->type_ns . ':' . $value->type;
- $forceType = true;
- $this->debug("in serializeType: soapval overrides type to $type");
- } elseif ($value->type) {
- $type = $value->type;
- $forceType = true;
- $this->debug("in serializeType: soapval overrides type to $type");
- } else {
- $forceType = false;
- $this->debug("in serializeType: soapval does not override type");
- }
- $attrs = $value->attributes;
- $value = $value->value;
- $this->debug("in serializeType: soapval overrides value to $value");
- if ($attrs) {
- if (!is_array($value)) {
- $value['!'] = $value;
- }
- foreach ($attrs as $n => $v) {
- $value['!' . $n] = $v;
- }
- $this->debug("in serializeType: soapval provides attributes");
- }
- } else {
- $forceType = false;
- }
- $xml = '';
- if (strpos($type, ':')) {
- $uqType = substr($type, strrpos($type, ':') + 1);
- $ns = substr($type, 0, strrpos($type, ':'));
- $this->debug("in serializeType: got a prefixed type: $uqType, $ns");
- if ($this->getNamespaceFromPrefix($ns)) {
- $ns = $this->getNamespaceFromPrefix($ns);
- $this->debug("in serializeType: expanded prefixed type: $uqType, $ns");
- }
- if($ns == $this->XMLSchemaVersion || $ns == 'http://schemas.xmlsoap.org/soap/encoding/'){
- $this->debug('in serializeType: type namespace indicates XML Schema or SOAP Encoding type');
- if ($unqualified && $use == 'literal') {
- $elementNS = " xmlns=\"\"";
- } else {
- $elementNS = '';
- }
- if (is_null($value)) {
- if ($use == 'literal') {
-
- $xml = "<$name$elementNS/>";
- } else {
-
- $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>";
- }
- $this->debug("in serializeType: returning: $xml");
- return $xml;
- }
- if ($uqType == 'Array') {
-
- return $this->serialize_val($value, $name, false, false, false, false, $use);
- }
- if ($uqType == 'boolean') {
- if ((is_string($value) && $value == 'false') || (! $value)) {
- $value = 'false';
- } else {
- $value = 'true';
- }
- }
- if ($uqType == 'string' && gettype($value) == 'string') {
- $value = $this->expandEntities($value);
- }
- if (($uqType == 'long' || $uqType == 'unsignedLong') && gettype($value) == 'double') {
- $value = sprintf("%.0lf", $value);
- }
-
-
-
- if (!$this->getTypeDef($uqType, $ns)) {
- if ($use == 'literal') {
- if ($forceType) {
- $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value</$name>";
- } else {
- $xml = "<$name$elementNS>$value</$name>";
- }
- } else {
- $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value</$name>";
- }
- $this->debug("in serializeType: returning: $xml");
- return $xml;
- }
- $this->debug('custom type extends XML Schema or SOAP Encoding namespace (yuck)');
- } else if ($ns == 'http://xml.apache.org/xml-soap') {
- $this->debug('in serializeType: appears to be Apache SOAP type');
- if ($uqType == 'Map') {
- $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap');
- if (! $tt_prefix) {
- $this->debug('in serializeType: Add namespace for Apache SOAP type');
- $tt_prefix = 'ns' . rand(1000, 9999);
- $this->namespaces[$tt_prefix] = 'http://xml.apache.org/xml-soap';
-
- $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap');
- }
- $contents = '';
- foreach($value as $k => $v) {
- $this->debug("serializing map element: key $k, value $v");
- $contents .= '<item>';
- $contents .= $this->serialize_val($k,'key',false,false,false,false,$use);
- $contents .= $this->serialize_val($v,'value',false,false,false,false,$use);
- $contents .= '</item>';
- }
- if ($use == 'literal') {
- if ($forceType) {
- $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\">$contents</$name>";
- } else {
- $xml = "<$name>$contents</$name>";
- }
- } else {
- $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\"$encodingStyle>$contents</$name>";
- }
- $this->debug("in serializeType: returning: $xml");
- return $xml;
- }
- $this->debug('in serializeType: Apache SOAP type, but only support Map');
- }
- } else {
-
-
- $this->debug("in serializeType: No namespace for type $type");
- $ns = '';
- $uqType = $type;
- }
- if(!$typeDef = $this->getTypeDef($uqType, $ns)){
- $this->setError("$type ($uqType) is not a supported type.");
- $this->debug("in serializeType: $type ($uqType) is not a supported type.");
- return false;
- } else {
- $this->debug("in serializeType: found typeDef");
- $this->appendDebug('typeDef=' . $this->varDump($typeDef));
- if (substr($uqType, -1) == '^') {
- $uqType = substr($uqType, 0, -1);
- }
- }
- $phpType = $typeDef['phpType'];
- $this->debug("in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') );
-
- if ($phpType == 'struct') {
- if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') {
- $elementName = $uqType;
- if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
- $elementNS = " xmlns=\"$ns\"";
- } else {
- $elementNS = " xmlns=\"\"";
- }
- } else {
- $elementName = $name;
- if ($unqualified) {
- $elementNS = " xmlns=\"\"";
- } else {
- $elementNS = '';
- }
- }
- if (is_null($value)) {
- if ($use == 'literal') {
-
- $xml = "<$elementName$elementNS/>";
- } else {
- $xml = "<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>";
- }
- $this->debug("in serializeType: returning: $xml");
- return $xml;
- }
- if (is_object($value)) {
- $value = get_object_vars($value);
- }
- if (is_array($value)) {
- $elementAttrs = $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType);
- if ($use == 'literal') {
- if ($forceType) {
- $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">";
- } else {
- $xml = "<$elementName$elementNS$elementAttrs>";
- }
- } else {
- $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>";
- }
- $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle);
- $xml .= "</$elementName>";
- } else {
- $this->debug("in serializeType: phpType is struct, but value is not an array");
- $this->setError("phpType is struct, but value is not an array: see debug output for details");
- $xml = '';
- }
- } elseif ($phpType == 'array') {
- if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
- $elementNS = " xmlns=\"$ns\"";
- } else {
- if ($unqualified) {
- $elementNS = " xmlns=\"\"";
- } else {
- $elementNS = '';
- }
- }
- if (is_null($value)) {
- if ($use == 'literal') {
-
- $xml = "<$name$elementNS/>";
- } else {
- $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" .
- $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') .
- ":Array\" " .
- $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') .
- ':arrayType="' .
- $this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) .
- ':' .
- $this->getLocalPart($typeDef['arrayType'])."[0]\"/>";
- }
- $this->debug("in serializeType: returning: $xml");
- return $xml;
- }
- if (isset($typeDef['multidimensional'])) {
- $nv = array();
- foreach($value as $v) {
- $cols = ',' . sizeof($v);
- $nv = array_merge($nv, $v);
- }
- $value = $nv;
- } else {
- $cols = '';
- }
- if (is_array($value) && sizeof($value) >= 1) {
- $rows = sizeof($value);
- $contents = '';
- foreach($value as $k => $v) {
- $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]");
-
- if (!in_array($typeDef['arrayType'],$this->typemap['http://www.w3.org/2001/XMLSchema'])) {
- $contents .= $this->serializeType('item', $typeDef['arrayType'], $v, $use);
- } else {
- $contents .= $this->serialize_val($v, 'item', $typeDef['arrayType'], null, $this->XMLSchemaVersion, false, $use);
- }
- }
- } else {
- $rows = 0;
- $contents = null;
- }
-
-
- if ($use == 'literal') {
- $xml = "<$name$elementNS>"
- .$contents
- ."</$name>";
- } else {
- $xml = "<$name$elementNS xsi:type=\"".$this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/').':Array" '.
- $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/')
- .':arrayType="'
- .$this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType']))
- .":".$this->getLocalPart($typeDef['arrayType'])."[$rows$cols]\">"
- .$contents
- ."</$name>";
- }
- } elseif ($phpType == 'scalar') {
- if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) {
- $elementNS = " xmlns=\"$ns\"";
- } else {
- if ($unqualified) {
- $elementNS = " xmlns=\"\"";
- } else {
- $elementNS = '';
- }
- }
- if ($use == 'literal') {
- if ($forceType) {
- $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value</$name>";
- } else {
- $xml = "<$name$elementNS>$value</$name>";
- }
- } else {
- $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value</$name>";
- }
- }
- $this->debug("in serializeType: returning: $xml");
- return $xml;
- }
-
- function serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType) {
- $xml = '';
- if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) {
- $this->debug("serialize attributes for XML Schema type $ns:$uqType");
- if (is_array($value)) {
- $xvalue = $value;
- } elseif (is_object($value)) {
- $xvalue = get_object_vars($value);
- } else {
- $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType");
- $xvalue = array();
- }
- foreach ($typeDef['attrs'] as $aName => $attrs) {
- if (isset($xvalue['!' . $aName])) {
- $xname = '!' . $aName;
- $this->debug("value provided for attribute $aName with key $xname");
- } elseif (isset($xvalue[$aName])) {
- $xname = $aName;
- $this->debug("value provided for attribute $aName with key $xname");
- } elseif (isset($attrs['default'])) {
- $xname = '!' . $aName;
- $xvalue[$xname] = $attrs['default'];
- $this->debug('use default value of ' . $xvalue[$aName] . ' for attribute ' . $aName);
- } else {
- $xname = '';
- $this->debug("no value provided for attribute $aName");
- }
- if ($xname) {
- $xml .= " $aName=\"" . $this->expandEntities($xvalue[$xname]) . "\"";
- }
- }
- } else {
- $this->debug("no attributes to serialize for XML Schema type $ns:$uqType");
- }
- if (isset($typeDef['extensionBase'])) {
- $ns = $this->getPrefix($typeDef['extensionBase']);
- $uqType = $this->getLocalPart($typeDef['extensionBase']);
- if ($this->getNamespaceFromPrefix($ns)) {
- $ns = $this->getNamespaceFromPrefix($ns);
- }
- if ($typeDef = $this->getTypeDef($uqType, $ns)) {
- $this->debug("serialize attributes for extension base $ns:$uqType");
- $xml .= $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType);
- } else {
- $this->debug("extension base $ns:$uqType is not a supported type");
- }
- }
- return $xml;
- }
-
- function serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false) {
- $xml = '';
- if (isset($typeDef['elements']) && is_array($typeDef['elements'])) {
- $this->debug("in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType");
- if (is_array($value)) {
- $xvalue = $value;
- } elseif (is_object($value)) {
- $xvalue = get_object_vars($value);
- } else {
- $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType");
- $xvalue = array();
- }
-
- if (count($typeDef['elements']) != count($xvalue)){
- $optionals = true;
- }
- foreach ($typeDef['elements'] as $eName => $attrs) {
- if (!isset($xvalue[$eName])) {
- if (isset($attrs['default'])) {
- $xvalue[$eName] = $attrs['default'];
- $this->debug('use default value of ' . $xvalue[$eName] . ' for element ' . $eName);
- }
- }
-
- if (isset($optionals)
- && (!isset($xvalue[$eName]))
- && ( (!isset($attrs['nillable'])) || $attrs['nillable'] != 'true')
- ){
- if (isset($attrs['minOccurs']) && $attrs['minOccurs'] <> '0') {
- $this->debug("apparent error: no value provided for element $eName with minOccurs=" . $attrs['minOccurs']);
- }
-
- $this->debug("no value provided for complexType element $eName and element is not nillable, so serialize nothing");
- } else {
-
- if (isset($xvalue[$eName])) {
- $v = $xvalue[$eName];
- } else {
- $v = null;
- }
- if (isset($attrs['form'])) {
- $unqualified = ($attrs['form'] == 'unqualified');
- } else {
- $unqualified = false;
- }
- if (isset($attrs['maxOccurs']) && ($attrs['maxOccurs'] == 'unbounded' || $attrs['maxOccurs'] > 1) && isset($v) && is_array($v) && $this->isArraySimpleOrStruct($v) == 'arraySimple') {
- $vv = $v;
- foreach ($vv as $k => $v) {
- if (isset($attrs['type']) || isset($attrs['ref'])) {
-
- $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified);
- } else {
-
- $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use");
- $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use);
- }
- }
- } else {
- if (isset($attrs['type']) || isset($attrs['ref'])) {
-
- $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified);
- } else {
-
- $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use");
- $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use);
- }
- }
- }
- }
- } else {
- $this->debug("no elements to serialize for XML Schema type $ns:$uqType");
- }
- if (isset($typeDef['extensionBase'])) {
- $ns = $this->getPrefix($typeDef['extensionBase']);
- $uqType = $this->getLocalPart($typeDef['extensionBase']);
- if ($this->getNamespaceFromPrefix($ns)) {
- $ns = $this->getNamespaceFromPrefix($ns);
- }
- if ($typeDef = $this->getTypeDef($uqType, $ns)) {
- $this->debug("serialize elements for extension base $ns:$uqType");
- $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle);
- } else {
- $this->debug("extension base $ns:$uqType is not a supported type");
- }
- }
- return $xml;
- }
-
- function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType='') {
- if (count($elements) > 0) {
- $eElements = array();
- foreach($elements as $n => $e){
-
- $ee = array();
- if (is_array($e)) {
- foreach ($e as $k => $v) {
- $k = strpos($k,':') ? $this->expandQname($k) : $k;
- $v = strpos($v,':') ? $this->expandQname($v) : $v;
- $ee[$k] = $v;
- }
- }
- $eElements[$n] = $ee;
- }
- $elements = $eElements;
- }
- if (count($attrs) > 0) {
- foreach($attrs as $n => $a){
-
- foreach ($a as $k => $v) {
- $k = strpos($k,':') ? $this->expandQname($k) : $k;
- $v = strpos($v,':') ? $this->expandQname($v) : $v;
- $aa[$k] = $v;
- }
- $eAttrs[$n] = $aa;
- }
- $attrs = $eAttrs;
- }
- $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase;
- $arrayType = strpos($arrayType,':') ? $this->expandQname($arrayType) : $arrayType;
- $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
- $this->schemas[$typens][0]->addComplexType($name,$typeClass,$phpType,$compositor,$restrictionBase,$elements,$attrs,$arrayType);
- }
-
- function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) {
- $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase;
- $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
- $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration);
- }
-
- function addElement($attrs) {
- $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns'];
- $this->schemas[$typens][0]->addElement($attrs);
- }
-
- function addOperation($name, $in = false, $out = false, $namespace = false, $soapaction = false, $style = 'rpc', $use = 'encoded', $documentation = '', $encodingStyle = ''){
- if ($use == 'encoded' && $encodingStyle == '') {
- $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
- }
- if ($style == 'document') {
- $elements = array();
- foreach ($in as $n => $t) {
- $elements[$n] = array('name' => $n, 'type' => $t);
- }
- $this->addComplexType($name . 'RequestType', 'complexType', 'struct', 'all', '', $elements);
- $this->addElement(array('name' => $name, 'type' => $name . 'RequestType'));
- $in = array('parameters' => 'tns:' . $name . '^');
- $elements = array();
- foreach ($out as $n => $t) {
- $elements[$n] = array('name' => $n, 'type' => $t);
- }
- $this->addComplexType($name . 'ResponseType', 'complexType', 'struct', 'all', '', $elements);
- $this->addElement(array('name' => $name . 'Response', 'type' => $name . 'ResponseType', 'form' => 'qualified'));
- $out = array('parameters' => 'tns:' . $name . 'Response' . '^');
- }
-
- $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] =
- array(
- 'name' => $name,
- 'binding' => $this->serviceName . 'Binding',
- 'endpoint' => $this->endpoint,
- 'soapAction' => $soapaction,
- 'style' => $style,
- 'input' => array(
- 'use' => $use,
- 'namespace' => $namespace,
- 'encodingStyle' => $encodingStyle,
- 'message' => $name . 'Request',
- 'parts' => $in),
- 'output' => array(
- 'use' => $use,
- 'namespace' => $namespace,
- 'encodingStyle' => $encodingStyle,
- 'message' => $name . 'Response',
- 'parts' => $out),
- 'namespace' => $namespace,
- 'transport' => 'http://schemas.xmlsoap.org/soap/http',
- 'documentation' => $documentation);
-
-
- if($in)
- {
- foreach($in as $pName => $pType)
- {
- if(strpos($pType,':')) {
- $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType);
- }
- $this->messages[$name.'Request'][$pName] = $pType;
- }
- } else {
- $this->messages[$name.'Request']= '0';
- }
- if($out)
- {
- foreach($out as $pName => $pType)
- {
- if(strpos($pType,':')) {
- $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType);
- }
- $this->messages[$name.'Response'][$pName] = $pType;
- }
- } else {
- $this->messages[$name.'Response']= '0';
- }
- return true;
- }
- }
- ?><?php
- class nusoap_parser extends nusoap_base {
- public $xml = '';
- public $xml_encoding = '';
- public $method = '';
- public $root_struct = '';
- public $root_struct_name = '';
- public $root_struct_namespace = '';
- public $root_header = '';
- public $document = '';
-
- public $status = '';
- public $position = 0;
- public $depth = 0;
- public $default_namespace = '';
- public $namespaces = array();
- public $message = array();
- public $parent = '';
- public $fault = false;
- public $fault_code = '';
- public $fault_str = '';
- public $fault_detail = '';
- public $depth_array = array();
- public $debug_flag = true;
- public $soapresponse = NULL;
- public $soapheader = NULL;
- public $responseHeaders = '';
- public $body_position = 0;
-
-
- public $ids = array();
-
- public $multirefs = array();
-
- public $decode_utf8 = true;
-
- function nusoap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){
- parent::nusoap_base();
- $this->xml = $xml;
- $this->xml_encoding = $encoding;
- $this->method = $method;
- $this->decode_utf8 = $decode_utf8;
-
- if(!empty($xml)){
-
- $pos_xml = strpos($xml, '<?xml');
- if ($pos_xml !== FALSE) {
- $xml_decl = substr($xml, $pos_xml, strpos($xml, '?>', $pos_xml + 2) - $pos_xml + 1);
- if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) {
- $xml_encoding = $res[1];
- if (strtoupper($xml_encoding) != $encoding) {
- $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'";
- $this->debug($err);
- if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') {
- $this->setError($err);
- return;
- }
-
- } else {
- $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration');
- }
- } else {
- $this->debug('No encoding specified in XML declaration');
- }
- } else {
- $this->debug('No XML declaration');
- }
- $this->debug('Entering nusoap_parser(), length='.strlen($xml).', encoding='.$encoding);
-
- $this->parser = xml_parser_create($this->xml_encoding);
-
-
- xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
- xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding);
-
- xml_set_object($this->parser, $this);
-
- xml_set_element_handler($this->parser, 'start_element','end_element');
- xml_set_character_data_handler($this->parser,'character_data');
-
- if(!xml_parse($this->parser,$xml,true)){
-
- $err = sprintf('XML error parsing SOAP payload on line %d: %s',
- xml_get_current_line_number($this->parser),
- xml_error_string(xml_get_error_code($this->parser)));
- $this->debug($err);
- $this->debug("XML payload:\n" . $xml);
- $this->setError($err);
- } else {
- $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name);
-
- $this->soapresponse = $this->message[$this->root_struct]['result'];
-
- if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){
- $this->soapheader = $this->message[$this->root_header]['result'];
- }
-
- if(sizeof($this->multirefs) > 0){
- foreach($this->multirefs as $id => $hrefs){
- $this->debug('resolving multirefs for id: '.$id);
- $idVal = $this->buildVal($this->ids[$id]);
- if (is_array($idVal) && isset($idVal['!id'])) {
- unset($idVal['!id']);
- }
- foreach($hrefs as $refPos => $ref){
- $this->debug('resolving href at pos '.$refPos);
- $this->multirefs[$id][$refPos] = $idVal;
- }
- }
- }
- }
- xml_parser_free($this->parser);
- } else {
- $this->debug('xml was empty, didn\'t parse!');
- $this->setError('xml was empty, didn\'t parse!');
- }
- }
-
- function start_element($parser, $name, $attrs) {
-
-
- $pos = $this->position++;
-
- $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>'');
-
-
- $this->message[$pos]['depth'] = $this->depth++;
-
- if($pos != 0){
- $this->message[$this->parent]['children'] .= '|'.$pos;
- }
-
- $this->message[$pos]['parent'] = $this->parent;
-
- $this->parent = $pos;
-
- $this->depth_array[$this->depth] = $pos;
-
- if(strpos($name,':')){
-
- $prefix = substr($name,0,strpos($name,':'));
-
- $name = substr(strstr($name,':'),1);
- }
-
- if($name == 'Envelope'){
- $this->status = 'envelope';
- } elseif($name == 'Header' && $this->status = 'envelope'){
- $this->root_header = $pos;
- $this->status = 'header';
- } elseif($name == 'Body' && $this->status = 'envelope'){
- $this->status = 'body';
- $this->body_position = $pos;
-
- } elseif($this->status == 'body' && $pos == ($this->body_position+1)){
- $this->status = 'method';
- $this->root_struct_name = $name;
- $this->root_struct = $pos;
- $this->message[$pos]['type'] = 'struct';
- $this->debug("found root struct $this->root_struct_name, pos $this->root_struct");
- }
-
- $this->message[$pos]['status'] = $this->status;
-
- $this->message[$pos]['name'] = htmlspecialchars($name);
-
- $this->message[$pos]['attrs'] = $attrs;
-
- $attstr = '';
- foreach($attrs as $key => $value){
- $key_prefix = $this->getPrefix($key);
- $key_localpart = $this->getLocalPart($key);
-
- if($key_prefix == 'xmlns'){
- if(ereg('^http://www.w3.org/[0-9]{4}/XMLSchema$',$value)){
- $this->XMLSchemaVersion = $value;
- $this->namespaces['xsd'] = $this->XMLSchemaVersion;
- $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance';
- }
- $this->namespaces[$key_localpart] = $value;
-
- if($name == $this->root_struct_name){
- $this->methodNamespace = $value;
- }
-
- } elseif($key_localpart == 'type'){
- if (isset($this->message[$pos]['type']) && $this->message[$pos]['type'] == 'array') {
-
- } else {
- $value_prefix = $this->getPrefix($value);
- $value_localpart = $this->getLocalPart($value);
- $this->message[$pos]['type'] = $value_localpart;
- $this->message[$pos]['typePrefix'] = $value_prefix;
- if(isset($this->namespaces[$value_prefix])){
- $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix];
- } else if(isset($attrs['xmlns:'.$value_prefix])) {
- $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix];
- }
-
- }
- } elseif($key_localpart == 'arrayType'){
- $this->message[$pos]['type'] = 'array';
-
- $expr = '([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]';
- if(ereg($expr,$value,$regs)){
- $this->message[$pos]['typePrefix'] = $regs[1];
- $this->message[$pos]['arrayTypePrefix'] = $regs[1];
- if (isset($this->namespaces[$regs[1]])) {
- $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]];
- } else if (isset($attrs['xmlns:'.$regs[1]])) {
- $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]];
- }
- $this->message[$pos]['arrayType'] = $regs[2];
- $this->message[$pos]['arraySize'] = $regs[3];
- $this->message[$pos]['arrayCols'] = $regs[4];
- }
-
- } elseif ($key_localpart == 'nil'){
- $this->message[$pos]['nil'] = ($value == 'true' || $value == '1');
-
- } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') {
- $this->message[$pos]['xattrs']['!' . $key] = $value;
- }
- if ($key == 'xmlns') {
- $this->default_namespace = $value;
- }
-
- if($key == 'id'){
- $this->ids[$value] = $pos;
- }
-
- if($key_localpart == 'root' && $value == 1){
- $this->status = 'method';
- $this->root_struct_name = $name;
- $this->root_struct = $pos;
- $this->debug("found root struct $this->root_struct_name, pos $pos");
- }
-
- $attstr .= " $key=\"$value\"";
- }
-
- if(isset($prefix)){
- $this->message[$pos]['namespace'] = $this->namespaces[$prefix];
- $this->default_namespace = $this->namespaces[$prefix];
- } else {
- $this->message[$pos]['namespace'] = $this->default_namespace;
- }
- if($this->status == 'header'){
- if ($this->root_header != $pos) {
- $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
- }
- } elseif($this->root_struct_name != ''){
- $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>";
- }
- }
-
- function end_element($parser, $name) {
-
- $pos = $this->depth_array[$this->depth--];
-
- if(strpos($name,':')){
-
- $prefix = substr($name,0,strpos($name,':'));
-
- $name = substr(strstr($name,':'),1);
- }
-
- if(isset($this->body_position) && $pos > $this->body_position){
-
- if(isset($this->message[$pos]['attrs']['href'])){
-
- $id = substr($this->message[$pos]['attrs']['href'],1);
-
- $this->multirefs[$id][$pos] = 'placeholder';
-
- $this->message[$pos]['result'] =& $this->multirefs[$id][$pos];
-
- } elseif($this->message[$pos]['children'] != ''){
-
- if(!isset($this->message[$pos]['result'])){
- $this->message[$pos]['result'] = $this->buildVal($pos);
- }
-
- } elseif (isset($this->message[$pos]['xattrs'])) {
- if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) {
- $this->message[$pos]['xattrs']['!'] = null;
- } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') {
- if (isset($this->message[$pos]['type'])) {
- $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
- } else {
- $parent = $this->message[$pos]['parent'];
- if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
- $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
- } else {
- $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata'];
- }
- }
- }
- $this->message[$pos]['result'] = $this->message[$pos]['xattrs'];
-
- } else {
-
- if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) {
- $this->message[$pos]['xattrs']['!'] = null;
- } elseif (isset($this->message[$pos]['type'])) {
- $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
- } else {
- $parent = $this->message[$pos]['parent'];
- if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
- $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
- } else {
- $this->message[$pos]['result'] = $this->message[$pos]['cdata'];
- }
- }
-
- }
- }
-
- if($this->status == 'header'){
- if ($this->root_header != $pos) {
- $this->responseHeaders .= "</" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
- }
- } elseif($pos >= $this->root_struct){
- $this->document .= "</" . (isset($prefix) ? $prefix . ':' : '') . "$name>";
- }
-
- if($pos == $this->root_struct){
- $this->status = 'body';
- $this->root_struct_namespace = $this->message[$pos]['namespace'];
- } elseif($name == 'Body'){
- $this->status = 'envelope';
- } elseif($name == 'Header'){
- $this->status = 'envelope';
- } elseif($name == 'Envelope'){
-
- }
-
- $this->parent = $this->message[$pos]['parent'];
- }
-
- function character_data($parser, $data){
- $pos = $this->depth_array[$this->depth];
- if ($this->xml_encoding=='UTF-8'){
-
-
-
- if($this->decode_utf8){
- $data = utf8_decode($data);
- }
- }
- $this->message[$pos]['cdata'] .= $data;
-
- if($this->status == 'header'){
- $this->responseHeaders .= $data;
- } else {
- $this->document .= $data;
- }
- }
-
- function get_response(){
- return $this->soapresponse;
- }
-
- function get_soapbody(){
- return $this->soapresponse;
- }
-
- function get_soapheader(){
- return $this->soapheader;
- }
-
- function getHeaders(){
- return $this->responseHeaders;
- }
-
- function decodeSimple($value, $type, $typens) {
-
- if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') {
- return (string) $value;
- }
- if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') {
- return (int) $value;
- }
- if ($type == 'float' || $type == 'double' || $type == 'decimal') {
- return (double) $value;
- }
- if ($type == 'boolean') {
- if (strtolower($value) == 'false' || strtolower($value) == 'f') {
- return false;
- }
- return (boolean) $value;
- }
- if ($type == 'base64' || $type == 'base64Binary') {
- $this->debug('Decode base64 value');
- return base64_decode($value);
- }
-
- if ($type == 'nonPositiveInteger' || $type == 'negativeInteger'
- || $type == 'nonNegativeInteger' || $type == 'positiveInteger'
- || $type == 'unsignedInt'
- || $type == 'unsignedShort' || $type == 'unsignedByte') {
- return (int) $value;
- }
-
- if ($type == 'array') {
- return array();
- }
-
- return (string) $value;
- }
-
- function buildVal($pos){
- if(!isset($this->message[$pos]['type'])){
- $this->message[$pos]['type'] = '';
- }
- $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']);
-
- if($this->message[$pos]['children'] != ''){
- $this->debug('in buildVal, there are children');
- $children = explode('|',$this->message[$pos]['children']);
- array_shift($children);
-
- if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){
- $r=0;
- $c=0;
- foreach($children as $child_pos){
- $this->debug("in buildVal, got an MD array element: $r, $c");
- $params[$r][] = $this->message[$child_pos]['result'];
- $c++;
- if($c == $this->message[$pos]['arrayCols']){
- $c = 0;
- $r++;
- }
- }
-
- } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){
- $this->debug('in buildVal, adding array '.$this->message[$pos]['name']);
- foreach($children as $child_pos){
- $params[] = &$this->message[$child_pos]['result'];
- }
-
- } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){
- $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']);
- foreach($children as $child_pos){
- $kv = explode("|",$this->message[$child_pos]['children']);
- $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result'];
- }
-
-
- } else {
-
- $this->debug('in buildVal, adding Java Vector or generic compound type '.$this->message[$pos]['name']);
- if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') {
- $notstruct = 1;
- } else {
- $notstruct = 0;
- }
-
- foreach($children as $child_pos){
- if($notstruct){
- $params[] = &$this->message[$child_pos]['result'];
- } else {
- if (isset($params[$this->message[$child_pos]['name']])) {
-
- if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) {
- $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]);
- }
- $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result'];
- } else {
- $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result'];
- }
- }
- }
- }
- if (isset($this->message[$pos]['xattrs'])) {
- $this->debug('in buildVal, handling attributes');
- foreach ($this->message[$pos]['xattrs'] as $n => $v) {
- $params[$n] = $v;
- }
- }
-
- if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') {
- $this->debug('in buildVal, handling simpleContent');
- if (isset($this->message[$pos]['type'])) {
- $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
- } else {
- $parent = $this->message[$pos]['parent'];
- if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
- $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
- } else {
- $params['!'] = $this->message[$pos]['cdata'];
- }
- }
- }
- $ret = is_array($params) ? $params : array();
- $this->debug('in buildVal, return:');
- $this->appendDebug($this->varDump($ret));
- return $ret;
- } else {
- $this->debug('in buildVal, no children, building scalar');
- $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : '';
- if (isset($this->message[$pos]['type'])) {
- $ret = $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : '');
- $this->debug("in buildVal, return: $ret");
- return $ret;
- }
- $parent = $this->message[$pos]['parent'];
- if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) {
- $ret = $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : '');
- $this->debug("in buildVal, return: $ret");
- return $ret;
- }
- $ret = $this->message[$pos]['cdata'];
- $this->debug("in buildVal, return: $ret");
- return $ret;
- }
- }
- }
- class soap_parser extends nusoap_parser {
- }
- ?><?php
- class nusoap_client extends nusoap_base {
- public $username = '';
- public $password = '';
- public $authtype = '';
- public $certRequest = array();
- public $requestHeaders = false;
- public $responseHeaders = '';
- public $responseHeader = NULL;
- public $document = '';
- public $endpoint;
- public $forceEndpoint = '';
- public $proxyhost = '';
- public $proxyport = '';
- public $proxyusername = '';
- public $proxypassword = '';
- public $xml_encoding = '';
- public $http_encoding = false;
- public $timeout = 0;
- public $response_timeout = 30;
- public $endpointType = '';
- public $persistentConnection = false;
- public $defaultRpcParams = false;
- public $request = '';
- public $response = '';
- public $responseData = '';
- public $cookies = array();
- public $decode_utf8 = true;
- public $operations = array();
- public $curl_options = array();
- public $bindingType = '';
- public $use_curl = false;
-
-
- public $fault;
-
- public $faultcode;
-
- public $faultstring;
-
- public $faultdetail;
-
- function nusoap_client($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30){
- parent::nusoap_base();
- $this->endpoint = $endpoint;
- $this->proxyhost = $proxyhost;
- $this->proxyport = $proxyport;
- $this->proxyusername = $proxyusername;
- $this->proxypassword = $proxypassword;
- $this->timeout = $timeout;
- $this->response_timeout = $response_timeout;
- $this->debug("ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout");
- $this->appendDebug('endpoint=' . $this->varDump($endpoint));
-
- if($wsdl){
- if (is_object($endpoint) && (get_class($endpoint) == 'wsdl')) {
- $this->wsdl = $endpoint;
- $this->endpoint = $this->wsdl->wsdl;
- $this->wsdlFile = $this->endpoint;
- $this->debug('existing wsdl instance created from ' . $this->endpoint);
- $this->checkWSDL();
- } else {
- $this->wsdlFile = $this->endpoint;
- $this->wsdl = null;
- $this->debug('will use lazy evaluation of wsdl from ' . $this->endpoint);
- }
- $this->endpointType = 'wsdl';
- } else {
- $this->debug("instantiate SOAP with endpoint at $endpoint");
- $this->endpointType = 'soap';
- }
- }
-
- function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){
- $this->operation = $operation;
- $this->fault = false;
- $this->setError('');
- $this->request = '';
- $this->response = '';
- $this->responseData = '';
- $this->faultstring = '';
- $this->faultcode = '';
- $this->opData = array();
- $this->debug("call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType");
- $this->appendDebug('params=' . $this->varDump($params));
- $this->appendDebug('headers=' . $this->varDump($headers));
- if ($headers) {
- $this->requestHeaders = $headers;
- }
- if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) {
- $this->loadWSDL();
- if ($this->getError())
- return false;
- }
-
- if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){
-
- $this->opData = $opData;
- $this->debug("found operation");
- $this->appendDebug('opData=' . $this->varDump($opData));
- if (isset($opData['soapAction'])) {
- $soapAction = $opData['soapAction'];
- }
- if (! $this->forceEndpoint) {
- $this->endpoint = $opData['endpoint'];
- } else {
- $this->endpoint = $this->forceEndpoint;
- }
- $namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : $namespace;
- $style = $opData['style'];
- $use = $opData['input']['use'];
-
- if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){
- $nsPrefix = 'ns' . rand(1000, 9999);
- $this->wsdl->namespaces[$nsPrefix] = $namespace;
- }
- $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace);
-
- if (is_string($params)) {
- $this->debug("serializing param string for WSDL operation $operation");
- $payload = $params;
- } elseif (is_array($params)) {
- $this->debug("serializing param array for WSDL operation $operation");
- $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params,$this->bindingType);
- } else {
- $this->debug('params must be array or string');
- $this->setError('params must be array or string');
- return false;
- }
- $usedNamespaces = $this->wsdl->usedNamespaces;
- if (isset($opData['input']['encodingStyle'])) {
- $encodingStyle = $opData['input']['encodingStyle'];
- } else {
- $encodingStyle = '';
- }
- $this->appendDebug($this->wsdl->getDebug());
- $this->wsdl->clearDebug();
- if ($errstr = $this->wsdl->getError()) {
- $this->debug('got wsdl error: '.$errstr);
- $this->setError('wsdl error: '.$errstr);
- return false;
- }
- } elseif($this->endpointType == 'wsdl') {
-
- $this->appendDebug($this->wsdl->getDebug());
- $this->wsdl->clearDebug();
- $this->setError( 'operation '.$operation.' not present.');
- $this->debug("operation '$operation' not present.");
- return false;
- } else {
-
-
- $nsPrefix = 'ns' . rand(1000, 9999);
-
- $payload = '';
- if (is_string($params)) {
- $this->debug("serializing param string for operation $operation");
- $payload = $params;
- } elseif (is_array($params)) {
- $this->debug("serializing param array for operation $operation");
- foreach($params as $k => $v){
- $payload .= $this->serialize_val($v,$k,false,false,false,false,$use);
- }
- } else {
- $this->debug('params must be array or string');
- $this->setError('params must be array or string');
- return false;
- }
- $usedNamespaces = array();
- if ($use == 'encoded') {
- $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/';
- } else {
- $encodingStyle = '';
- }
- }
-
- if ($style == 'rpc') {
- if ($use == 'literal') {
- $this->debug("wrapping RPC request with literal method element");
- if ($namespace) {
-
- $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" .
- $payload .
- "</$nsPrefix:$operation>";
- } else {
- $payload = "<$operation>" . $payload . "</$operation>";
- }
- } else {
- $this->debug("wrapping RPC request with encoded method element");
- if ($namespace) {
- $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" .
- $payload .
- "</$nsPrefix:$operation>";
- } else {
- $payload = "<$operation>" .
- $payload .
- "</$operation>";
- }
- }
- }
-
- $soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use,$encodingStyle);
- $this->debug("endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle");
- $this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000));
-
- $return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout);
- if($errstr = $this->getError()){
- $this->debug('Error: '.$errstr);
- return false;
- } else {
- $this->return = $return;
- $this->debug('sent message successfully and got a(n) '.gettype($return));
- $this->appendDebug('return=' . $this->varDump($return));
-
- if(is_array($return) && isset($return['faultcode'])){
- $this->debug('got fault');
- $this->setError($return['faultcode'].': '.$return['faultstring']);
- $this->fault = true;
- foreach($return as $k => $v){
- $this->$k = $v;
- $this->debug("$k = $v<br>");
- }
- return $return;
- } elseif ($style == 'document') {
-
-
- return $return;
- } else {
-
- if(is_array($return)){
-
-
- if(sizeof($return) > 1){
- return $return;
- }
-
- $return = array_shift($return);
- $this->debug('return shifted value: ');
- $this->appendDebug($this->varDump($return));
- return $return;
-
- } else {
- return "";
- }
- }
- }
- }
-
- function checkWSDL() {
- $this->appendDebug($this->wsdl->getDebug());
- $this->wsdl->clearDebug();
- $this->debug('checkWSDL');
-
- if ($errstr = $this->wsdl->getError()) {
- $this->debug('got wsdl error: '.$errstr);
- $this->setError('wsdl error: '.$errstr);
- } elseif ($this->operations = $this->wsdl->getOperations('soap')) {
- $this->bindingType = 'soap';
- $this->debug('got '.count($this->operations).' operations from wsdl '.$this->wsdlFile.' for binding type '.$this->bindingType);
- } elseif ($this->operations = $this->wsdl->getOperations('soap12')) {
- $this->bindingType = 'soap12';
- $this->debug('got '.count($this->operations).' operations from wsdl '.$this->wsdlFile.' for binding type '.$this->bindingType);
- $this->debug('**************** WARNING: SOAP 1.2 BINDING *****************');
- } else {
- $this->debug('getOperations returned false');
- $this->setError('no operations defined in the WSDL document!');
- }
- }
-
- function loadWSDL() {
- $this->debug('instantiating wsdl class with doc: '.$this->wsdlFile);
- $this->wsdl =& new wsdl('',$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout,$this->curl_options,$this->use_curl);
- $this->wsdl->setCredentials($this->username, $this->password, $this->authtype, $this->certRequest);
- $this->wsdl->fetchWSDL($this->wsdlFile);
- $this->checkWSDL();
- }
-
- function getOperationData($operation){
- if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) {
- $this->loadWSDL();
- if ($this->getError())
- return false;
- }
- if(isset($this->operations[$operation])){
- return $this->operations[$operation];
- }
- $this->debug("No data for operation: $operation");
- }
-
- function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) {
- $this->checkCookies();
-
- switch(true){
-
- case ereg('^http',$this->endpoint):
- $this->debug('transporting via HTTP');
- if($this->persistentConnection == true && is_object($this->persistentConnection)){
- $http =& $this->persistentConnection;
- } else {
- $http = new soap_transport_http($this->endpoint, $this->curl_options, $this->use_curl);
- if ($this->persistentConnection) {
- $http->usePersistentConnection();
- }
- }
- $http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset());
- $http->setSOAPAction($soapaction);
- if($this->proxyhost && $this->proxyport){
- $http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword);
- }
- if($this->authtype != '') {
- $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest);
- }
- if($this->http_encoding != ''){
- $http->setEncoding($this->http_encoding);
- }
- $this->debug('sending message, length='.strlen($msg));
- if(ereg('^http:',$this->endpoint)){
-
- $this->responseData = $http->send($msg,$timeout,$response_timeout,$this->cookies);
- } elseif(ereg('^https',$this->endpoint)){
-
-
-
-
-
-
- $this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout,$this->cookies);
- } else {
- $this->setError('no http/s in endpoint url');
- }
- $this->request = $http->outgoing_payload;
- $this->response = $http->incoming_payload;
- $this->appendDebug($http->getDebug());
- $this->UpdateCookies($http->incoming_cookies);
-
- if ($this->persistentConnection) {
- $http->clearDebug();
- if (!is_object($this->persistentConnection)) {
- $this->persistentConnection = $http;
- }
- }
- if($err = $http->getError()){
- $this->setError('HTTP Error: '.$err);
- return false;
- } elseif($this->getError()){
- return false;
- } else {
- $this->debug('got response, length='. strlen($this->responseData).' type='.$http->incoming_headers['content-type']);
- return $this->parseResponse($http->incoming_headers, $this->responseData);
- }
- break;
- default:
- $this->setError('no transport found, or selected transport is not yet supported!');
- return false;
- break;
- }
- }
-
- function parseResponse($headers, $data) {
- $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' headers:');
- $this->appendDebug($this->varDump($headers));
- if (!strstr($headers['content-type'], 'text/xml')) {
- $this->setError('Response not of type text/xml: ' . $headers['content-type']);
- return false;
- }
- if (strpos($headers['content-type'], '=')) {
- $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1));
- $this->debug('Got response encoding: ' . $enc);
- if(eregi('^(ISO-8859-1|US-ASCII|UTF-8)$',$enc)){
- $this->xml_encoding = strtoupper($enc);
- } else {
- $this->xml_encoding = 'US-ASCII';
- }
- } else {
-
- $this->xml_encoding = 'ISO-8859-1';
- }
- $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser');
- $parser = new nusoap_parser($data,$this->xml_encoding,$this->operation,$this->decode_utf8);
-
- $this->appendDebug($parser->getDebug());
-
- if($errstr = $parser->getError()){
- $this->setError( $errstr);
-
- unset($parser);
- return false;
- } else {
-
- $this->responseHeaders = $parser->getHeaders();
-
- $this->responseHeader = $parser->get_soapheader();
-
- $return = $parser->get_soapbody();
-
- $this->document = $parser->document;
-
- unset($parser);
-
- return $return;
- }
- }
-
- function setCurlOption($option, $value) {
- $this->debug("setCurlOption option=$option, value=");
- $this->appendDebug($this->varDump($value));
- $this->curl_options[$option] = $value;
- }
-
- function setEndpoint($endpoint) {
- $this->debug("setEndpoint(\"$endpoint\")");
- $this->forceEndpoint = $endpoint;
- }
-
- function setHeaders($headers){
- $this->debug("setHeaders headers=");
- $this->appendDebug($this->varDump($headers));
- $this->requestHeaders = $headers;
- }
-
- function getHeaders(){
- return $this->responseHeaders;
- }
-
- function getHeader(){
- return $this->responseHeader;
- }
-
- function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') {
- $this->proxyhost = $proxyhost;
- $this->proxyport = $proxyport;
- $this->proxyusername = $proxyusername;
- $this->proxypassword = $proxypassword;
- }
-
- function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) {
- $this->debug("setCredentials username=$username authtype=$authtype certRequest=");
- $this->appendDebug($this->varDump($certRequest));
- $this->username = $username;
- $this->password = $password;
- $this->authtype = $authtype;
- $this->certRequest = $certRequest;
- }
-
- function setHTTPEncoding($enc='gzip, deflate'){
- $this->debug("setHTTPEncoding(\"$enc\")");
- $this->http_encoding = $enc;
- }
-
- function setUseCURL($use) {
- $this->debug("setUseCURL($use)");
- $this->use_curl = $use;
- }
-
- function useHTTPPersistentConnection(){
- $this->debug("useHTTPPersistentConnection");
- $this->persistentConnection = true;
- }
-
- function getDefaultRpcParams() {
- return $this->defaultRpcParams;
- }
-
- function setDefaultRpcParams($rpcParams) {
- $this->defaultRpcParams = $rpcParams;
- }
-
- function getProxy() {
- $r = rand();
- $evalStr = $this->_getProxyClassCode($r);
-
- if ($this->getError()) {
- $this->debug("Error from _getProxyClassCode, so return NULL");
- return null;
- }
-
- eval($evalStr);
-
- $proxy = null;
- eval("\$proxy = new nusoap_proxy_$r('');");
-
- $proxy->endpointType = 'wsdl';
- $proxy->wsdlFile = $this->wsdlFile;
- $proxy->wsdl = $this->wsdl;
- $proxy->operations = $this->operations;
- $proxy->defaultRpcParams = $this->defaultRpcParams;
-
- $proxy->soap_defencoding = $this->soap_defencoding;
- $proxy->username = $this->username;
- $proxy->password = $this->password;
- $proxy->authtype = $this->authtype;
- $proxy->certRequest = $this->certRequest;
- $proxy->requestHeaders = $this->requestHeaders;
- $proxy->endpoint = $this->endpoint;
- $proxy->forceEndpoint = $this->forceEndpoint;
- $proxy->proxyhost = $this->proxyhost;
- $proxy->proxyport = $this->proxyport;
- $proxy->proxyusername = $this->proxyusername;
- $proxy->proxypassword = $this->proxypassword;
- $proxy->http_encoding = $this->http_encoding;
- $proxy->timeout = $this->timeout;
- $proxy->response_timeout = $this->response_timeout;
- $proxy->persistentConnection = &$this->persistentConnection;
- $proxy->decode_utf8 = $this->decode_utf8;
- $proxy->curl_options = $this->curl_options;
- $proxy->bindingType = $this->bindingType;
- $proxy->use_curl = $this->use_curl;
- return $proxy;
- }
-
- function _getProxyClassCode($r) {
- $this->debug("in getProxy endpointType=$this->endpointType");
- $this->appendDebug("wsdl=" . $this->varDump($this->wsdl));
- if ($this->endpointType != 'wsdl') {
- $evalStr = 'A proxy can only be created for a WSDL client';
- $this->setError($evalStr);
- $evalStr = "echo \"$evalStr\";";
- return $evalStr;
- }
- if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) {
- $this->loadWSDL();
- if ($this->getError()) {
- return "echo \"" . $this->getError() . "\";";
- }
- }
- $evalStr = '';
- foreach ($this->operations as $operation => $opData) {
- if ($operation != '') {
-
- if (sizeof($opData['input']['parts']) > 0) {
- $paramStr = '';
- $paramArrayStr = '';
- $paramCommentStr = '';
- foreach ($opData['input']['parts'] as $name => $type) {
- $paramStr .= "\$$name, ";
- $paramArrayStr .= "'$name' => \$$name, ";
- $paramCommentStr .= "$type \$$name, ";
- }
- $paramStr = substr($paramStr, 0, strlen($paramStr)-2);
- $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr)-2);
- $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr)-2);
- } else {
- $paramStr = '';
- $paramArrayStr = '';
- $paramCommentStr = 'void';
- }
- $opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace'];
- $evalStr .= "// $paramCommentStr
- function " . str_replace('.', '__', $operation) . "($paramStr) {
- \$params = array($paramArrayStr);
- return \$this->call('$operation', \$params, '".$opData['namespace']."', '".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."');
- }
- ";
- unset($paramStr);
- unset($paramCommentStr);
- }
- }
- $evalStr = 'class nusoap_proxy_'.$r.' extends nusoap_client {
- '.$evalStr.'
- }';
- return $evalStr;
- }
-
- function getProxyClassCode() {
- $r = rand();
- return $this->_getProxyClassCode($r);
- }
-
- function getHTTPBody($soapmsg) {
- return $soapmsg;
- }
-
- function getHTTPContentType() {
- return 'text/xml';
- }
-
- function getHTTPContentTypeCharset() {
- return $this->soap_defencoding;
- }
-
- function decodeUTF8($bool){
- $this->decode_utf8 = $bool;
- return true;
- }
-
- function setCookie($name, $value) {
- if (strlen($name) == 0) {
- return false;
- }
- $this->cookies[] = array('name' => $name, 'value' => $value);
- return true;
- }
-
- function getCookies() {
- return $this->cookies;
- }
-
- function checkCookies() {
- if (sizeof($this->cookies) == 0) {
- return true;
- }
- $this->debug('checkCookie: check ' . sizeof($this->cookies) . ' cookies');
- $curr_cookies = $this->cookies;
- $this->cookies = array();
- foreach ($curr_cookies as $cookie) {
- if (! is_array($cookie)) {
- $this->debug('Remove cookie that is not an array');
- continue;
- }
- if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) {
- if (strtotime($cookie['expires']) > time()) {
- $this->cookies[] = $cookie;
- } else {
- $this->debug('Remove expired cookie ' . $cookie['name']);
- }
- } else {
- $this->cookies[] = $cookie;
- }
- }
- $this->debug('checkCookie: '.sizeof($this->cookies).' cookies left in array');
- return true;
- }
-
- function UpdateCookies($cookies) {
- if (sizeof($this->cookies) == 0) {
-
- if (sizeof($cookies) > 0) {
- $this->debug('Setting new cookie(s)');
- $this->cookies = $cookies;
- }
- return true;
- }
- if (sizeof($cookies) == 0) {
-
- return true;
- }
-
- foreach ($cookies as $newCookie) {
- if (!is_array($newCookie)) {
- continue;
- }
- if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) {
- continue;
- }
- $newName = $newCookie['name'];
- $found = false;
- for ($i = 0; $i < count($this->cookies); $i++) {
- $cookie = $this->cookies[$i];
- if (!is_array($cookie)) {
- continue;
- }
- if (!isset($cookie['name'])) {
- continue;
- }
- if ($newName != $cookie['name']) {
- continue;
- }
- $newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN';
- $domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN';
- if ($newDomain != $domain) {
- continue;
- }
- $newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH';
- $path = isset($cookie['path']) ? $cookie['path'] : 'NOPATH';
- if ($newPath != $path) {
- continue;
- }
- $this->cookies[$i] = $newCookie;
- $found = true;
- $this->debug('Update cookie ' . $newName . '=' . $newCookie['value']);
- break;
- }
- if (! $found) {
- $this->debug('Add cookie ' . $newName . '=' . $newCookie['value']);
- $this->cookies[] = $newCookie;
- }
- }
- return true;
- }
- }
- if (!extension_loaded('soap')) {
-
- class soapclient extends nusoap_client {
- }
- }
- ?>
|