From 18ea5b9b9fd5b062e156245a29ce8157b687045d Mon Sep 17 00:00:00 2001 From: Brian Demsky Date: Thu, 21 Jul 2016 18:37:23 -0700 Subject: [PATCH] restructuring --- src/server/Makefile | 12 +++- src/server/iotcloud.cpp | 78 +--------------------- src/server/iotcloud.fcgi | Bin 28912 -> 48712 bytes src/server/iotquery.cpp | 137 +++++++++++++++++++++++++++++++++++++++ src/server/iotquery.h | 32 +++++++++ 5 files changed, 180 insertions(+), 79 deletions(-) create mode 100644 src/server/iotquery.cpp create mode 100644 src/server/iotquery.h diff --git a/src/server/Makefile b/src/server/Makefile index 9b6231b..0818b43 100644 --- a/src/server/Makefile +++ b/src/server/Makefile @@ -1,6 +1,12 @@ -CPPFLAGS=-O0 -g +CPPFLAGS=-O0 -g -Wall all: iotcloud.fcgi -iotcloud.fcgi: iotcloud.cpp - g++ $(CPPFLAGS) -o iotcloud.fcgi iotcloud.cpp -lfcgi -lfcgi++ +iotcloud.fcgi: iotcloud.o iotquery.o + g++ $(CPPFLAGS) -o iotcloud.fcgi iotcloud.o iotquery.o -lfcgi -lfcgi++ + +iotcloud.o: iotcloud.cpp iotquery.h + g++ $(CPPFLAGS) -c -o iotcloud.o iotcloud.cpp + +iotquery.o: iotquery.cpp iotquery.h + g++ $(CPPFLAGS) -c -o iotquery.o iotquery.cpp diff --git a/src/server/iotcloud.cpp b/src/server/iotcloud.cpp index 16bb28e..dac7ee8 100644 --- a/src/server/iotcloud.cpp +++ b/src/server/iotcloud.cpp @@ -1,26 +1,8 @@ #include -#include "fcgio.h" -#include "fcgi_stdio.h" -#include -#include -#define MAX_VARS 31 - -const char * query_str="QUERY_STRING"; -const char * uri_str="REQUEST_URI"; -const char * method_str="REQUEST_METHOD"; -const char * iotcloudroot_str="IOTCLOUD_ROOT"; +#include "iotquery.h" using namespace std; -struct iotquery { - const char * uri; - const char * query; - const char * method; - const char * iotcloudroot; -}; - -void parsequery(struct iotquery *, FCGX_Request *); -char * getdirectory(struct iotquery *); int main(void) { // Backup the stdio streambufs @@ -42,42 +24,7 @@ int main(void) { cout.rdbuf(&cout_fcgi_streambuf); cerr.rdbuf(&cerr_fcgi_streambuf); - struct iotquery query; - parsequery(&query, &request); - char * directory = getdirectory(&query); - - cout << "Content-type: text/html\r\n" - << "\r\n" - << "\n" - << " \n" - << " Hello, World!\n" - << " \n" - << " \n" - << "

Hello, World!

\n" - << " \n"; - char c[80]; - - cout << uri_str << " " << query.uri << "\n"; - cout << query_str << " " << query.query << "\n"; - cout << method_str << " " << query.method << "\n"; - cout << iotcloudroot_str << " " << query.iotcloudroot << "\n"; - - - do { - cin.read(c, 80); - c[cin.gcount()]=0; - cout << "[" << c << "]"; - } while(!cin.eof()); - - - - - cout << "\n"; - // Note: the fcgi_streambuf destructor will auto flush - - if (directory != NULL) - free(directory); - } + } // restore stdio streambufs cin.rdbuf(cin_streambuf); @@ -87,24 +34,3 @@ int main(void) { return 0; } - -void parsequery(struct iotquery * query, FCGX_Request * request) { - query->uri = FCGX_GetParam(uri_str, request->envp); - query->query = FCGX_GetParam(query_str, request->envp); - query->method = FCGX_GetParam(method_str, request->envp); - query->iotcloudroot = FCGX_GetParam(iotcloudroot_str, request->envp); -} - -char * getdirectory(struct iotquery * query) { - char * split = strchr((char *)query->uri, '?'); - if (split == NULL) - return NULL; - int split_len = (int) (split-query->uri); - int rootdir_len = strlen(query->iotcloudroot); - int directory_len = split_len + rootdir_len + 1; - char * directory = (char *) malloc(directory_len); - memcpy(directory, query->iotcloudroot, rootdir_len); - memcpy(directory + rootdir_len, query->uri, split_len); - directory[directory_len]=0; - return directory; -} diff --git a/src/server/iotcloud.fcgi b/src/server/iotcloud.fcgi index f5f828e7dd38a84274d9684bdf6a338f2046d04e..757b3b7068990a78a64c4f31665d45d60cec7b04 100755 GIT binary patch literal 48712 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 literal 28912 zcmeHwdwf*Ywf{adc^ncloQdETDKYnM{(AWG2pohfgYE zO{t1ntyO8Ux7Xf!s~21C<=R$JENbiZV(nE*Z7;3Xo2c!@S}nD<-0yeqb7oE^nOpAf z_xb$(_k5aa2`f0n5SgB{H+c3^Xuy>Vv&j(S#QcG?aI|_C8K3WHz4XMeoUV%o&{A z^yHg&Ufb0C@9!PCYTb-~x%GY5JFotitGxN&TTAbq+_bG_(|16cG2DRyiYLfD7dZC> z_=OqpkqmMkL&YbO|8xfYo(%Y|4DwwW^f{h^{$D^pkv{iiD0fu``Fk_SxibU4CWHL_ z8SoEh(0^wJdJaz$)$11-@HH9a4`h)4a0dL=4Dug@{30=3h}m7B5TXn)!)Hyr`>ZYr z7n=CDAiogw>*grD%*5jriHFylaxDB2lRh2)c@Pwfd~sy5*CLhi%@RLF{AB7_d^XCb z-G⩔>#hQ`g_mrLN0VO^_*$aSDEvJ%;W>(L2sZh#1WuM7%iQvjGkaL*cXb$gVD}a zO#_i|u+!f?5EO>dHy8;UvA91PHw6!-ou~;ys*e7IO(X?`%(Gm{D+k;mn zg0Z-eh{ix5I21Rc!src!L&Ctr%vl+XxA~*~K}APKOVRVrGgaNNy1I^gqthKWfCI{!ko<=H>;_9w>y8C^}RJ1$&y? z0s|A31g%Nd5w8mbqc8=qRK{KtKaa)gIm%5gTcYT&^9sX9~g)PND=6V zwG2uzopR7mGX;D6aX&J;V=;vXD%>MhHZ>WwaPgI`Ez6pWnu_YWWHObisaPPI)~#z? z)?!pw)GC5?>%dpXu7a*5pH9qxP6-iXE=;P z!VSu{bGGGk#WJc2L9SC=W9EC2|Ajm5!7?FNyl>)4L!koB$e);S;*8KF>XKusqoJ&i zz-O%&Uj3&{C^}mdBcHhVygRYvafq2F{fRTXfK_WIQw0fI;}rGg9Bu_`93&p2WinXf z4)JFtu^30)T@s>I%ppm_ZX4cO6EUOQhNmnmRN3(MbyI^4&oZpwwc)Kb9`k%Q{A`OD zahnaFXTz_v;n7gZ&}G9d78@|X!e~S%opFelo z@Fh0-du@2G;jFONhM#I75&we?f3^+3&xSXbx-xga4S$-A{(uc{F7ajV3pV`eHhSNV z_jKQ`?5QPg;oEs2o;`9Gyv4WUIsKrG2+5NR93VM4Hw(`xXL^w$+)tv>Vjeq0Qg zt~PpD!oMR-*B(6};dcl-3Gb8euL#oxNB2tjC}FzZ=xz!Bm@r*#bi0IqNSLlRIwav| z3Ddv&sd%ku{gW5wco{+TWrJ%95Q zuNe6(7=Pb8<;>+m?9ZLuCD!`pbA0jbIN|aQ|9bQE{S?J!FWUGtGfo}@@l8_x#)E9- z-UPgo6DL#C|&yUO^k;)(#0l4$PlrJ2(>A;kmeuA=nyY4PmBtwjbUn5nB(stcl zr7{kuGTKx|gUX=ynH(3W@|BE3ss=k0PO%?Sm53;u;yk44ahb&3P2HiXNR@V!`dOIg zN3KGbgGEk&{Ha;fyy9u^*|5SRp8#wCNX7ROxX=XdBG6<4Hxp}DfVfK{m{K0bN!(DLlv;;C<;#>y~7Qr5F%gRy+WuaBGr)l-j~ zCixuzvCn?}CDBuCgU7jEDOC5G9k9vND`XN_2-SZ<&07nby zOuJ;aVf)Cg^f9IE+R2_noa{|+D;zryak4}G7&z5icdZ)f@zqY2oig6~ZnJOrpiPaV zpnDg?262`yhio`Yp>MH_;Ujc~*O45#k??1pW0${d<3Wx9n6nCf!`Geg4JVHKb~WR# z%?!{)ZI}d;f<%hw2V;orlHQ!0EN$-?qO#pD zT3S{?%OensKk?L3b8NX&QlqdP*Buv$JZZYo2bj5QEvrLf-@Ipi!-t2P-%_x*jMg|E zj2P;6t$k}(^N4nM#{q4)`Mq7u@A>X!?yeK8PV))m`2vR(pRWutEbuZ3?gRTSNVGBq zn#&h>-?wYk37_`9^t68)Nl2pi6cO-;4^gk?6UizS4qx}laN@*{>psyEp3hu|LNTb% zdis(%7*tOD0psWqEHs`X_%yf5Bc-4)4e}IepXLf-c61tR+gp<9Rn48gHOocIn$D)yHEWj}?Q7O_il#_79t_9l$F~gy7rC*2 zidXi>2L}rB1pZ&ln>H)7OlLwp0`A;fzT??%k^(GkQ9r79BI)$KytTBuE*oU8BFatn#) zne;l8ajr?jXkvOH<{*#s_kMWt$Z2Yv-H=Z0el*>b6!{ zVy=@%EKXIfl0#XqpS)A^wj8Y(%T2i-mle-BZxMdNrd zng30o>tT~u$K=19%zp{^QRFYN=WmnQQqT8*&xI}JI^UAtrt+5~Z!+qsBR@#~Wv;^8 z9m`y0w>g_#?pw2#xynDE?Q>P#oa1vf?8sf^@XR03v^*$%&^ov-}joZMB>4zhao+FSfP`6p7k+UbUa(M!#qo5n5?4Y zdxioNw%#vTXEE0MRqJf8(4@1@0FPjM%)mL4fd?N9AO7WJgz>!&FQepnr!PmrJV0R> zad;VFU7*4|p2Q$nXKQ5&6!tSIqD(R&u&iUS<`};BV6f(M>kQC3i`tjxmH8IF&4ewz zyJW6fk1%PKk0pkz&w)u^Nr9z?ge^Uen{d?3mqh;$9@cy8^rEI=k;`z78P}Wf3Nyac zjC;*^vl-uP#`l=if04UME+{*C!-YeSLL(MO9rz^*n`l*Hl&4 zSJhW76z4;}aue0+Jde}{}72+QcpH_2%4-^=L1XJqu%H)QlR#}x8? z{VW+hyi!Kr?32->H_B+=9vMA$P)6VSxs1O32N^wHgkd4u`NVlL`cAWq{y7_mj@i!r z(`EE8i)8fVdKrCptBk()cQX3^Q!;w`Z5chI<8U(D`E0q24z7{Wa}gQ+;5Hc@`kIWM ze@;d(yd|R-vr5SK!#Ohg(Se_J`PtuApXyiEa zw1tSBzobE{av#FRM9UdHh<>iW4ph#&186AyM@+sKLvoUV+UEQ&1Up^;m&m&X%z3xr zA@XwpPYzxsaz45dgkJz|Jt>%}C?*fYMb5_+kj>1^V>1huV2sRhXq(}3Ea*OF-%noo zphlwLzmS=erxl=dA|AJBM8WIic4-&D4@uAW%_&Aze1Q&!&zYwE29w2upy4~DJSI|v zqF@fh=FHNbfH-Ek0gj`QCOAiX9)mb(mM3YbQy$GA3VuS1RcQBM;3eV;=6oH*BEJ}5 z!3)f;)7BtO_&R1wD;8`9M^1zGOEd(n^nk^vxLtU`C~_8Se}DzZIAsTVYK~WX7_CBB zQ3<^lC1pLA4LfG%E_eiTvUBT?Vp7S@z2NtV^qnw8)(?E}q{6dcvMgF$UwAu&74fGb zTG4c19Yt@z3|U3L2eDpMgLGlh0Q7Pfor8Ap7QGMMwimyIqJ>sm!YRg4{2=&5R`D@H zdhw%#3X8Wux^NeJIqP|go&|DW5f73sE-r(hEUhFa=R-}Dd<}NNTysO|3}~?(VXG+Q zZw-`!kz-VFA0ArKqfp0Dlt4PG=uDKR7kvZi!lI{;c9$ID23tVjIhMfB0X78|KpiFU zOLI}RqCzl=qHATnKZ80sita~0&nkHhMwUXBB1>vjfI>|nXQJ9!??Zk4nM)|-8PJF# z4nbOxfuy744P=sCOy#)tB=nm0dC1lD^$u-6SWdfvb@fx76e3d)+JY z@2R(;pzX8%jT&?-NNBUBv4XuO=$Q32G`xPL31-cDlevQ?sLy(gxkDycIO}S9WXuHJ zvzp)``W6%P&iDa|uU6o`8Pnk*`gIDrc-C|_%60{1Y11Eo8TH#Vx{fyE23qA#Z4~u` zRbECk<0jVNZiRBp_%aQApMtVxlz>U!qaZQ;0HH@T_7ZKTe`rYP`?OkA0+PxQ&BPmf zp?_PU95d>u#(o85&BQBu{ksa#XY%(1`cn!jobe3p@Qi}o)5A3VziM<$ZDx0{Pw0oW zds&FczmA0j5>cVQs!-ZYzT($kQxM*=Pik+6n`BSwSSh1UIrUDuobRu)Ck1bmQU3!n z3O$BsDu)-I!<@Mm#d4^3e+&csiM~A50~OBBkXHqlSUPc@{xgWl`z$&2hafEPb1Yys zf6L)m{CV_`i<$EeXwSS`-$jkingdymi_XNe2RUc80_Rw=5>J9>uZD(>i#I?QF=s!R zvVJ}nPqo(gMOM}?=v3Lx6KYb^%t_6mCN&4#F@H|>EC(HEicTqo*WaG^|I4~l}N)v(XpZz8L}OYE5gV3r*%_fgae61r0o7L!&-Va`M6dWN^#3% zW^PUzP~a|@2;rmce_uLGdx=t`%=vjycb^Vd)G7nER zT^}>;_HZrb`V-UTp3Bgdu1}b*@))R@>(5L#c!tr1U4LQPTh15bE};?dmA?mDxHJj0 zm45`aTn-7WD|f@6U0K@Kv7zZI&mmck_6UIfaz8j-x<+k>%I8w6$r6Z{=d&6vtq`Wz zT7H=26l=Rdw!QoUxUH*1>x1ELEa#flRjPd((sq=$ldMcT2;i3TDHJeUn+^fH%TFUP zPdfnv-CI73z_}9GTTTadohN~RC_kUT`4ZSyUQ3`t`xrd?%kLmiDRnzgehC$=)?P$8 z&k6n4&}xd8a^~r|gKUmp!Hi{vf)kQwKg_6-!gCFpL#4Ak8$e$usF3dYHl8Y7DCTA5 zJ_PVwT`n7nj?hOT_d(#!I}?>H3Tl*lzFyq%01RbAZnhmGoZzRXqY~rKhgBcBp#XQOJxJ=$cXxv9vLrPUr~Y416ReU(@~$cEx--(lV) z=O2OMU!HuB&7wMq^t`O>qcCRe29#O+u@uDZNgneQU2TY2g-&uVW|n-I1uX+2pR~1` z;ey4h9i-xpM)I0UzJS&&UMsV>%TZaBQYUIBq447CWgfRaWAc8+3j9Xu#Ql&`XTdLt z{Xk-CkJ2dDNDq306c12q`coc37-AW@n*?h(_e zYA>gDahcD}W14n(QdI3Ai#i~QxV21aXy*S6lR$Aq=5x^W(dGaBB(`?`Y)TsV$QthFC|C~h9(Pd%Oi%WF02`O=V!F_C6!j_jJkzC~2%aUkGF|4` zh3-*u8`Cp9--gXgZfDx<8HGJc?&Nefhnf93+VNg;^FSb-yEcf7;s<4sdzdeqR;Hxg z%=Tq7)*gjzik*^_rwOT&MC}ul@&oOsK=V&!9YYFZde(0-F4ySPp!R#DdkHHhECcXo zr_0L9f&AKoq?oCZnx_*seWkeCD$Fy*uWPg*|56gvC^t{fz69o~%|Y44Z)luVc&w35 zR{st9(DSS!k2`Fo5G88wXDR)17~(mI?98I}A)3-Bu{;)0LTMUh>RPTWi(94cJTDn1 zHH$;UB{H7}DdX~cDSxfZ=Lw6-m)%Th^&;h8E_*1CUS#V4fj`JA zev?nC$kQ36Fa?T&FVbr!X^fc7Q=3$MM8j#o75|1$=JGJd&b)z&lxmEa%|jj=bAe9T zOEpH!<}x|OZQAM?*tz&+Eg!2J{;7QBF@;&9@R-_3C(C^Rg63)Z$LNxn`afah$abRh&6$r1WM9DJq^#_Q-@{U3q0W<&g*wlf=4p;+ zrRx%?F*A6mlKVcGyGj@EaKm#oGD{b-+Xzn(4P3g2Y29-%XiB|I7kbt~bmz zBBd*tc6)dnRqA89+~X&23)5Ae7395`=?2e!^or6?G41udO`2AweV)fCa}@{PHqR4G zuV(rZ&q>m>G2QO@SJb?;o#_q_f2~~F$#kcOThY=>nO^I8lx1yX`ce<~tEE>k{b|pi zD96wAI?s!g6JUD1$3ZzkrZ;$gO*wr`U*>t3a>7hs?sTsP^SL{MNZwpF0Qx1VpDID$yI2NX>Jna^VFh7r`UY< z@*17nHT@N6cUm10`ZIt}dvYVz#Wi{W&-`pW>MunRr~MNpaA&G!X>MFaeJNRgJ{dXO ztg0ODY(@Pv<{V|3`&XrW{W=QzN3wF~qmcRB<>XV-++8q%uWW%IFGW0yP=T^~CWXg^ zfvK#4Y29-Mnzn2a(}f-`G0PS+UFMkrw7t zemxL6>rl3WWV!W7wv}Dhfvte&2C8v6ix!>_VgIs?OlK{|X1nYPQs|3$*idFLUAUNE zT9kD$UFPAdr!s#%B)UDHMO&5yuK>Q>GmH3MimCE^k@!BQ>pbVP2K`Joc)mhyLQF6A zte}OiWZLT)B>g6)mwWu^&}9Qm`%twnpb{4qLfaaBJ=J0*$_Bpz?2=cIblsEtJIZlA zz#W^X5rnQiOrpgg)AeQU-E_|{VNustDYFoQHUn3qa~CAH72Jc#Z3VFr022FC3tNJN z#)A2fn9J3cTbnWyFZ~uLq9LIba^e@BU!o6aMNI3S9q3M4G1G;fk5Ln?gy}M|^v_UJ zlP7N0>k$6Fg+Y7Zr;zBK3{TRgGwHnJ@HO5I=!@D61s=J^`yl!4~1;JFHMrS=%ETjs?5LBQV6{TJ&=hdXN{YhztlIHU|Y2YrB zJMQT6P9hXwBRlTs^gc`b^(bhaHwNd_f(p7^)wWmh_2aV@^e%0xDsM@$yyGnI70Q&3 z>9}K{`2-u+g!+ZA6-8MuqA>u(_i2=_a(>$s1aKi)0*slp@0oZGQyVi=GQn3^%~RwYjd6 ze5Y%=t4J%(EkqA=EYzI(qWlZ>4!9*Fb*?KaWBa_+0=9XwqSAM?5 zs!uanTaY)YLR)&ek`#6=KAocTvITSU&ymq&Ng&G&yIM*VNkNh;JB4&r2#6x3iNxVY zIvx6HmQ<#t#8RiI9O}$KJ&I)l)-90j z&a8w^G@@H2W}(>Gb&5Nm7E_v@1(a;W6zXgXMN?x2Lz_zq)?lt#RKCT3PO4!sE~auD zplo?cFM{*ti2VE|@FyG~O+gZS#8izjBbI2&LBcMUH2*XcBv6qOj1fuGTBJFvX2YD7 zkW+0+hM(6^GOJyiGO^_{br^KS0_h^G5bVtQ)h7wTryBSIR7y{IYeR}6a zmAIG)dPAM`{7>OqL8)9T6JZy;SgbOW=uWH6Bn+~~Ou|>&%p^uk!NrC{RB~$2{^Tma zQ^SNKIO$X-V$sS_I53dt30C6U)XD{73<{s>8})VOcl&+egrceJ#wVv^2_WN{)Ci3bKEiJpo8UKb(Y!&&u-E@~dw z!mnp(185$IgnL7M75%W1kX1kuHnV+S3j{`aNDKJ!Su(h+4|mOsEdl=Q+05wO(!a#xwtzK z8i>yih2{K;42TC2npjpw(Z@rBL6uU+JY zU>nvxP_T<}o3I3b5UcX6yMBjn`ZqhHpe@l_t@N417(q8AKa*aF@5jRle8ar8rY;k4OQ?B)VGR1WHjAkFX}r<0#)$bh2c>c{ z4{i|)#D>B`xe>Yuz8F^;^$x~+2mF08r4cx{L__hQ{EposVOPT&Sr#G;NZ2Hxpn=z? zQ6si(usbp!#q(q84x>8~8SoDb_2UC-0RA3yUVPQR#^49+N*_x(ekm^oyQA^QmH-88 z?Trpf!M#y`z~~9}aaf`dyt$?NkpX=DjzSHj5`$qe_eL?ipsBG+QBK&EZBnoXNDxtbM9%0KF zZ2RVReCp0y4)6C*sWhe^Ky|6C)YK`ev($?_dO^_tNW~X9dBM>t%fCVsw#RTn* z;VB#wp`pMER6l}`;)CJMLlal8W+2W=b=2U-2Dq@iVF9fY+ZKj6V@oLBkB{UrstMy# z|3D%rl4djH2l(hAkzP6h>b0%MkG4YluV`s)7GrJ-Sjqt zbTz!8v-P5d;5YKgv0uW{U!tMD{6H&j=pT&N9~H^ikg zwN=;13m~j}CQh{*#**ETK8xN>pB)?$;Yge&Q1?)Ds3{9sL*3C$0)ul0dR9W}Ew4uC zF!*bTPz={*#4u`D!v%$fDUH@+4}=9&%d(bmvKU5_3GSe%Yu+sD&Q2hLgG2Fc%M!i4 zZBg8RfN=pzcFW$UngTa=@E(l6+7woA9*V=q;OcPZJ(>r8DdV6ER zxBy*GsJ9m?pQI(hwJ8aNv;sg{q5iu+JY4VZ5U;IAriAI5f}D z7{^Bjhv4LB#t~R`l^E?Ck0dz4fC!^-6xVg2XAHtaf^^+Mx-MH3eZ^>kOLdCPF{=mC zyI9d!Ft`csFM79xdL&m2KNA`Z!ahB!0l_?!fZNg~6&`)Z^iDP|S|2}rnQ)Y;V>h+N zF|0%6jM5w03MVlgAvk1oZ!=;;{s6C9!Qc?VsI^VRhH&qQdRjd))*sm-M_*Z4+?~Sl zzXnX4Y}BeRIb#K1T*SU0H9hC?N#O7Yh)EI(rw@L_isbI>L7Gq`T1hR|6z-+8Y zIJsPmMk4SX^sV#}9>V!6E;)LxFy}z!2IeIz=~uGU(dx~dN7``_itLGMs^l++PSvy3 zC}Dbbq?=V#6+k0OU{h#lOHA}7I}Zr_Jy#}TaWz++YB__=4Td>~HjCbYh#y7>@$Mb= zaP}X#I|qDT8pDByR^xCW@1#jmoyt%EVadh9K(P1JJNbYdFlh?a>hkIvHQ)<0C|cRp zquFt-!B8$E=zmzxOzcY4HV?$)6_S%zWB^NdH6o#V_1(>Nv`_@*HaVMvL06^VZ6hbFc`qPF5Ktti6qoLOBt4xk_e85 z>9hmd!YNFr>M;0IM7fIU7MQ#ISW{VR6LuigYw^S|iz|z)9ta4-KSqA^Bvc>~kZ{$+ z>Rw=urtCpzk3prfR4F-EvlHO0-+APoZ@v4|b)#?org z*do_Ba2ps&deB5m#+u+&)|!g_a4n}yXlt%{Wu4`W5y!egLYwFrTentM%U+zeRyEXm zibHlcE+&=_QJ8(Uo~;*VQxrTFg{W_j1=q*D4kO`gsPTE>o6>Ri$AtPE`ge` zzefMCt+1I+P7^emJf(o;`vzgIUcqfiFdV>4sJ14u?rwV4gkwd$@)>$173<}WTNs<; zys^w0F1X0)i$)SdA+_g25o$_F4wM;Wn?1BWz+C|cTX_!`iV0vmuCB%s47Z4JXQfti zaPZ`64i&l@H>U}9KddR_)V4IWFZS5vL;LFK9Kx$bnuIHs_ShlgRKnFPl;ifKb z4a|jSW|hW`5=+?CwqX+`l(u6>kO(iE>y+~eWa7An3kbC|p&zPQo2yqjB6OImwoSp{ zP*Wrv#-(ZeUq*IX+R7 zU0`k=IET?-u|NnP<%fDh^i?b(p%XWqI5~22gM_QhV(8EQzOfMfnu}YpB`W*$Ej&I$ z;1A^)9y8+)%vfRnH%}){$Qm5paV)>aC!VQ^Y64XC=S;vkP7dVza zS4{LhofAi9)^~Vg=_d*6d%m&wJh3m&Ye&hnQ;ff7kr_^Y9a-R&H1>y66o~DviSVxE zeY<1n$KTh;d?#Mk9y4FdjioP2-WNL-Uo6T_^V(4|?Gz<~*9fEsrzlO{k896!;wwt) zd(E-e%x#14D$0JP{U28`_lZG_pVN4Pl%aN&pA@D@%`umDQCQYu9Ebn zn8lbU(iu^b_49i%J21hOpkF<0XI$yvL*%?ZsQu z81ODYhA%-r@z%ZG=bHGvlHLSt(f5IO+h8mCQU?4nDaSSL=Lz>o{P=N+Qa! ze-0GJPmIQe^MI!v+-G&kyh89ZEXzQDX$E{E1OE05_G$Iv2Hq_-82flHgPdyE zzsNRjyg3<{AaI};~MuPlov9{|1t1I4*bGncGs9v zevyIxJ<_9Hyk{$Vt6lgJ0_E`9Bzxeef%HRO=f@C~Pt-}`O~4kd&wwAyfIk2{?@>H5qAo_?NwkMhMP-ev-s+?fHt zCj)+82K-aNQ%~!sHkO`;B)u#7NxJnLtTUt?CRpbLqVZT9%hn2>Az$3oZnU=GMkxdD zTCIzl4J^*_b~VfkosFJ|(Kit3#;cGXyg7>*{=`;!usRTo2YV_mSkQp8mWhbujm|h( ziTbx;hZDz%1l|h`292J?;2_`l*dTc#F@`j4ciIte#c`PR@?t|Bc3!7=mJ!0bJJY@& z`|kF}Rn128>gBx7TH3-&<87nS>@x{`%iEJu)~s03(cEctHZE&zmTy$BD@v-4eX_kS z&@qaQ+Vb_Q8&|b7B{z^>ue^fTyjIw}z&H>~n0H{0z5Y3!_^)5Vop}pqJF=c=$B%2M z(@L|BjmM(Z16H?vDgxa4W68Hv-sDq9ml}}w$*7hrJ`0BOS@Q|`$@Vq-Q^VDYsr^fa!+m;kY;+Z z#ICgNPEVc>r`5=QEMW6Lxj9Dt{`&3a>MUZcRMZ)-=+f%UUGe|zmE~iL8FQ~UZDzYR zJXLsI>fU(Ui@@}TlXtvZV@>Ly)Ve@?{N3+fukCX1Q?itG4}4lB#$1GsJo9dHb;WtA z8r5b!lK13WuVCc6VNroIGMscFjz?A8Z>4bN5sVIr3Ykv75Z)41@W(4X z^FuwNf>6Id)-Ni0wuK>2#W-A%IXESc@ifH_;JW^bXmG$!1~WB;`z$J?`&1xV(T8_7 z6})s%RN$pc2t*NiVp0+8H^=?{9tg1@NDl;z;8yu>0mzd(B}|R0N`{rbG5|&t?8nb$ zz!!jzL98VU(=g09Z@Cpotdm~ob-`yPzZnhx&b0|S84J%qn zlRbS}|6jx0?_mj&T-RIYEe%+AGNkW(Nox;h1K{t+O!DNpOs9!(+li6J^gkw41G4j5 z=QnYaf6f@{@%+n?k82tuR{8fjyprQy6VWOm{65xrO+R5U_Pw-^86i<>^_^tD*HvDLxp-Vo;+s~^1O~@zz zGLz0a*W&lZ4A%Wuv_H=rtnw}X+km4@Omijg|2o2h3k0lm#{`yT55oZL{K<1N`~Z?+ zdz!)VOKTad_zQsS{MLEeb{v5)So$hxJiG@Pc7AI=yxZhoM(4H#t6U59cSzXzt^3Y? zV*bwEY(|TGT>tro$#1ovb&hw;Y1Jk^c(E9hHIu%>;nQs55kwg8h z@~v~hGW>3q;Q?maLVEcxBG1lmogY4KI!KL;m&r77;%C6o)K)jM&PS|&e=6PH>E-_? zc=40}B)@eYdBi;0OQ%nVKL9UvvdXv4Esvcd{|WF~eG|##`KI;ngIWI$nAJb5@~wK^ z3m$v<);Z`2^Qh6Hr)&lbwqpLu*Uq0jFLg_Daacvkr^RQ*>YOZ9f9t&Iu*qMQ1H&s4|MYT%$zPYGR0)vFV8ydceiNOH>P-H0xfY*A zI6nh_kIDZFPO!F+&c84N|FVk|)8@1em(IU31ONU;#XmpIe(C%jCVzT8f4yAsPc5=3 zkEF$K#XOg^(ss&^*D5GoZaOW+r>Q6zoxO^GAdMjnlx16EkK$0zDo)G@x;YQcMS3A& ZA`z_lhvVx+ +#include +#include +#include +#include +#include +#include + +using namespace std; + +const char * query_str="QUERY_STRING"; +const char * uri_str="REQUEST_URI"; +const char * method_str="REQUEST_METHOD"; +const char * iotcloudroot_str="IOTCLOUD_ROOT"; +const char * length_str="CONTENT_LENGTH"; + +IoTQuery::IoTQuery(FCGX_Request *request) : + request(request), + data(NULL), + directory(NULL), + uri(NULL), + query(NULL), + method(NULL), + iotcloudroot(NULL), + dir(NULL), + length(0), + fd(-1) +{ +} + + +IoTQuery::~IoTQuery() { + if (fd >= 0) { + close(fd); + } + if (directory) + delete directory; + if (data) + delete data; + if (dir != NULL) + closedir(dir); +} + +void IoTQuery::processQuery() { + parseQuery(); + getDirectory(); + readData(); + + if (strncmp(method, "POST", 4) != 0) + return; + + if (directory == NULL || + (dir = opendir(directory)) == NULL) + return; + + if (openMaxFile() < 0) + return; + + flock(fd, LOCK_EX); + + cout << "Content-type: text/html\r\n" + << "\r\n" + << "\n" + << " \n" + << " Hello, World!\n" + << " \n" + << " \n" + << "

Hello, World!

\n" + << " \n"; + + cout << uri_str << " " << uri << "\n"; + cout << query_str << " " << query << "\n"; + cout << method_str << " " << method << "\n"; + cout << iotcloudroot_str << " " << iotcloudroot << "\n"; + if (data) + cout << "[" << data << "]"; + + + + cout << "\n"; +} + + +void IoTQuery::readData() { + if (length) { + data = new char[length+1]; + memset(data, 0, length+1); + cin.read(data, length); + } + do { + char dummy; + cin >> dummy; + } while (!cin.eof()); +} + + +void IoTQuery::parseQuery() { + uri = FCGX_GetParam(uri_str, request->envp); + query = FCGX_GetParam(query_str, request->envp); + method = FCGX_GetParam(method_str, request->envp); + iotcloudroot = FCGX_GetParam(iotcloudroot_str, request->envp); + + char * reqlength = FCGX_GetParam(length_str, request->envp); + if (length) { + length=strtol(reqlength, NULL, 10); + } else { + length=0; + } +} + +void IoTQuery::getDirectory() { + char * split = strchr((char *)uri, '?'); + if (split == NULL) + return; + int split_len = (int) (split-uri); + int rootdir_len = strlen(iotcloudroot); + int directory_len = split_len + rootdir_len + 1; + directory = new char[directory_len]; + memcpy(directory, iotcloudroot, rootdir_len); + memcpy(directory + rootdir_len, uri, split_len); + directory[directory_len]=0; +} + +int IoTQuery::openMaxFile() { + char maxfile[]="queuesize"; + int len=strlen(directory); + + char * filename=new char[len+sizeof(maxfile)+2]; + memcpy(filename, directory, len); + filename[len]='/'; + memcpy(filename+len+1, maxfile, sizeof(maxfile)); + filename[len+sizeof(maxfile)+1]=0; + fd=open(filename, O_CREAT| O_RDWR, S_IRUSR| S_IWUSR); + delete filename; + return fd; +} diff --git a/src/server/iotquery.h b/src/server/iotquery.h new file mode 100644 index 0000000..ccadd39 --- /dev/null +++ b/src/server/iotquery.h @@ -0,0 +1,32 @@ +#ifndef IOTQUERY_H +#define IOTQUERY_H +#include +#include "fcgio.h" +#include "fcgi_stdio.h" +#include + +class IoTQuery { + public: + IoTQuery(FCGX_Request * request); + ~IoTQuery(); + void processQuery(); + + private: + void parseQuery(); + void getDirectory(); + void readData(); + int checkDirectory(); + int openMaxFile(); + + FCGX_Request * request; + char *data; + char *directory; + const char * uri; + const char * query; + const char * method; + const char * iotcloudroot; + DIR *dir; + long length; + int fd; +}; +#endif -- 2.34.1