gwenhywfar 5.10.1
httpsession.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Fri Feb 15 2008
3 copyright : (C) 2019 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10
11#ifdef HAVE_CONFIG_H
12# include <config.h>
13#endif
14
15#define DISABLE_DEBUGLOG
16
17
18#include "httpsession_p.h"
19#include "i18n_l.h"
20
21#include <gwenhywfar/syncio.h>
22#include <gwenhywfar/syncio_socket.h>
23#include <gwenhywfar/syncio_tls.h>
24#include <gwenhywfar/syncio_http.h>
25#include <gwenhywfar/syncio_file.h>
26
27#include <gwenhywfar/misc.h>
28#include <gwenhywfar/debug.h>
29#include <gwenhywfar/gui.h>
30#include <gwenhywfar/text.h>
31
32#include <assert.h>
33#include <unistd.h>
34
35
37
38
39
40static void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader);
41
42
43
44
45GWEN_HTTP_SESSION *GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
46{
48
50 assert(sess);
51 sess->usage=1;
53 if (url)
54 sess->url=strdup(url);
55 if (defaultProto)
56 sess->defaultProtocol=strdup(defaultProto);
57 sess->defaultPort=defaultPort;
58
59 return sess;
60}
61
62
63
65{
67 GWEN_SYNCIO *baseSio;
68 GWEN_SYNCIO *sio;
69
71 assert(sess);
72 sess->usage=1;
74
76 if (baseSio==NULL) {
77 DBG_ERROR(GWEN_LOGDOMAIN, "Error on GWEN_SyncIo_Socket_TakeOver()");
79 return NULL;
80 }
81
82 /* extend syncio to support the given protocol */
83 sio=GWEN_Gui_ExtendSyncIo(NULL, proto, port, baseSio);
84 if (sio==NULL) {
85 DBG_ERROR(GWEN_LOGDOMAIN, "Error on GWEN_Gui_ExtendSyncIo()");
87 return NULL;
88 }
89
90 sess->syncIo=sio;
92
93 /* add PASSIVE flag to every syncIO in the chain */
94 while (sio) {
96 sio=GWEN_SyncIo_GetBaseIo(sio);
97 }
98
99 return sess;
100}
101
102
103
105{
106 GWEN_HTTP_SESSION *sess;
107
109 assert(sess);
110 sess->usage=1;
112
113 sess->syncIo=sio;
115
116 /* add PASSIVE flag to every syncIO in the chain */
117 while (sio) {
119 sio=GWEN_SyncIo_GetBaseIo(sio);
120 }
121
122 return sess;
123}
124
125
126
128{
129 assert(sess);
130 assert(sess->usage);
131 sess->usage++;
132}
133
134
135
137{
138 if (sess) {
139 assert(sess->usage);
140 if (sess->usage==1) {
142 GWEN_SyncIo_free(sess->syncIo);
143 free(sess->url);
144 free(sess->defaultProtocol);
145 free(sess->httpUserAgent);
146 free(sess->httpContentType);
147 GWEN_FREE_OBJECT(sess);
148 }
149 else {
150 sess->usage--;
151 }
152 }
153}
154
155
156
159{
161
162 oldFn=sess->initSyncIoFn;
163 sess->initSyncIoFn=f;
164 return oldFn;
165}
166
167
168
170{
171 assert(sess);
172 assert(sess->usage);
173
174 return sess->flags;
175}
176
177
178
180{
181 assert(sess);
182 assert(sess->usage);
183
184 sess->flags=fl;
185}
186
187
188
190{
191 assert(sess);
192 assert(sess->usage);
193
194 sess->flags|=fl;
195}
196
197
198
200{
201 assert(sess);
202 assert(sess->usage);
203
204 sess->flags&=~fl;
205}
206
207
208
210{
211 assert(sess);
212 assert(sess->usage);
213
214 return sess->httpUserAgent;
215}
216
217
218
220{
221 assert(sess);
222 assert(sess->usage);
223
224 free(sess->httpUserAgent);
225 if (s)
226 sess->httpUserAgent=strdup(s);
227 else
228 sess->httpUserAgent=NULL;
229}
230
231
232
234{
235 assert(sess);
236 assert(sess->usage);
237
238 return sess->httpContentType;
239}
240
241
242
244{
245 assert(sess);
246 assert(sess->usage);
247
248 free(sess->httpContentType);
249 if (s)
250 sess->httpContentType=strdup(s);
251 else
252 sess->httpContentType=NULL;
253}
254
255
256
258{
259 assert(sess);
260 assert(sess->usage);
261
262 return sess->httpVMajor;
263}
264
265
266
268{
269 assert(sess);
270 assert(sess->usage);
271
272 sess->httpVMajor=i;
273}
274
275
276
278{
279 assert(sess);
280 assert(sess->usage);
281
282 return sess->httpVMinor;
283}
284
285
286
288{
289 assert(sess);
290 assert(sess->usage);
291
292 sess->httpVMinor=i;
293}
294
295
296
297
298
299
301{
302 GWEN_SYNCIO *sioTls;
303 GWEN_DB_NODE *db;
304 int rv;
305
306 if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
307 GWEN_SYNCIO *sio;
308
309 rv=GWEN_Gui_GetSyncIo(sess->url,
310 (sess->defaultProtocol)?(sess->defaultProtocol):"http",
311 sess->defaultPort,
312 &sio);
313 if (rv<0) {
314 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
315 return rv;
316 }
317
318 if (strcasecmp(GWEN_SyncIo_GetTypeName(sio), GWEN_SYNCIO_HTTP_TYPE)!=0) {
319 DBG_ERROR(GWEN_LOGDOMAIN, "URL does not lead to a HTTP layer");
320 GWEN_SyncIo_free(sio);
321 return GWEN_ERROR_INVALID;
322 }
323
324 /* allow derived classes to modify the given GWEN_SIO */
325 rv=GWEN_HttpSession_InitSyncIo(sess, sio);
326 if (rv<0 && rv!=GWEN_ERROR_NOT_IMPLEMENTED) {
327 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
328 GWEN_SyncIo_free(sio);
329 return rv;
330 }
331 sess->syncIo=sio;
332 }
333
334 if (sess->syncIo==NULL) {
335 DBG_ERROR(GWEN_LOGDOMAIN, "No SYNCIO object, SNH!");
336 return GWEN_ERROR_INTERNAL;
337 }
338
339 /* prepare TLS layer */
341 if (sioTls) {
342 if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
346 }
347 else { /* server mode */
348 }
349
351 /* make TLS layer ignore problem of premature connection termination */
353 }
354 }
355
356
357 /* prepare HTTP out header */
358 db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
359 _setHostHeaderFromUrl(sess->url, db);
360
361 if (sess->flags & GWEN_HTTP_SESSION_FLAGS_NO_CACHE) {
363 "Pragma", "no-cache");
365 "Cache-control", "no cache");
366 }
367 if (sess->httpContentType)
369 "Content-type", sess->httpContentType);
370
371 if (sess->httpUserAgent)
373 "User-Agent", sess->httpUserAgent);
374 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Connection", "close");
375 GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", 0);
376
377 return 0;
378}
379
380
381
382void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader)
383{
384 if (sUrl && *sUrl) {
385 GWEN_URL *url;
386
387 url=GWEN_Url_fromString(sUrl);
388 if (url) {
389 const char *s;
390
391 s=GWEN_Url_GetServer(url);
392 if (s && *s)
394 GWEN_Url_free(url);
395 }
396 }
397}
398
399
400
402{
403 assert(sess);
404 assert(sess->usage);
405
406 if (sess->syncIo) {
407 GWEN_SyncIo_Disconnect(sess->syncIo);
408 GWEN_SyncIo_free(sess->syncIo);
409 sess->syncIo=NULL;
410 }
411
412 return 0;
413}
414
415
416
418 const char *httpCommand,
419 const uint8_t *buf, uint32_t blen)
420{
421 int rv;
422
423 assert(sess);
424 assert(sess->usage);
425
426 /* first connect to server */
429 I18N("Connecting to server..."));
430 rv=GWEN_SyncIo_Connect(sess->syncIo);
431 if (rv<0) {
432 if (rv==GWEN_ERROR_SSL) {
434 "SSL-Error connecting (%d)", rv);
435 }
436 DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
439 I18N("Could not connect to server"));
440 GWEN_SyncIo_Disconnect(sess->syncIo);
441 return rv;
442 }
443 else {
444 GWEN_DB_NODE *db;
445
448 I18N("Connected."));
449
450 /* set command */
451 db=GWEN_SyncIo_Http_GetDbCommandOut(sess->syncIo);
453 "command",
454 httpCommand);
455 if (sess->httpVMajor) {
456 char numbuf[32];
457
458 snprintf(numbuf, sizeof(numbuf)-1, "HTTP/%d.%d",
459 sess->httpVMajor, sess->httpVMinor);
460 numbuf[sizeof(numbuf)-1]=0;
462 "protocol",
463 numbuf);
464 }
465 else
467 "protocol",
468 "HTTP/1.0");
469
470 /* set content length */
471 db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
473 "Content-length", blen);
474
477 I18N("Sending message..."));
478
479 /* send request */
480 rv=GWEN_SyncIo_WriteForced(sess->syncIo, buf, blen);
481 if (rv<0) {
482 DBG_INFO(GWEN_LOGDOMAIN, "Could not send message (%d)", rv);
485 I18N("Could not send message (%d)"),
486 rv);
487 GWEN_SyncIo_Disconnect(sess->syncIo);
488 return rv;
489 }
490
491 DBG_INFO(GWEN_LOGDOMAIN, "Message sent.");
494 I18N("Message sent."));
495 return 0;
496 }
497}
498
499
500
502 int resultCode,
503 const char *resultText,
504 const uint8_t *buf, uint32_t blen)
505{
506 int rv;
507 GWEN_DB_NODE *db;
508
509 assert(sess);
510 assert(sess->usage);
511
512 if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
513 DBG_ERROR(GWEN_LOGDOMAIN, "In client mode, cannot send status");
514 return GWEN_ERROR_INVALID;
515 }
516
517 /* set result */
518 db=GWEN_SyncIo_Http_GetDbStatusOut(sess->syncIo);
519 GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "code", resultCode);
520 if (resultText && *resultText)
521 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "text", resultText);
522
523 /* set protocol */
524 if (sess->httpVMajor) {
525 char numbuf[32];
526
527 snprintf(numbuf, sizeof(numbuf)-1, "HTTP/%d.%d", sess->httpVMajor, sess->httpVMinor);
528 numbuf[sizeof(numbuf)-1]=0;
529 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protocol", numbuf);
530 }
531 else
532 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protocol", "HTTP/1.0");
533
534 /* set content length */
535 db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
536 GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", blen);
537
538 GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Sending response..."));
539
540 /* send request */
541 rv=GWEN_SyncIo_WriteForced(sess->syncIo, buf, blen);
542 if (rv<0) {
543 DBG_INFO(GWEN_LOGDOMAIN, "Could not send message (%d)", rv);
544 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Could not send message (%d)"), rv);
545 GWEN_SyncIo_Disconnect(sess->syncIo);
546 return rv;
547 }
548
549 DBG_INFO(GWEN_LOGDOMAIN, "Message sent.");
551
552 /* disconnect */
555 I18N("Disconnecting from server..."));
556 GWEN_SyncIo_Disconnect(sess->syncIo);
559 I18N("Disconnected."));
560
561 return 0;
562}
563
564
565
567{
568 int rv;
569
570 assert(sess);
571 assert(sess->usage);
572
573 rv=GWEN_SyncIo_Http_RecvBody(sess->syncIo, buf);
574 if (rv<0) {
575 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
576 return rv;
577 }
578 else if ((rv>0 && rv<200) || rv>299) {
579 /* response is only ok for continuation (100) code */
580 if (rv==100) {
581 DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
582 }
583 else {
584 GWEN_DB_NODE *dbHeaderIn;
585
586 dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
587
589 DBG_INFO(GWEN_LOGDOMAIN, "Detailed Error Log For Packet:");
590
591 if (dbHeaderIn) {
592 DBG_INFO(GWEN_LOGDOMAIN, "Received this HTTP header:");
593 GWEN_DB_Dump(dbHeaderIn, 2);
594 }
595 else {
596 DBG_INFO(GWEN_LOGDOMAIN, "-- No HTTP header received --");
597 }
598
599 if (GWEN_Buffer_GetUsedBytes(buf)) {
600 DBG_INFO(GWEN_LOGDOMAIN, "Received this body:");
603 }
604 else {
605 DBG_INFO(GWEN_LOGDOMAIN, "-- No body received --");
606 }
607
608 }
609
610 if (rv==301 || rv==303 || rv==305 || rv==307) {
611 /* moved */
612 if (dbHeaderIn) {
613 const char *s;
614
615 s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
616 if (s) {
617 switch (rv) {
618 case 301:
619 case 303:
620 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
621 break;
622 case 305:
623 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
624 break;
625 case 307:
626 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
627 break;
628 default:
629 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
630 } /* switch */
631 }
632 }
633 } /* if moved */
634 }
635 }
636
637 return rv;
638}
639
640
641
643{
644 int rv;
645 uint32_t pos;
646
647 /* read response */
648 pos=GWEN_Buffer_GetPos(buf);
649 for (;;) {
652 I18N("Receiving response..."));
653 rv=GWEN_HttpSession__RecvPacket(sess, buf);
654 if (rv<0 || rv<200 || rv>299) {
656 "Error receiving packet (%d)", rv);
657 GWEN_SyncIo_Disconnect(sess->syncIo);
658 return rv;
659 }
660 if (rv!=100)
661 break;
664 I18N("Received continuation response."));
665 GWEN_Buffer_Crop(buf, 0, pos);
666 }
667
670 I18N("Response received."));
671
672 /* disconnect */
675 I18N("Disconnecting from server..."));
676 GWEN_SyncIo_Disconnect(sess->syncIo);
679 I18N("Disconnected."));
680 return rv;
681}
682
683
684
686 GWEN_DB_NODE *dbCommandAndHeader,
687 GWEN_BUFFER *buf)
688{
689 int rv;
690 GWEN_DB_NODE *db;
691 uint32_t pos;
692
693 if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
694 DBG_ERROR(GWEN_LOGDOMAIN, "In client mode, cannot receive command.");
695 return GWEN_ERROR_INVALID;
696 }
697
698 /* read response */
699 pos=GWEN_Buffer_GetPos(buf);
700 for (;;) {
701 GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Receiving command..."));
702 rv=GWEN_HttpSession__RecvPacket(sess, buf);
703 if (rv<0 || (rv>0 && rv<200) || rv>299) {
704 DBG_INFO(GWEN_LOGDOMAIN, "Error receiving packet (%d)", rv);
705 GWEN_SyncIo_Disconnect(sess->syncIo);
706 return rv;
707 }
708 if (rv!=100)
709 break;
710 GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Received continuation response."));
711 GWEN_Buffer_Crop(buf, 0, pos);
712 }
713
714 GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Command received."));
715
716
717 /* copy command db */
718 db=GWEN_SyncIo_Http_GetDbCommandIn(sess->syncIo);
719 if (db) {
720 GWEN_DB_NODE *dbDest;
721
722 dbDest=GWEN_DB_GetGroup(dbCommandAndHeader, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "command");
723 assert(dbDest);
724 GWEN_DB_AddGroupChildren(dbDest, db);
725 }
726
727 /* copy header db */
728 db=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
729 if (db) {
730 GWEN_DB_NODE *dbDest;
731
732 dbDest=GWEN_DB_GetGroup(dbCommandAndHeader, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "header");
733 assert(dbDest);
734 GWEN_DB_AddGroupChildren(dbDest, db);
735 }
736
737 return rv;
738}
739
740
741
743{
744 int rv;
745
746 assert(sess);
747 assert(sess->usage);
748
749 rv=GWEN_SyncIo_Http_RecvBodyToSio(sess->syncIo, sio);
750 if (rv<0) {
751 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
752 return rv;
753 }
754 else if (rv<200 || rv>299) {
755 /* response is only ok for continuation (100) code */
756 if (rv==100) {
757 DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
758 }
759 else {
760 GWEN_DB_NODE *dbHeaderIn;
761
762 dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
763
764 if (rv==301 || rv==303 || rv==305 || rv==307) {
765 /* moved */
766 if (dbHeaderIn) {
767 const char *s;
768
769 s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
770 if (s) {
771 switch (rv) {
772 case 301:
773 case 303:
774 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
775 break;
776 case 305:
777 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
778 break;
779 case 307:
780 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
781 break;
782 default:
783 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
784 } /* switch */
785 }
786 }
787 } /* if moved */
788 }
789 }
790
791 return rv;
792}
793
794
795
797{
798 int rv;
799
800 /* read response */
801 for (;;) {
802 GWEN_SYNCIO *sio;
803
812 rv=GWEN_SyncIo_Connect(sio);
813 if (rv<0) {
814 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
815 GWEN_SyncIo_free(sio);
816 return rv;
817 }
818
821 I18N("Receiving response..."));
823 if (rv<0 || rv<200 || rv>299) {
825 "Error receiving packet (%d)", rv);
827 GWEN_SyncIo_free(sio);
828 unlink(fname);
829 GWEN_SyncIo_Disconnect(sess->syncIo);
830 return rv;
831 }
832 if (rv!=100) {
833 int rv2;
834
835 /* flush file and close it */
836 rv2=GWEN_SyncIo_Flush(sio);
837 if (rv2<0) {
838 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
839 GWEN_SyncIo_free(sio);
840 return rv2;
841 }
842 rv2=GWEN_SyncIo_Disconnect(sio);
843 if (rv2<0) {
844 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
845 GWEN_SyncIo_free(sio);
846 return rv2;
847 }
848 GWEN_SyncIo_free(sio);
849 break;
850 }
853 I18N("Received continuation response."));
855 GWEN_SyncIo_free(sio);
856 unlink(fname);
857 }
858
861 I18N("Response received."));
862
863 /* disconnect */
866 I18N("Disconnecting from server..."));
867 GWEN_SyncIo_Disconnect(sess->syncIo);
870 I18N("Disconnected."));
871 return rv;
872}
873
874
875
877{
878 int rv;
879
880 assert(sess);
881 assert(sess->usage);
882
883 /* connect to server */
886 I18N("Connecting to server..."));
887 rv=GWEN_SyncIo_Connect(sess->syncIo);
888 if (rv<0) {
889 if (rv==GWEN_ERROR_SSL) {
890 DBG_NOTICE(GWEN_LOGDOMAIN, "SSL-Error connecting (%d)", rv);
891 }
892 DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
895 I18N("Could not connect to server"));
896 GWEN_SyncIo_Disconnect(sess->syncIo);
897 return rv;
898 }
899 else {
902 I18N("Connected."));
903
904 GWEN_SyncIo_Disconnect(sess->syncIo);
907 I18N("Disconnected."));
908 return 0;
909 }
910}
911
912
913
915{
916 if (sess->initSyncIoFn)
917 return sess->initSyncIoFn(sess, sio);
918 DBG_INFO(GWEN_LOGDOMAIN, "initSyncIoFn not set");
920}
921
922
923
924
925
926
927
#define NULL
Definition: binreloc.c:300
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
Definition: buffer.c:253
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
Definition: buffer.c:947
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:971
int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
Definition: db.c:1524
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1202
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
Definition: db.c:1381
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
Definition: db.c:1420
#define GWEN_DB_FLAGS_OVERWRITE_GROUPS
Definition: db.h:123
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:152
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
#define I18N(m)
Definition: error.c:42
#define GWEN_ERROR_SSL
Definition: error.h:105
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108
#define GWEN_ERROR_INTERNAL
Definition: error.h:125
#define GWEN_ERROR_INVALID
Definition: error.h:67
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWENHYWFAR_API int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
Definition: gui_virtual.c:444
GWEN_SYNCIO * GWEN_Gui_ExtendSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO *baseSio)
Definition: gui_syncio.c:29
GWENHYWFAR_API int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text,...)
Definition: gui_virtual.c:458
GWENHYWFAR_API int GWEN_Gui_GetSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui_virtual.c:652
int GWEN_HttpSession_SendStatus(GWEN_HTTP_SESSION *sess, int resultCode, const char *resultText, const uint8_t *buf, uint32_t blen)
Definition: httpsession.c:501
static void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader)
Definition: httpsession.c:382
int GWEN_HttpSession_RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
Definition: httpsession.c:642
int GWEN_HttpSession_InitSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.c:914
int GWEN_HttpSession_GetHttpVMajor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:257
int GWEN_HttpSession_ConnectionTest(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:876
GWEN_HTTP_SESSION * GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
Definition: httpsession.c:45
const char * GWEN_HttpSession_GetHttpContentType(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:233
int GWEN_HttpSession_SendPacket(GWEN_HTTP_SESSION *sess, const char *httpCommand, const uint8_t *buf, uint32_t blen)
Definition: httpsession.c:417
int GWEN_HttpSession_GetHttpVMinor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:277
GWEN_HTTPSESSION_INITSYNCIO_FN GWEN_HttpSession_SetInitSyncIoFn(GWEN_HTTP_SESSION *sess, GWEN_HTTPSESSION_INITSYNCIO_FN f)
Definition: httpsession.c:157
void GWEN_HttpSession_free(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:136
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSyncIoPassive(GWEN_SYNCIO *sio)
Definition: httpsession.c:104
int GWEN_HttpSession_Fini(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:401
int GWEN_HttpSession_RecvCommand(GWEN_HTTP_SESSION *sess, GWEN_DB_NODE *dbCommandAndHeader, GWEN_BUFFER *buf)
Definition: httpsession.c:685
const char * GWEN_HttpSession_GetHttpUserAgent(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:209
void GWEN_HttpSession_Attach(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:127
void GWEN_HttpSession_SetHttpVMajor(GWEN_HTTP_SESSION *sess, int i)
Definition: httpsession.c:267
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSocketPassive(GWEN_SOCKET *sk, const char *proto, int port)
Definition: httpsession.c:64
void GWEN_HttpSession_SetHttpVMinor(GWEN_HTTP_SESSION *sess, int i)
Definition: httpsession.c:287
int GWEN_HttpSession__RecvPacketToSio(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.c:742
void GWEN_HttpSession_SetHttpContentType(GWEN_HTTP_SESSION *sess, const char *s)
Definition: httpsession.c:243
void GWEN_HttpSession_SetHttpUserAgent(GWEN_HTTP_SESSION *sess, const char *s)
Definition: httpsession.c:219
void GWEN_HttpSession_AddFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:189
int GWEN_HttpSession_Init(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:300
int GWEN_HttpSession__RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
Definition: httpsession.c:566
int GWEN_HttpSession_RecvPacketToFile(GWEN_HTTP_SESSION *sess, const char *fname)
Definition: httpsession.c:796
uint32_t GWEN_HttpSession_GetFlags(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:169
void GWEN_HttpSession_SubFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:199
void GWEN_HttpSession_SetFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:179
struct GWEN_HTTP_SESSION GWEN_HTTP_SESSION
Definition: httpsession.h:21
#define GWEN_HTTP_SESSION_FLAGS_PASSIVE
Definition: httpsession.h:49
#define GWEN_HTTP_SESSION_FLAGS_TLS_IGN_PREMATURE_CLOSE
Definition: httpsession.h:47
#define GWEN_HTTP_SESSION_FLAGS_NO_CACHE
Definition: httpsession.h:41
int GWENHYWFAR_CB(* GWEN_HTTPSESSION_INITSYNCIO_FN)(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.h:270
struct GWEN_SOCKET GWEN_SOCKET
Definition: inetsocket.h:40
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
int GWEN_Logger_GetLevel(const char *logDomain)
Definition: logger.c:638
#define GWEN_LOGDOMAIN
Definition: logger.h:35
@ GWEN_LoggerLevel_Warning
Definition: logger.h:69
@ GWEN_LoggerLevel_Notice
Definition: logger.h:70
@ GWEN_LoggerLevel_Debug
Definition: logger.h:72
@ GWEN_LoggerLevel_Info
Definition: logger.h:71
@ GWEN_LoggerLevel_Error
Definition: logger.h:68
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:97
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:179
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIo(const GWEN_SYNCIO *sio)
Definition: syncio.c:224
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIoByTypeName(const GWEN_SYNCIO *sio, const char *typeName)
Definition: syncio.c:233
int GWEN_SyncIo_WriteForced(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
Definition: syncio.c:317
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:78
const char * GWEN_SyncIo_GetTypeName(const GWEN_SYNCIO *sio)
Definition: syncio.c:215
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:109
int GWEN_SyncIo_Flush(GWEN_SYNCIO *sio)
Definition: syncio.c:121
#define GWEN_SYNCIO_FLAGS_PASSIVE
Definition: syncio.h:57
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
@ GWEN_SyncIo_File_CreationMode_CreateAlways
Definition: syncio_file.h:40
#define GWEN_SYNCIO_FILE_FLAGS_GWRITE
Definition: syncio_file.h:63
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition: syncio_file.h:59
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition: syncio_file.h:58
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
Definition: syncio_file.h:62
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
Definition: syncio_file.h:54
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1298
int GWEN_SyncIo_Http_RecvBody(GWEN_SYNCIO *sio, GWEN_BUFFER *buf)
Definition: syncio_http.c:1338
int GWEN_SyncIo_Http_RecvBodyToSio(GWEN_SYNCIO *sio, GWEN_SYNCIO *sout)
Definition: syncio_http.c:1483
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbStatusOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1311
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderIn(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1285
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1324
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandIn(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1259
#define GWEN_SYNCIO_HTTP_TYPE
Definition: syncio_http.h:33
GWEN_SYNCIO * GWEN_SyncIo_Socket_TakeOver(GWEN_SOCKET *socket)
Definition: syncio_socket.c:76
#define GWEN_SYNCIO_TLS_TYPE
Definition: syncio_tls.h:33
#define GWEN_SYNCIO_TLS_FLAGS_ALLOW_V1_CA_CRT
Definition: syncio_tls.h:38
#define GWEN_SYNCIO_TLS_FLAGS_IGN_PREMATURE_CLOSE
Definition: syncio_tls.h:45
#define GWEN_SYNCIO_TLS_FLAGS_ADD_TRUSTED_CAS
Definition: syncio_tls.h:40
void GWEN_Text_LogString(const char *s, unsigned int l, const char *logDomain, GWEN_LOGGER_LEVEL lv)
Definition: text.c:1606
void GWEN_Url_free(GWEN_URL *st)
Definition: url.c:40
const char * GWEN_Url_GetServer(const GWEN_URL *st)
Definition: url.c:186
struct GWEN_URL GWEN_URL
Definition: url.h:77
GWEN_URL * GWEN_Url_fromString(const char *str)
Definition: urlfns.c:24