Changes in uspace/app/websrv/websrv.c [d076f16:8d2dd7f2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/websrv/websrv.c
rd076f16 r8d2dd7f2 75 75 static uint16_t port = DEFAULT_PORT; 76 76 77 typedef struct { 78 tcp_conn_t *conn; 79 80 char rbuf[BUFFER_SIZE]; 81 size_t rbuf_out; 82 size_t rbuf_in; 83 84 char lbuf[BUFFER_SIZE + 1]; 85 size_t lbuf_used; 86 } recv_t; 77 static char rbuf[BUFFER_SIZE]; 78 static size_t rbuf_out; 79 static size_t rbuf_in; 80 81 static char lbuf[BUFFER_SIZE + 1]; 82 static size_t lbuf_used; 83 84 static char fbuf[BUFFER_SIZE]; 87 85 88 86 static bool verbose = false; … … 133 131 "</html>\r\n"; 134 132 135 136 static int recv_create(tcp_conn_t *conn, recv_t **rrecv)137 {138 recv_t *recv;139 140 recv = calloc(1, sizeof(recv_t));141 if (recv == NULL)142 return ENOMEM;143 144 recv->conn = conn;145 recv->rbuf_out = 0;146 recv->rbuf_in = 0;147 recv->lbuf_used = 0;148 149 *rrecv = recv;150 return EOK;151 }152 153 static void recv_destroy(recv_t *recv)154 {155 free(recv);156 }157 158 133 /** Receive one character (with buffering) */ 159 static int recv_char( recv_t *recv, char *c)134 static int recv_char(tcp_conn_t *conn, char *c) 160 135 { 161 136 size_t nrecv; 162 137 int rc; 163 138 164 if (r ecv->rbuf_out == recv->rbuf_in) {165 r ecv->rbuf_out = 0;166 r ecv->rbuf_in = 0;167 168 rc = tcp_conn_recv_wait( recv->conn, recv->rbuf, BUFFER_SIZE, &nrecv);139 if (rbuf_out == rbuf_in) { 140 rbuf_out = 0; 141 rbuf_in = 0; 142 143 rc = tcp_conn_recv_wait(conn, rbuf, BUFFER_SIZE, &nrecv); 169 144 if (rc != EOK) { 170 145 fprintf(stderr, "tcp_conn_recv() failed (%d)\n", rc); … … 172 147 } 173 148 174 r ecv->rbuf_in = nrecv;175 } 176 177 *c = r ecv->rbuf[recv->rbuf_out++];149 rbuf_in = nrecv; 150 } 151 152 *c = rbuf[rbuf_out++]; 178 153 return EOK; 179 154 } 180 155 181 156 /** Receive one line with length limit */ 182 static int recv_line( recv_t *recv, char **rbuf)183 { 184 char *bp = recv->lbuf;157 static int recv_line(tcp_conn_t *conn) 158 { 159 char *bp = lbuf; 185 160 char c = '\0'; 186 161 187 while (bp < recv->lbuf + BUFFER_SIZE) {162 while (bp < lbuf + BUFFER_SIZE) { 188 163 char prev = c; 189 int rc = recv_char( recv, &c);164 int rc = recv_char(conn, &c); 190 165 191 166 if (rc != EOK) … … 197 172 } 198 173 199 recv->lbuf_used = bp - recv->lbuf;174 lbuf_used = bp - lbuf; 200 175 *bp = '\0'; 201 176 202 if (bp == recv->lbuf + BUFFER_SIZE)177 if (bp == lbuf + BUFFER_SIZE) 203 178 return ELIMIT; 204 179 205 *rbuf = recv->lbuf;206 180 return EOK; 207 181 } … … 244 218 static int uri_get(const char *uri, tcp_conn_t *conn) 245 219 { 246 char *fbuf = NULL;247 char *fname = NULL;248 int rc;249 int fd = -1;250 251 fbuf = calloc(BUFFER_SIZE, 1);252 if (fbuf == NULL) {253 rc = ENOMEM;254 goto out;255 }256 257 220 if (str_cmp(uri, "/") == 0) 258 221 uri = "/index.html"; 259 222 260 rc = asprintf(&fname, "%s%s", WEB_ROOT, uri); 261 if (rc < 0) { 262 rc = ENOMEM; 263 goto out; 264 } 265 266 fd = vfs_lookup_open(fname, WALK_REGULAR, MODE_READ); 223 char *fname; 224 int rc = asprintf(&fname, "%s%s", WEB_ROOT, uri); 225 if (rc < 0) 226 return ENOMEM; 227 228 int fd = vfs_lookup_open(fname, WALK_REGULAR, MODE_READ); 267 229 if (fd < 0) { 268 230 rc = send_response(conn, msg_not_found); 269 goto out; 231 free(fname); 232 return rc; 270 233 } 271 234 272 235 free(fname); 273 fname = NULL;274 236 275 237 rc = send_response(conn, msg_ok); 276 238 if (rc != EOK) 277 goto out;239 return rc; 278 240 279 241 aoff64_t pos = 0; … … 284 246 285 247 if (nr < 0) { 286 rc = EIO;287 goto out;248 vfs_put(fd); 249 return EIO; 288 250 } 289 251 … … 291 253 if (rc != EOK) { 292 254 fprintf(stderr, "tcp_conn_send() failed\n"); 293 goto out; 255 vfs_put(fd); 256 return rc; 294 257 } 295 258 } 296 259 297 rc = EOK; 298 out: 299 if (fd >= 0) 300 vfs_put(fd); 301 free(fname); 302 free(fbuf); 303 return rc; 304 } 305 306 static int req_process(tcp_conn_t *conn, recv_t *recv) 307 { 308 char *reqline = NULL; 309 310 int rc = recv_line(recv, &reqline); 260 vfs_put(fd); 261 262 return EOK; 263 } 264 265 static int req_process(tcp_conn_t *conn) 266 { 267 int rc = recv_line(conn); 311 268 if (rc != EOK) { 312 269 fprintf(stderr, "recv_line() failed\n"); … … 315 272 316 273 if (verbose) 317 fprintf(stderr, "Request: %s", reqline);318 319 if (str_lcmp( reqline, "GET ", 4) != 0) {274 fprintf(stderr, "Request: %s", lbuf); 275 276 if (str_lcmp(lbuf, "GET ", 4) != 0) { 320 277 rc = send_response(conn, msg_not_implemented); 321 278 return rc; 322 279 } 323 280 324 char *uri = reqline+ 4;281 char *uri = lbuf + 4; 325 282 char *end_uri = str_chr(uri, ' '); 326 283 if (end_uri == NULL) { 327 end_uri = reqline + str_size(reqline)- 2;284 end_uri = lbuf + lbuf_used - 2; 328 285 assert(*end_uri == '\r'); 329 286 } … … 343 300 static void usage(void) 344 301 { 345 printf("S imple webserver\n"302 printf("Skeletal server\n" 346 303 "\n" 347 304 "Usage: " NAME " [options]\n" … … 406 363 { 407 364 int rc; 408 recv_t *recv = NULL;409 365 410 366 if (verbose) 411 367 fprintf(stderr, "New connection, waiting for request\n"); 412 368 413 rc = recv_create(conn, &recv); 414 if (rc != EOK) { 415 fprintf(stderr, "Out of memory.\n"); 416 goto error; 417 } 418 419 rc = req_process(conn, recv); 369 rbuf_out = 0; 370 rbuf_in = 0; 371 372 rc = req_process(conn); 420 373 if (rc != EOK) { 421 374 fprintf(stderr, "Error processing request (%s)\n", 422 375 str_error(rc)); 423 goto error;424 } 425 376 return; 377 } 378 426 379 rc = tcp_conn_send_fin(conn); 427 380 if (rc != EOK) { 428 381 fprintf(stderr, "Error sending FIN.\n"); 429 goto error; 430 } 431 432 recv_destroy(recv); 433 return; 434 error: 435 rc = tcp_conn_reset(conn); 436 if (rc != EOK) 437 fprintf(stderr, "Error resetting connection.\n"); 438 439 recv_destroy(recv); 382 return; 383 } 440 384 } 441 385
Note:
See TracChangeset
for help on using the changeset viewer.