Ejemplo n.º 1
0
// NULL=失败
struct http_request *http_request_parse( struct buffer *buf ) {
  struct http_request *request = NEW(struct http_request);
  if (request == NULL) return NULL;
  memset(request, 0, sizeof(request));
  {
    // 请求行处理
    char *line = buffer_readline(buf);
    if (line == NULL) {
      http_request_free(request);
      return NULL; 
    }
    int ret = parse_init_line(request, line);
    free(line);
    line = NULL;
    if(ret != 0) {
      http_request_free(request);
      return NULL;
    }
  }

  request->headers = http_header_new();
  // parse headers
  char *line = buffer_readline(buf) ;
  int ret = 0;
  // 头和Body之间有一个空行
  while(line != NULL && *line != '\0') {
    ret = http_add_header_line(request->headers, line);
    if(ret != 0) break;
    free(line);
    line = buffer_readline(buf);
  }
  if (line) free(line);
  // 忽略body数据,现在还不支持
  return request;
}
Ejemplo n.º 2
0
static void stdin_io(void) {
    for (;;) {
        char *line;
        ssize_t size = buffer_readline(STDIN_FILENO, &line);
        if (size == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) break;

        if (check(size, "read()") == 0) {
            report("EOF (%d)\n", STDIN_FILENO);
            exit(EXIT_SUCCESS);
        }

        check(write(child_in, line, size), "write()");
    }
}
Ejemplo n.º 3
0
static void client_io (int client) {
    for (;;) {
        char *line;
        ssize_t size = buffer_readline(client, &line);
        if (size == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) break;

        if (size == 0 || size == -1) {
            clients = ilist_del(clients, client);
            close(client);
            buffer_clear(client);
            if (size == 0) report("exit (%d)\n", client);
            else report("exit (%d): %s\n", client, strerror(errno));
            break;
        }

        report("(%d) ", client);
        check(write(STDERR_FILENO, line, size), "write()");
        if (line[size-1] != '\n') fprintf(stderr, "\\\n");

        check(write(child_in, line, size), "write()");
    }
}