gwenhywfar  5.14.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 
40 static void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader);
41 static int _initSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio);
42 static int _recvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf);
43 static int _recvPacketToSio(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio);
44 
45 
46 
47 
48 GWEN_HTTP_SESSION *GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
49 {
50  GWEN_HTTP_SESSION *sess;
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 {
69  GWEN_HTTP_SESSION *sess;
70  GWEN_SYNCIO *baseSio;
71  GWEN_SYNCIO *sio;
72 
74  assert(sess);
75  sess->usage=1;
77 
78  baseSio=GWEN_SyncIo_Socket_TakeOver(sk);
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;
117  sess->flags|=GWEN_HTTP_SESSION_FLAGS_PASSIVE;
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 */
346  GWEN_SyncIo_AddFlags(sioTls,
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 
385 void _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.");
553  GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("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 
int GWEN_SyncIo_WriteForced(GWEN_SYNCIO *sio, const uint8_t *buffer, uint32_t size)
Definition: syncio.c:317
void GWEN_Url_free(GWEN_URL *st)
Definition: url.c:40
GWENHYWFAR_API int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
Definition: gui_virtual.c:444
#define DBG_ERROR(dbg_logger, format,...)
Definition: debug.h:97
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
#define I18N(m)
Definition: error.c:42
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:97
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
Definition: db.c:1420
#define GWEN_SYNCIO_TLS_FLAGS_ALLOW_V1_CA_CRT
Definition: syncio_tls.h:38
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
int GWEN_SyncIo_Http_RecvBodyToSio(GWEN_SYNCIO *sio, GWEN_SYNCIO *sout)
Definition: syncio_http.c:1483
#define GWEN_ERROR_INVALID
Definition: error.h:67
const char * GWEN_HttpSession_GetHttpContentType(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:236
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
Definition: syncio_file.h:54
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1324
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
#define DBG_NOTICE(dbg_logger, format,...)
Definition: debug.h:152
void GWEN_HttpSession_SetHttpContentType(GWEN_HTTP_SESSION *sess, const char *s)
Definition: httpsession.c:246
int GWEN_HttpSession_SendPacket(GWEN_HTTP_SESSION *sess, const char *httpCommand, const uint8_t *buf, uint32_t blen)
Definition: httpsession.c:420
int GWEN_SyncIo_Http_RecvBody(GWEN_SYNCIO *sio, GWEN_BUFFER *buf)
Definition: syncio_http.c:1338
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSocketPassive(GWEN_SOCKET *sk, const char *proto, int port)
Definition: httpsession.c:67
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
int GWEN_HttpSession_GetHttpVMajor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:260
void GWEN_HttpSession_SetHttpVMinor(GWEN_HTTP_SESSION *sess, int i)
Definition: httpsession.c:290
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition: syncio_file.h:58
#define GWEN_HTTP_SESSION_FLAGS_PASSIVE
Definition: httpsession.h:49
int GWEN_HttpSession_RecvCommand(GWEN_HTTP_SESSION *sess, GWEN_DB_NODE *dbCommandAndHeader, GWEN_BUFFER *buf)
Definition: httpsession.c:688
#define GWEN_LOGDOMAIN
Definition: logger.h:32
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
Definition: buffer.c:253
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIo(const GWEN_SYNCIO *sio)
Definition: syncio.c:224
#define GWEN_HTTP_SESSION_FLAGS_TLS_IGN_PREMATURE_CLOSE
Definition: httpsession.h:47
int GWEN_HttpSession_ConnectionTest(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:879
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbStatusOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1311
GWENHYWFAR_API int GWEN_Gui_GetSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui_virtual.c:652
static int _recvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
Definition: httpsession.c:569
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderIn(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1285
#define GWEN_SYNCIO_FILE_FLAGS_GREAD
Definition: syncio_file.h:62
uint32_t GWEN_HttpSession_GetFlags(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:172
#define GWEN_ERROR_SSL
Definition: error.h:105
int GWENHYWFAR_CB(* GWEN_HTTPSESSION_INITSYNCIO_FN)(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.h:270
int GWEN_HttpSession_SendStatus(GWEN_HTTP_SESSION *sess, int resultCode, const char *resultText, const uint8_t *buf, uint32_t blen)
Definition: httpsession.c:504
static int _initSyncIo(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.c:917
GWEN_HTTP_SESSION * GWEN_HttpSession_fromSyncIoPassive(GWEN_SYNCIO *sio)
Definition: httpsession.c:107
static void _setHostHeaderFromUrl(const char *sUrl, GWEN_DB_NODE *dbHeader)
Definition: httpsession.c:385
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
struct GWEN_URL GWEN_URL
Definition: url.h:77
void GWEN_HttpSession_SubFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:202
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
#define GWEN_DB_FLAGS_OVERWRITE_GROUPS
Definition: db.h:123
#define GWEN_HTTP_SESSION_FLAGS_NO_CACHE
Definition: httpsession.h:41
#define GWEN_SYNCIO_TLS_FLAGS_IGN_PREMATURE_CLOSE
Definition: syncio_tls.h:45
int GWEN_HttpSession_Init(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:303
#define GWEN_SYNCIO_FILE_FLAGS_GWRITE
Definition: syncio_file.h:63
void GWEN_Text_LogString(const char *s, unsigned int l, const char *logDomain, GWEN_LOGGER_LEVEL lv)
Definition: text.c:1606
#define GWEN_SYNCIO_FLAGS_PASSIVE
Definition: syncio.h:57
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:971
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition: syncio_file.h:59
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
Definition: db.c:1381
void GWEN_HttpSession_AddFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:192
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWEN_SYNCIO * GWEN_SyncIo_GetBaseIoByTypeName(const GWEN_SYNCIO *sio, const char *typeName)
Definition: syncio.c:233
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:78
const char * GWEN_Url_GetServer(const GWEN_URL *st)
Definition: url.c:186
void GWEN_HttpSession_Attach(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:130
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:179
#define GWEN_SYNCIO_TLS_FLAGS_ADD_TRUSTED_CAS
Definition: syncio_tls.h:40
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
Definition: buffer.c:950
struct GWEN_HTTP_SESSION GWEN_HTTP_SESSION
Definition: httpsession.h:21
void GWEN_HttpSession_SetFlags(GWEN_HTTP_SESSION *sess, uint32_t fl)
Definition: httpsession.c:182
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1298
#define GWEN_SYNCIO_TLS_TYPE
Definition: syncio_tls.h:33
void GWEN_HttpSession_SetHttpUserAgent(GWEN_HTTP_SESSION *sess, const char *s)
Definition: httpsession.c:222
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:109
int GWEN_HttpSession_RecvPacketToFile(GWEN_HTTP_SESSION *sess, const char *fname)
Definition: httpsession.c:799
GWEN_URL * GWEN_Url_fromString(const char *str)
Definition: urlfns.c:24
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
GWEN_HTTPSESSION_INITSYNCIO_FN GWEN_HttpSession_SetInitSyncIoFn(GWEN_HTTP_SESSION *sess, GWEN_HTTPSESSION_INITSYNCIO_FN f)
Definition: httpsession.c:160
#define GWEN_SYNCIO_HTTP_TYPE
Definition: syncio_http.h:33
const char * GWEN_SyncIo_GetTypeName(const GWEN_SYNCIO *sio)
Definition: syncio.c:215
GWEN_HTTP_SESSION * GWEN_HttpSession_new(const char *url, const char *defaultProto, int defaultPort)
Definition: httpsession.c:48
static int _recvPacketToSio(GWEN_HTTP_SESSION *sess, GWEN_SYNCIO *sio)
Definition: httpsession.c:745
struct GWEN_SOCKET GWEN_SOCKET
Definition: inetsocket.h:44
GWEN_SYNCIO * GWEN_SyncIo_Socket_TakeOver(GWEN_SOCKET *socket)
Definition: syncio_socket.c:76
void GWEN_HttpSession_free(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:139
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
int GWEN_Logger_GetLevel(const char *logDomain)
Definition: logger.c:483
void GWEN_HttpSession_SetHttpVMajor(GWEN_HTTP_SESSION *sess, int i)
Definition: httpsession.c:270
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1202
#define DBG_INFO(dbg_logger, format,...)
Definition: debug.h:181
#define GWEN_ERROR_INTERNAL
Definition: error.h:125
const char * GWEN_HttpSession_GetHttpUserAgent(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:212
int GWEN_HttpSession_GetHttpVMinor(const GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:280
int GWEN_HttpSession_Fini(GWEN_HTTP_SESSION *sess)
Definition: httpsession.c:404
int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
Definition: db.c:1524
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
int GWEN_SyncIo_Flush(GWEN_SYNCIO *sio)
Definition: syncio.c:121
int GWEN_HttpSession_RecvPacket(GWEN_HTTP_SESSION *sess, GWEN_BUFFER *buf)
Definition: httpsession.c:645
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandIn(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1259
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108