QDNix
Quick’n’dirty *NIX
gemini.c
1 #include <string.h>
2 #include "geminid.h"
3 
4 #ifndef MAX_PATH
5 # define MAX_PATH 1024
6 #endif /* !MAX_PATH */
7 
8 char *
9 gemini_get_path(const char *req)
10 {
11  static char path[MAX_PATH];
12  size_t i;
13  size_t j;
14  int has_pass_hostname;
15  size_t len;
16 
17  len = strlen(req);
18  if (req[len - 2] != '\r' || req[len - 1] != '\n')
19  {
20  return (NULL);
21  }
22 
23  if (strncmp("gemini://", req, 9) != 0)
24  {
25  return (NULL);
26  }
27 
28  has_pass_hostname = 0;
29  for (i = 9, j = 0 /* skip gemi..:// */; i < len && j < MAX_BUFFER; i++)
30  {
31  if (req[i] == '\r' || req[i] == '\n')
32  {
33  break;
34  }
35 
36  if (!has_pass_hostname)
37  {
38  if (req[i] != '/')
39  {
40  continue;
41  }
42  has_pass_hostname = 1;
43  }
44 
45  path[j++] = req[i];
46  }
47 
48  path[j] = '\0';
49  if (strcmp("/", path) == 0)
50  {
51  strcpy(path, "/index.gmi");
52  }
53  return (path);
54 }
55 
56 void
57 gemini_protocol_handler(SSL *client, const char *srv_dir)
58 {
59  char buffer[MAX_BUFFER];
60  ssize_t read;
61  char *path;
62 
63  if ((read = SSL_read(client, buffer, MAX_BUFFER)) > 0)
64  {
65  buffer[read] = '\0';
66  printf("%s", buffer);
67  path = gemini_get_path(buffer);
68  if (path == NULL)
69  {
70  sprintf(buffer, "59 Invalid URI\r\n");
71  SSL_write(client, buffer, MAX_BUFFER);
72  return;
73  }
74  printf("%s\n", path);
75  }
76 }