Changes in uspace/app/websrv/websrv.c [5a6cc679:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/websrv/websrv.c
r5a6cc679 ra35b458 137 137 { 138 138 recv_t *recv; 139 139 140 140 recv = calloc(1, sizeof(recv_t)); 141 141 if (recv == NULL) 142 142 return ENOMEM; 143 143 144 144 recv->conn = conn; 145 145 recv->rbuf_out = 0; 146 146 recv->rbuf_in = 0; 147 147 recv->lbuf_used = 0; 148 148 149 149 *rrecv = recv; 150 150 return EOK; … … 161 161 size_t nrecv; 162 162 errno_t rc; 163 163 164 164 if (recv->rbuf_out == recv->rbuf_in) { 165 165 recv->rbuf_out = 0; 166 166 recv->rbuf_in = 0; 167 167 168 168 rc = tcp_conn_recv_wait(recv->conn, recv->rbuf, BUFFER_SIZE, &nrecv); 169 169 if (rc != EOK) { … … 171 171 return rc; 172 172 } 173 173 174 174 recv->rbuf_in = nrecv; 175 175 } 176 176 177 177 *c = recv->rbuf[recv->rbuf_out++]; 178 178 return EOK; … … 184 184 char *bp = recv->lbuf; 185 185 char c = '\0'; 186 186 187 187 while (bp < recv->lbuf + BUFFER_SIZE) { 188 188 char prev = c; 189 189 errno_t rc = recv_char(recv, &c); 190 190 191 191 if (rc != EOK) 192 192 return rc; 193 193 194 194 *bp++ = c; 195 195 if ((prev == '\r') && (c == '\n')) 196 196 break; 197 197 } 198 198 199 199 recv->lbuf_used = bp - recv->lbuf; 200 200 *bp = '\0'; 201 201 202 202 if (bp == recv->lbuf + BUFFER_SIZE) 203 203 return ELIMIT; 204 204 205 205 *rbuf = recv->lbuf; 206 206 return EOK; … … 211 211 if (uri[0] != '/') 212 212 return false; 213 213 214 214 if (uri[1] == '.') 215 215 return false; 216 216 217 217 char *cp = uri + 1; 218 218 219 219 while (*cp != '\0') { 220 220 char c = *cp++; … … 222 222 return false; 223 223 } 224 224 225 225 return true; 226 226 } … … 229 229 { 230 230 size_t response_size = str_size(msg); 231 231 232 232 if (verbose) 233 233 fprintf(stderr, "Sending response\n"); 234 234 235 235 errno_t rc = tcp_conn_send(conn, (void *) msg, response_size); 236 236 if (rc != EOK) { … … 238 238 return rc; 239 239 } 240 240 241 241 return EOK; 242 242 } … … 249 249 size_t nr; 250 250 int fd = -1; 251 251 252 252 fbuf = calloc(BUFFER_SIZE, 1); 253 253 if (fbuf == NULL) { … … 255 255 goto out; 256 256 } 257 257 258 258 if (str_cmp(uri, "/") == 0) 259 259 uri = "/index.html"; 260 260 261 261 if (asprintf(&fname, "%s%s", WEB_ROOT, uri) < 0) { 262 262 rc = ENOMEM; 263 263 goto out; 264 264 } 265 265 266 266 rc = vfs_lookup_open(fname, WALK_REGULAR, MODE_READ, &fd); 267 267 if (rc != EOK) { … … 269 269 goto out; 270 270 } 271 271 272 272 free(fname); 273 273 fname = NULL; 274 274 275 275 rc = send_response(conn, msg_ok); 276 276 if (rc != EOK) 277 277 goto out; 278 278 279 279 aoff64_t pos = 0; 280 280 while (true) { … … 282 282 if (rc != EOK) 283 283 goto out; 284 284 285 285 if (nr == 0) 286 286 break; 287 287 288 288 rc = tcp_conn_send(conn, fbuf, nr); 289 289 if (rc != EOK) { … … 292 292 } 293 293 } 294 294 295 295 rc = EOK; 296 296 out: … … 311 311 return rc; 312 312 } 313 313 314 314 if (verbose) 315 315 fprintf(stderr, "Request: %s", reqline); 316 316 317 317 if (str_lcmp(reqline, "GET ", 4) != 0) { 318 318 rc = send_response(conn, msg_not_implemented); 319 319 return rc; 320 320 } 321 321 322 322 char *uri = reqline + 4; 323 323 char *end_uri = str_chr(uri, ' '); … … 326 326 assert(*end_uri == '\r'); 327 327 } 328 328 329 329 *end_uri = '\0'; 330 330 if (verbose) 331 331 fprintf(stderr, "Requested URI: %s\n", uri); 332 332 333 333 if (!uri_is_valid(uri)) { 334 334 rc = send_response(conn, msg_bad_request); 335 335 return rc; 336 336 } 337 337 338 338 return uri_get(uri, conn); 339 339 } … … 359 359 int value; 360 360 errno_t rc; 361 361 362 362 switch (argv[*index][1]) { 363 363 case 'h': … … 369 369 if (rc != EOK) 370 370 return rc; 371 371 372 372 port = (uint16_t) value; 373 373 break; … … 384 384 if (rc != EOK) 385 385 return rc; 386 386 387 387 port = (uint16_t) value; 388 388 } else if (str_cmp(argv[*index] +2, "verbose") == 0) { … … 397 397 return EINVAL; 398 398 } 399 399 400 400 return EOK; 401 401 } … … 405 405 errno_t rc; 406 406 recv_t *recv = NULL; 407 407 408 408 if (verbose) 409 409 fprintf(stderr, "New connection, waiting for request\n"); 410 410 411 411 rc = recv_create(conn, &recv); 412 412 if (rc != EOK) { … … 414 414 goto error; 415 415 } 416 416 417 417 rc = req_process(conn, recv); 418 418 if (rc != EOK) { … … 421 421 goto error; 422 422 } 423 423 424 424 rc = tcp_conn_send_fin(conn); 425 425 if (rc != EOK) { … … 434 434 if (rc != EOK) 435 435 fprintf(stderr, "Error resetting connection.\n"); 436 436 437 437 recv_destroy(recv); 438 438 } … … 444 444 tcp_t *tcp; 445 445 errno_t rc; 446 446 447 447 /* Parse command line arguments */ 448 448 for (int i = 1; i < argc; i++) { … … 456 456 } 457 457 } 458 458 459 459 printf("%s: HelenOS web server\n", NAME); 460 460 461 461 if (verbose) 462 462 fprintf(stderr, "Creating listener\n"); 463 463 464 464 inet_ep_init(&ep); 465 465 ep.port = port; … … 477 477 return 2; 478 478 } 479 479 480 480 fprintf(stderr, "%s: Listening for connections at port %" PRIu16 "\n", 481 481 NAME, port); … … 483 483 task_retval(0); 484 484 async_manager(); 485 485 486 486 /* Not reached */ 487 487 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.