static int send_file_to_socket(const char *file, int fd) { FILE *fp; char buffer[MAX_BUF_SIZE]; int bytes_read; int bytes_written; int err; size_t file_size; const char *end_of_msg = "\r\n"; const char *file_not_found = "<html><head><title>ERROR 404</title><body><p>I ain't got this file dude</p></body><html>"; err = 0; fp = fopen(file, "r"); if (fp) { fseek(fp, 0, SEEK_END); file_size = ftell(fp); fseek(fp, 0, SEEK_SET); err = write_response_header(fd, file_size, "200 OK", "HTTP/1.1", "text/html", "close"); if (!err) { do { bytes_read = fread(buffer, 1, sizeof(buffer), fp); if (bytes_read <= 0) { if (bytes_read < 0) { perror("mod_file - fread"); } break; } else { bytes_written = write(fd, buffer, bytes_read); if (bytes_written <= 0) { perror("mod_file - write\n"); break; } } } while (1); } fclose(fp); } else { err = write_response_header(fd, strlen(file_not_found), "404 Not Found", "HTTP/1.1", "text/html", "close"); err = (write(fd, file_not_found, strlen(file_not_found)) <= 0 ? 1 : 0); } if (!err) { err = (write(fd, end_of_msg, strlen(end_of_msg)) <= 0 ? 1 : 0); } return err; }
void ws_connection::read_header() { if (!tcp_connection_.read()) { return; } if (tcp_connection_.read_bytes() > max_header_size) { LOG(ERROR) << "client header too long, closing connection"; tcp_connection_.close_connection = true; return; } std::string header(read_ws_header(tcp_connection_)); if (!ws_util_.find_header_end(header)) { return; } if (ws_util_.parse_header(header)) { write_response_header(); } else { tcp_connection_.close_connection = true; } }
static int parse_request(struct fd_state *state) { assert(state && state->read_buf); //printf("%s", state->read_buf); char *path = strchr(state->read_buf, '/'); if (path == NULL) return -1; char *scookies = strstr(path, "Cookie: "); if (scookies) scookies += 8; char *space = strchr(path, ' '); if (space) { *space = 0; } char *question = strchr(path, '?'); if (question) *question = 0; urldecode(path); char *sparams = NULL; if (question) sparams = question + 1; int iscalled = call_callback(state, path, sparams, scookies); if (iscalled) { return 0; } const char *dot = strrchr(path, '.'); if (dot) { //file const char *ext = dot + 1; const char *mime = "text/plain"; if (strcmp(ext, "html") == 0 || strcmp(ext, "htm") == 0) { mime = "text/html"; } else if (strcmp(ext, "css") == 0) { mime = "text/css"; } else if (strcmp(ext, "js") == 0) { mime = "text/javascript"; } else if (strcmp(ext, "png") == 0) { mime = "image/png"; } else if (strcmp(ext, "jpeg") == 0 || strcmp(ext, "jpg") == 0 || strcmp(ext, "jpe") == 0 ) { mime = "image/jpeg"; } else if (strcmp(ext, "gif") == 0) { mime = "image/gif"; } char abspath[1024]; strncpy(abspath, _root_dir, sizeof(abspath)); strncat(abspath, path, sizeof(abspath)-strlen(path)); state->pf = fopen(abspath, "r"); if (state->pf) { fseek(state->pf, 0, SEEK_END); write_response_header(state, mime, ftell(state->pf), ""); rewind(state->pf); } else { write_response_error(state); } } else { //func write_response_error(state); } return 0; }
int call_callback(struct fd_state *state, const char *path, char *sparams, char *scookies) { assert(state && path); struct callback_elem *elem = callback_head; while (elem) { if (strcmp(path, elem->path) == 0) { struct lh_response response; response.header[0] = 0; response.header_len = 0; response.body[0] = 0; response.body_len = 0; struct lh_kv_elem *params = parse_url_params(sparams); struct lh_kv_elem *cookies = parse_cookies(scookies); elem->callback(params, cookies, &response); free_kvs(params); free_kvs(cookies); write_response_header(state, "application/json", response.body_len, response.header); if (response.header_len > 0) write_to_buf(state, response.header, response.header_len); if (response.body_len > 0) write_to_buf(state, response.body, response.body_len); return 1; } elem = elem->next; } return 0; }