From 4103655d0809e61859e1487df36fd47911cde92b Mon Sep 17 00:00:00 2001
From: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
Date: Fri, 6 Feb 2009 12:14:47 -0500
Subject: [PATCH] Add REST code to build the request to server

---
 sflphone-gtk/src/reqaccount.c | 130 ++++++++++++++++++++++++++++++++++
 sflphone-gtk/src/reqaccount.h |  27 +++++++
 2 files changed, 157 insertions(+)
 create mode 100644 sflphone-gtk/src/reqaccount.c
 create mode 100644 sflphone-gtk/src/reqaccount.h

diff --git a/sflphone-gtk/src/reqaccount.c b/sflphone-gtk/src/reqaccount.c
new file mode 100644
index 0000000000..6c5afafce8
--- /dev/null
+++ b/sflphone-gtk/src/reqaccount.c
@@ -0,0 +1,130 @@
+/*
+ *  Copyright (C) 2009 Jean Schurger <jean@schurger.org>
+ *  and Savoir-Faire Linux inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ *  To test:
+ *
+ *  cc -o reqhttp reqhttp.c -DBUILD_EXAMPLE
+ * 
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <signal.h>
+#include <string.h>
+#include <strings.h> /* bzero */
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include "reqaccount.h"
+
+int req(char *host, int port, char *req, char *ret) {
+  int s;
+  struct sockaddr_in servSockAddr;
+  struct hostent *servHostEnt;
+  long hostAddr;
+  long status;
+  int length, i;
+  FILE *f;
+  char buf[1024];
+  
+  bzero(&servSockAddr, sizeof(servSockAddr));
+  hostAddr = inet_addr(host);
+
+  if ((long)hostAddr != (long)-1)
+    bcopy(&hostAddr, &servSockAddr.sin_addr, sizeof(hostAddr));
+  else {
+    servHostEnt = gethostbyname(host);
+    if (servHostEnt == NULL) {
+      strcpy(ret, "gethostbyname");
+      return -1;
+    }
+    bcopy(servHostEnt->h_addr, &servSockAddr.sin_addr, servHostEnt->h_length);
+  }
+  servSockAddr.sin_port = htons(port);
+  servSockAddr.sin_family = AF_INET;
+  
+  if ((s = socket(AF_INET,SOCK_STREAM,0)) < 0) {
+    strcpy(ret, "socket");
+    return -1;
+  }
+  
+  if(connect(s, (const struct sockaddr *) &servSockAddr,
+	     (socklen_t) sizeof(servSockAddr)) < 0 ) {
+    strcpy(ret, "connect");
+    return -1;
+  }
+  
+  f = fdopen(s, "r+");
+
+  fprintf(f, "%s HTTP/1.1\r\n", req);
+  fprintf(f, "Host: %s\r\n", host);
+  fputs("User-Agent: SFLphone\r\n", f);
+  fputs("\r\n", f);
+
+  while (strncmp(fgets(buf, sizeof(buf), f), "\r\n", 2)) {
+    const char *len_h = "content-length";
+    const char *status_h = "HTTP/1.1";
+    if (strncasecmp(buf, len_h, strlen(len_h)) == 0)
+      length = atoi(buf + strlen(len_h) + 1);
+    if (strncasecmp(buf, status_h, strlen(status_h)) == 0)
+      status = atoi(buf + strlen(status_h) + 1);
+  }
+  for (i = 0; i < length; i++)
+    ret[i] = fgetc(f);
+
+  if (status != 200) {
+    sprintf(ret, "http error: %ld", status);
+    return -1;
+  }
+
+  fclose(f);
+  shutdown(s, 2);
+  close(s);
+  return 0;
+}
+
+rest_account get_rest_account(char *host) {
+  char ret[4096];
+  rest_account ra;
+  bzero(ret, sizeof(ret));
+  if (req(host, 80, "GET /rest/accountcreator", ret) != -1) {
+    strcpy(ra.user, strtok(ret, "\n"));
+    strcpy(ra.passwd, strtok(NULL, "\n"));\
+    ra.success = 1;
+  } else {
+    ra.success = 0;
+    strcpy(ra.reason, ret);
+  }
+  return ra;
+}
+
+
+#ifdef BUILD_EXAMPLE
+
+int main (void) {
+  rest_account acc = get_rest_account("sip.sflphone.org");
+  if (acc.success) {
+    puts(acc.user);
+    puts(acc.passwd);
+  } else {
+    printf("FAILED: %s\n", acc.reason);
+  }
+}
+#endif
diff --git a/sflphone-gtk/src/reqaccount.h b/sflphone-gtk/src/reqaccount.h
new file mode 100644
index 0000000000..5c2b7bc1cb
--- /dev/null
+++ b/sflphone-gtk/src/reqaccount.h
@@ -0,0 +1,27 @@
+/*
+ *  Copyright (C) 2009 Jean Schurger <jean@schurger.org>
+ *  and Savoir-Faire Linux inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+typedef struct {
+  char success;
+  char reason[200];
+  char user[200];
+  char passwd[200];
+} rest_account;
+
+rest_account get_rest_account(char *host);
-- 
GitLab