gwenhywfar 5.12.0
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);
41static int _initSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio);
42static int _recvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf);
43static int _recvPacketToSio(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio);
44
45
46
47
48GWEN_HTTP_SESSION *GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
49{
51
53 assert(sess);
54 sess->usage=1;
56 if (url)
57 sess->url=strdup(url);
58 if (defaultProto)
59 sess->defaultProtocol=strdup(defaultProto);
60 sess->defaultPort=defaultPort;
61
62 return sess;
63}
64
65
66
68{
70 GWEN_SYNCIO *baseSio;
71 GWEN_SYNCIO *sio;
72
74 assert(sess);
75 sess->usage=1;
77
79 if (baseSio==NULL) {
80 DBG_ERROR(GWEN_LOGDOMAIN, "Error on GWEN_SyncIo_Socket_TakeOver()");
82 return NULL;
83 }
84
85 /* extend syncio to support the given protocol */
86 sio=GWEN_Gui_ExtendSyncIo(NULL, proto, port, baseSio);
87 if (sio==NULL) {
88 DBG_ERROR(GWEN_LOGDOMAIN, "Error on GWEN_Gui_ExtendSyncIo()");
90 return NULL;
91 }
92
93 sess->syncIo=sio;
95
96 /* add PASSIVE flag to every syncIO in the chain */
97 while (sio) {
99 sio=GWEN_SyncIo_GetBaseIo(sio);
100 }
101
102 return sess;
103}
104
105
106
108{
109 GWEN_HTTP_SESSION *sess;
110
112 assert(sess);
113 sess->usage=1;
115
116 sess->syncIo=sio;
118
119 /* add PASSIVE flag to every syncIO in the chain */
120 while (sio) {
122 sio=GWEN_SyncIo_GetBaseIo(sio);
123 }
124
125 return sess;
126}
127
128
129
131{
132 assert(sess);
133 assert(sess->usage);
134 sess->usage++;
135}
136
137
138
140{
141 if (sess) {
142 assert(sess->usage);
143 if (sess->usage==1) {
145 GWEN_SyncIo_free(sess->syncIo);
146 free(sess->url);
147 free(sess->defaultProtocol);
148 free(sess->httpUserAgent);
149 free(sess->httpContentType);
150 GWEN_FREE_OBJECT(sess);
151 }
152 else {
153 sess->usage--;
154 }
155 }
156}
157
158
159
162{
164
165 oldFn=sess->initSyncIoFn;
166 sess->initSyncIoFn=f;
167 return oldFn;
168}
169
170
171
173{
174 assert(sess);
175 assert(sess->usage);
176
177 return sess->flags;
178}
179
180
181
183{
184 assert(sess);
185 assert(sess->usage);
186
187 sess->flags=fl;
188}
189
190
191
193{
194 assert(sess);
195 assert(sess->usage);
196
197 sess->flags|=fl;
198}
199
200
201
203{
204 assert(sess);
205 assert(sess->usage);
206
207 sess->flags&=~fl;
208}
209
210
211
213{
214 assert(sess);
215 assert(sess->usage);
216
217 return sess->httpUserAgent;
218}
219
220
221
223{
224 assert(sess);
225 assert(sess->usage);
226
227 free(sess->httpUserAgent);
228 if (s)
229 sess->httpUserAgent=strdup(s);
230 else
231 sess->httpUserAgent=NULL;
232}
233
234
235
237{
238 assert(sess);
239 assert(sess->usage);
240
241 return sess->httpContentType;
242}
243
244
245
247{
248 assert(sess);
249 assert(sess->usage);
250
251 free(sess->httpContentType);
252 if (s)
253 sess->httpContentType=strdup(s);
254 else
255 sess->httpContentType=NULL;
256}
257
258
259
261{
262 assert(sess);
263 assert(sess->usage);
264
265 return sess->httpVMajor;
266}
267
268
269
271{
272 assert(sess);
273 assert(sess->usage);
274
275 sess->httpVMajor=i;
276}
277
278
279
281{
282 assert(sess);
283 assert(sess->usage);
284
285 return sess->httpVMinor;
286}
287
288
289
291{
292 assert(sess);
293 assert(sess->usage);
294
295 sess->httpVMinor=i;
296}
297
298
299
300
301
302
304{
305 GWEN_SYNCIO *sioTls;
306 GWEN_DB_NODE *db;
307 int rv;
308
309 if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
310 GWEN_SYNCIO *sio;
311
312 rv=GWEN_Gui_GetSyncIo(sess->url,
313 (sess->defaultProtocol)?(sess->defaultProtocol):"http",
314 sess->defaultPort,
315 &sio);
316 if (rv<0) {
317 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
318 return rv;
319 }
320
321 if (strcasecmp(GWEN_SyncIo_GetTypeName(sio), GWEN_SYNCIO_HTTP_TYPE)!=0) {
322 DBG_ERROR(GWEN_LOGDOMAIN, "URL does not lead to a HTTP layer");
323 GWEN_SyncIo_free(sio);
324 return GWEN_ERROR_INVALID;
325 }
326
327 /* allow derived classes to modify the given GWEN_SIO */
328 rv=_initSyncIo(sess, sio);
329 if (rv<0 && rv!=GWEN_ERROR_NOT_IMPLEMENTED) {
330 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
331 GWEN_SyncIo_free(sio);
332 return rv;
333 }
334 sess->syncIo=sio;
335 }
336
337 if (sess->syncIo==NULL) {
338 DBG_ERROR(GWEN_LOGDOMAIN, "No SYNCIO object, SNH!");
339 return GWEN_ERROR_INTERNAL;
340 }
341
342 /* prepare TLS layer */
344 if (sioTls) {
345 if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
349 }
350 else { /* server mode */
351 }
352
354 /* make TLS layer ignore problem of premature connection termination */
356 }
357 }
358
359
360 /* prepare HTTP out header */
361 db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
362 _setHostHeaderFromUrl(sess->url, db);
363
364 if (sess->flags & GWEN_HTTP_SESSION_FLAGS_NO_CACHE) {
366 "Pragma", "no-cache");
368 "Cache-control", "no-cache");
369 }
370 if (sess->httpContentType)
372 "Content-type", sess->httpContentType);
373
374 if (sess->httpUserAgent)
376 "User-Agent", sess->httpUserAgent);
377 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Connection", "close");
378 GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", 0);
379
380 return 0;
381}
382
383
384
385void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader)
386{
387 if (sUrl && *sUrl) {
388 GWEN_URL *url;
389
390 url=GWEN_Url_fromString(sUrl);
391 if (url) {
392 const char *s;
393
394 s=GWEN_Url_GetServer(url);
395 if (s && *s)
397 GWEN_Url_free(url);
398 }
399 }
400}
401
402
403
405{
406 assert(sess);
407 assert(sess->usage);
408
409 if (sess->syncIo) {
410 GWEN_SyncIo_Disconnect(sess->syncIo);
411 GWEN_SyncIo_free(sess->syncIo);
412 sess->syncIo=NULL;
413 }
414
415 return 0;
416}
417
418
419
421 const char *httpCommand,
422 const uint8_t *buf, uint32_t blen)
423{
424 int rv;
425
426 assert(sess);
427 assert(sess->usage);
428
429 /* first connect to server */
432 I18N("Connecting to server..."));
433 rv=GWEN_SyncIo_Connect(sess->syncIo);
434 if (rv<0) {
435 if (rv==GWEN_ERROR_SSL) {
437 "SSL-Error connecting (%d)", rv);
438 }
439 DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
442 I18N("Could not connect to server"));
443 GWEN_SyncIo_Disconnect(sess->syncIo);
444 return rv;
445 }
446 else {
447 GWEN_DB_NODE *db;
448
451 I18N("Connected."));
452
453 /* set command */
454 db=GWEN_SyncIo_Http_GetDbCommandOut(sess->syncIo);
456 "command",
457 httpCommand);
458 if (sess->httpVMajor) {
459 char numbuf[32];
460
461 snprintf(numbuf, sizeof(numbuf)-1, "HTTP/%d.%d",
462 sess->httpVMajor, sess->httpVMinor);
463 numbuf[sizeof(numbuf)-1]=0;
465 "protocol",
466 numbuf);
467 }
468 else
470 "protocol",
471 "HTTP/1.0");
472
473 /* set content length */
474 db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
476 "Content-length", blen);
477
480 I18N("Sending message..."));
481
482 /* send request */
483 rv=GWEN_SyncIo_WriteForced(sess->syncIo, buf, blen);
484 if (rv<0) {
485 DBG_INFO(GWEN_LOGDOMAIN, "Could not send message (%d)", rv);
488 I18N("Could not send message (%d)"),
489 rv);
490 GWEN_SyncIo_Disconnect(sess->syncIo);
491 return rv;
492 }
493
494 DBG_INFO(GWEN_LOGDOMAIN, "Message sent.");
497 I18N("Message sent."));
498 return 0;
499 }
500}
501
502
503
505 int resultCode,
506 const char *resultText,
507 const uint8_t *buf, uint32_t blen)
508{
509 int rv;
510 GWEN_DB_NODE *db;
511
512 assert(sess);
513 assert(sess->usage);
514
515 if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
516 DBG_ERROR(GWEN_LOGDOMAIN, "In client mode, cannot send status");
517 return GWEN_ERROR_INVALID;
518 }
519
520 /* set result */
521 db=GWEN_SyncIo_Http_GetDbStatusOut(sess->syncIo);
522 GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "code", resultCode);
523 if (resultText && *resultText)
524 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "text", resultText);
525
526 /* set protocol */
527 if (sess->httpVMajor) {
528 char numbuf[32];
529
530 snprintf(numbuf, sizeof(numbuf)-1, "HTTP/%d.%d", sess->httpVMajor, sess->httpVMinor);
531 numbuf[sizeof(numbuf)-1]=0;
532 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protocol", numbuf);
533 }
534 else
535 GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protocol", "HTTP/1.0");
536
537 /* set content length */
538 db=GWEN_SyncIo_Http_GetDbHeaderOut(sess->syncIo);
539 GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Content-length", blen);
540
541 GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Sending response..."));
542
543 /* send request */
544 rv=GWEN_SyncIo_WriteForced(sess->syncIo, buf, blen);
545 if (rv<0) {
546 DBG_INFO(GWEN_LOGDOMAIN, "Could not send message (%d)", rv);
547 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Could not send message (%d)"), rv);
548 GWEN_SyncIo_Disconnect(sess->syncIo);
549 return rv;
550 }
551
552 DBG_INFO(GWEN_LOGDOMAIN, "Message sent.");
554
555 /* disconnect */
558 I18N("Disconnecting from server..."));
559 GWEN_SyncIo_Disconnect(sess->syncIo);
562 I18N("Disconnected."));
563
564 return 0;
565}
566
567
568
570{
571 int rv;
572
573 assert(sess);
574 assert(sess->usage);
575
576 rv=GWEN_SyncIo_Http_RecvBody(sess->syncIo, buf);
577 if (rv<0) {
578 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
579 return rv;
580 }
581 else if ((rv>0 && rv<200) || rv>299) {
582 /* response is only ok for continuation (100) code */
583 if (rv==100) {
584 DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
585 }
586 else {
587 GWEN_DB_NODE *dbHeaderIn;
588
589 dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
590 /* TODO: read set-cookie headers */
592 DBG_INFO(GWEN_LOGDOMAIN, "Detailed Error Log For Packet:");
593
594 if (dbHeaderIn) {
595 DBG_INFO(GWEN_LOGDOMAIN, "Received this HTTP header:");
596 GWEN_DB_Dump(dbHeaderIn, 2);
597 }
598 else {
599 DBG_INFO(GWEN_LOGDOMAIN, "-- No HTTP header received --");
600 }
601
602 if (GWEN_Buffer_GetUsedBytes(buf)) {
603 DBG_INFO(GWEN_LOGDOMAIN, "Received this body:");
606 }
607 else {
608 DBG_INFO(GWEN_LOGDOMAIN, "-- No body received --");
609 }
610
611 }
612
613 if (rv==301 || rv==303 || rv==305 || rv==307) {
614 /* moved */
615 if (dbHeaderIn) {
616 const char *s;
617
618 s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
619 if (s) {
620 switch (rv) {
621 case 301:
622 case 303:
623 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
624 break;
625 case 305:
626 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
627 break;
628 case 307:
629 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
630 break;
631 default:
632 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
633 } /* switch */
634 }
635 }
636 } /* if moved */
637 }
638 }
639
640 return rv;
641}
642
643
644
646{
647 int rv;
648 uint32_t pos;
649
650 /* read response */
651 pos=GWEN_Buffer_GetPos(buf);
652 for (;;) {
655 I18N("Receiving response..."));
656 rv=_recvPacket(sess, buf);
657 if (rv<0 || rv<200 || rv>299) {
659 "Error receiving packet (%d)", rv);
660 GWEN_SyncIo_Disconnect(sess->syncIo);
661 return rv;
662 }
663 if (rv!=100)
664 break;
667 I18N("Received continuation response."));
668 GWEN_Buffer_Crop(buf, 0, pos);
669 }
670
673 I18N("Response received."));
674
675 /* disconnect */
678 I18N("Disconnecting from server..."));
679 GWEN_SyncIo_Disconnect(sess->syncIo);
682 I18N("Disconnected."));
683 return rv;
684}
685
686
687
689 GWEN_DB_NODE *dbCommandAndHeader,
690 GWEN_BUFFER *buf)
691{
692 int rv;
693 GWEN_DB_NODE *db;
694 uint32_t pos;
695
696 if (!(sess->flags & GWEN_HTTP_SESSION_FLAGS_PASSIVE)) { /* client mode */
697 DBG_ERROR(GWEN_LOGDOMAIN, "In client mode, cannot receive command.");
698 return GWEN_ERROR_INVALID;
699 }
700
701 /* read response */
702 pos=GWEN_Buffer_GetPos(buf);
703 for (;;) {
704 GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Receiving command..."));
705 rv=_recvPacket(sess, buf);
706 if (rv<0 || (rv>0 && rv<200) || rv>299) {
707 DBG_INFO(GWEN_LOGDOMAIN, "Error receiving packet (%d)", rv);
708 GWEN_SyncIo_Disconnect(sess->syncIo);
709 return rv;
710 }
711 if (rv!=100)
712 break;
713 GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Received continuation response."));
714 GWEN_Buffer_Crop(buf, 0, pos);
715 }
716
717 GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Command received."));
718
719
720 /* copy command db */
721 db=GWEN_SyncIo_Http_GetDbCommandIn(sess->syncIo);
722 if (db) {
723 GWEN_DB_NODE *dbDest;
724
725 dbDest=GWEN_DB_GetGroup(dbCommandAndHeader, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "command");
726 assert(dbDest);
727 GWEN_DB_AddGroupChildren(dbDest, db);
728 }
729
730 /* copy header db */
731 db=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
732 if (db) {
733 GWEN_DB_NODE *dbDest;
734
735 dbDest=GWEN_DB_GetGroup(dbCommandAndHeader, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "header");
736 assert(dbDest);
737 GWEN_DB_AddGroupChildren(dbDest, db);
738 }
739
740 return rv;
741}
742
743
744
746{
747 int rv;
748
749 assert(sess);
750 assert(sess->usage);
751
752 rv=GWEN_SyncIo_Http_RecvBodyToSio(sess->syncIo, sio);
753 if (rv<0) {
754 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
755 return rv;
756 }
757 else if (rv<200 || rv>299) {
758 /* response is only ok for continuation (100) code */
759 if (rv==100) {
760 DBG_INFO(GWEN_LOGDOMAIN, "Continue...");
761 }
762 else {
763 GWEN_DB_NODE *dbHeaderIn;
764
765 dbHeaderIn=GWEN_SyncIo_Http_GetDbHeaderIn(sess->syncIo);
766
767 if (rv==301 || rv==303 || rv==305 || rv==307) {
768 /* moved */
769 if (dbHeaderIn) {
770 const char *s;
771
772 s=GWEN_DB_GetCharValue(dbHeaderIn, "Location", 0, 0);
773 if (s) {
774 switch (rv) {
775 case 301:
776 case 303:
777 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved permanently to %s"), s);
778 break;
779 case 305:
780 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Use proxy at %s"), s);
781 break;
782 case 307:
783 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved temporarily to %s"), s);
784 break;
785 default:
786 GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("HTTP: Moved to %s"), s);
787 } /* switch */
788 }
789 }
790 } /* if moved */
791 }
792 }
793
794 return rv;
795}
796
797
798
800{
801 int rv;
802
803 /* read response */
804 for (;;) {
805 GWEN_SYNCIO *sio;
806
815 rv=GWEN_SyncIo_Connect(sio);
816 if (rv<0) {
817 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
818 GWEN_SyncIo_free(sio);
819 return rv;
820 }
821
824 I18N("Receiving response..."));
825 rv=_recvPacketToSio(sess, sio);
826 if (rv<0 || rv<200 || rv>299) {
828 "Error receiving packet (%d)", rv);
830 GWEN_SyncIo_free(sio);
831 unlink(fname);
832 GWEN_SyncIo_Disconnect(sess->syncIo);
833 return rv;
834 }
835 if (rv!=100) {
836 int rv2;
837
838 /* flush file and close it */
839 rv2=GWEN_SyncIo_Flush(sio);
840 if (rv2<0) {
841 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
842 GWEN_SyncIo_free(sio);
843 return rv2;
844 }
845 rv2=GWEN_SyncIo_Disconnect(sio);
846 if (rv2<0) {
847 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv2);
848 GWEN_SyncIo_free(sio);
849 return rv2;
850 }
851 GWEN_SyncIo_free(sio);
852 break;
853 }
856 I18N("Received continuation response."));
858 GWEN_SyncIo_free(sio);
859 unlink(fname);
860 }
861
864 I18N("Response received."));
865
866 /* disconnect */
869 I18N("Disconnecting from server..."));
870 GWEN_SyncIo_Disconnect(sess->syncIo);
873 I18N("Disconnected."));
874 return rv;
875}
876
877
878
880{
881 int rv;
882
883 assert(sess);
884 assert(sess->usage);
885
886 /* connect to server */
889 I18N("Connecting to server..."));
890 rv=GWEN_SyncIo_Connect(sess->syncIo);
891 if (rv<0) {
892 if (rv==GWEN_ERROR_SSL) {
893 DBG_NOTICE(GWEN_LOGDOMAIN, "SSL-Error connecting (%d)", rv);
894 }
895 DBG_INFO(GWEN_LOGDOMAIN, "Could not connect to server (%d)", rv);
898 I18N("Could not connect to server"));
899 GWEN_SyncIo_Disconnect(sess->syncIo);
900 return rv;
901 }
902 else {
905 I18N("Connected."));
906
907 GWEN_SyncIo_Disconnect(sess->syncIo);
910 I18N("Disconnected."));
911 return 0;
912 }
913}
914
915
916
918{
919 if (sess->initSyncIoFn)
920 return sess->initSyncIoFn(sess, sio);
921 DBG_INFO(GWEN_LOGDOMAIN, "initSyncIoFn not set");
923}
924
925
926
927
928
929
930
#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:950
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_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_NOTICE(dbg_logger, format,...)
Definition debug.h:152
#define DBG_ERROR(dbg_logger, format,...)
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)
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,...)
GWENHYWFAR_API int GWEN_Gui_GetSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
int GWEN_HttpSession_SendStatus(GWEN_HTTP_SESSION *sess, int resultCode, const char *resultText, const uint8_t *buf, uint32_t blen)
static void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader)
int GWEN_HttpSession_RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
static int _recvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
int GWEN_HttpSession_GetHttpVMajor(const GWEN_HTTP_SESSION *sess)
int GWEN_HttpSession_ConnectionTest(GWEN_HTTP_SESSION *sess)
GWEN_HTTP_SESSION * GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
Definition httpsession.c:48
const char * GWEN_HttpSession_GetHttpContentType(const GWEN_HTTP_SESSION *sess)
int GWEN_HttpSession_SendPacket(GWEN_HTTP_SESSION *sess, const char *httpCommand, const uint8_t *buf, uint32_t blen)
int GWEN_HttpSession_GetHttpVMinor(const GWEN_HTTP_SESSION *sess)
GWEN_HTTPSESSION_INITSYNCIO_FN GWEN_HttpSession_SetInitSyncIoFn(GWEN_HTTP_SESSION *sess, GWEN_HTTPSESSION_INITSYNCIO_FN f)
void GWEN_HttpSession_free(GWEN_HTTP_SESSION *sess)
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSyncIoPassive(GWEN_SYNCIO *sio)
int GWEN_HttpSession_Fini(GWEN_HTTP_SESSION *sess)
int GWEN_HttpSession_RecvCommand(GWEN_HTTP_SESSION *sess, GWEN_DB_NODE *dbCommandAndHeader, GWEN_BUFFER *buf)
const char * GWEN_HttpSession_GetHttpUserAgent(const GWEN_HTTP_SESSION *sess)
void GWEN_HttpSession_Attach(GWEN_HTTP_SESSION *sess)
void GWEN_HttpSession_SetHttpVMajor(GWEN_HTTP_SESSION *sess, int i)
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSocketPassive(GWEN_SOCKET *sk, const char *proto, int port)
Definition httpsession.c:67
static int _recvPacketToSio(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
void GWEN_HttpSession_SetHttpVMinor(GWEN_HTTP_SESSION *sess, int i)
static int _initSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
void GWEN_HttpSession_SetHttpContentType(GWEN_HTTP_SESSION *sess, const char *s)
void GWEN_HttpSession_SetHttpUserAgent(GWEN_HTTP_SESSION *sess, const char *s)
void GWEN_HttpSession_AddFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
int GWEN_HttpSession_Init(GWEN_HTTP_SESSION *sess)
int GWEN_HttpSession_RecvPacketToFile(GWEN_HTTP_SESSION *sess, const char *fname)
uint32_t GWEN_HttpSession_GetFlags(const GWEN_HTTP_SESSION *sess)
void GWEN_HttpSession_SubFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
void GWEN_HttpSession_SetFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
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)
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)
int GWEN_SyncIo_Http_RecvBody(GWEN_SYNCIO *sio, GWEN_BUFFER *buf)
int GWEN_SyncIo_Http_RecvBodyToSio(GWEN_SYNCIO *sio, GWEN_SYNCIO *sout)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbStatusOut(const GWEN_SYNCIO *sio)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderIn(const GWEN_SYNCIO *sio)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderOut(const GWEN_SYNCIO *sio)
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandIn(const GWEN_SYNCIO *sio)
#define GWEN_SYNCIO_HTTP_TYPE
Definition syncio_http.h:33
GWEN_SYNCIO * GWEN_SyncIo_Socket_TakeOver(GWEN_SOCKET *socket)
#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