// 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; }
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()"); } }
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()"); } }