1 /* 2 * Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu> 3 * Copyright (c) 2007-2011 Niels Provos and Nick Mathewson 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 module deimos.event2.http; 28 29 /* For int types. */ 30 public import deimos.event2.util; 31 import deimos.event2._d_util; 32 import deimos.event2.event; 33 import deimos.event2.buffer; 34 35 extern (C): 36 nothrow: 37 38 static import deimos.event2._opaque_structs; 39 40 alias evbuffer = deimos.event2._opaque_structs.evbuffer; 41 alias event_base = deimos.event2._opaque_structs.event_base; 42 43 /** @file event2/http.h 44 * 45 * Basic support for HTTP serving. 46 * 47 * As Libevent is a library for dealing with event notification and most 48 * interesting applications are networked today, I have often found the 49 * need to write HTTP code. The following prototypes and definitions provide 50 * an application with a minimal interface for making HTTP requests and for 51 * creating a very simple HTTP server. 52 */ 53 54 /* Response codes */ 55 enum HTTP_OK = 200; /**< request completed ok */ 56 enum HTTP_NOCONTENT = 204; /**< request does not have content */ 57 enum HTTP_MOVEPERM = 301; /**< the uri moved permanently */ 58 enum HTTP_MOVETEMP = 302; /**< the uri moved temporarily */ 59 enum HTTP_NOTMODIFIED = 304; /**< page was not modified from last */ 60 enum HTTP_BADREQUEST = 400; /**< invalid http request was made */ 61 enum HTTP_NOTFOUND = 404; /**< could not find content for uri */ 62 enum HTTP_BADMETHOD = 405; /**< method not allowed for this uri */ 63 enum HTTP_ENTITYTOOLARGE = 413; /**< */ 64 enum HTTP_EXPECTATIONFAILED = 417; /**< we can't handle this expectation */ 65 enum HTTP_INTERNAL = 500; /**< internal error */ 66 enum HTTP_NOTIMPLEMENTED = 501; /**< not implemented */ 67 enum HTTP_SERVUNAVAIL = 503; /**< the server is not available */ 68 69 struct evhttp; 70 struct evhttp_request; 71 struct evkeyvalq; 72 struct evhttp_bound_socket; 73 struct evconnlistener; 74 75 /** 76 * Create a new HTTP server. 77 * 78 * @param base (optional) the event base to receive the HTTP events 79 * @return a pointer to a newly initialized evhttp server structure 80 * @see evhttp_free() 81 */ 82 evhttp* evhttp_new(event_base* base); 83 84 /** 85 * Binds an HTTP server on the specified address and port. 86 * 87 * Can be called multiple times to bind the same http server 88 * to multiple different ports. 89 * 90 * @param http a pointer to an evhttp object 91 * @param address a string containing the IP address to listen(2) on 92 * @param port the port number to listen on 93 * @return 0 on success, -1 on failure. 94 * @see evhttp_accept_socket() 95 */ 96 int evhttp_bind_socket(evhttp* http, const(char)* address, ev_uint16_t port); 97 98 /** 99 * Like evhttp_bind_socket(), but returns a handle for referencing the socket. 100 * 101 * The returned pointer is not valid after \a http is freed. 102 * 103 * @param http a pointer to an evhttp object 104 * @param address a string containing the IP address to listen(2) on 105 * @param port the port number to listen on 106 * @return Handle for the socket on success, NULL on failure. 107 * @see evhttp_bind_socket(), evhttp_del_accept_socket() 108 */ 109 evhttp_bound_socket* evhttp_bind_socket_with_handle(evhttp* http, const(char)* address, ev_uint16_t port); 110 111 /** 112 * Makes an HTTP server accept connections on the specified socket. 113 * 114 * This may be useful to create a socket and then fork multiple instances 115 * of an http server, or when a socket has been communicated via file 116 * descriptor passing in situations where an http servers does not have 117 * permissions to bind to a low-numbered port. 118 * 119 * Can be called multiple times to have the http server listen to 120 * multiple different sockets. 121 * 122 * @param http a pointer to an evhttp object 123 * @param fd a socket fd that is ready for accepting connections 124 * @return 0 on success, -1 on failure. 125 * @see evhttp_bind_socket() 126 */ 127 int evhttp_accept_socket(evhttp* http, evutil_socket_t fd); 128 129 /** 130 * Like evhttp_accept_socket(), but returns a handle for referencing the socket. 131 * 132 * The returned pointer is not valid after \a http is freed. 133 * 134 * @param http a pointer to an evhttp object 135 * @param fd a socket fd that is ready for accepting connections 136 * @return Handle for the socket on success, NULL on failure. 137 * @see evhttp_accept_socket(), evhttp_del_accept_socket() 138 */ 139 evhttp_bound_socket* evhttp_accept_socket_with_handle(evhttp* http, evutil_socket_t fd); 140 141 /** 142 * The most low-level evhttp_bind/accept method: takes an evconnlistener, and 143 * returns an evhttp_bound_socket. The listener will be freed when the bound 144 * socket is freed. 145 */ 146 evhttp_bound_socket* evhttp_bind_listener(evhttp* http, evconnlistener* listener); 147 148 /** 149 * Return the listener used to implement a bound socket. 150 */ 151 evconnlistener* evhttp_bound_socket_get_listener(evhttp_bound_socket* bound); 152 153 /** 154 * Makes an HTTP server stop accepting connections on the specified socket 155 * 156 * This may be useful when a socket has been sent via file descriptor passing 157 * and is no longer needed by the current process. 158 * 159 * If you created this bound socket with evhttp_bind_socket_with_handle or 160 * evhttp_accept_socket_with_handle, this function closes the fd you provided. 161 * If you created this bound socket with evhttp_bind_listener, this function 162 * frees the listener you provided. 163 * 164 * \a bound_socket is an invalid pointer after this call returns. 165 * 166 * @param http a pointer to an evhttp object 167 * @param bound_socket a handle returned by evhttp_{bind,accept}_socket_with_handle 168 * @see evhttp_bind_socket_with_handle(), evhttp_accept_socket_with_handle() 169 */ 170 void evhttp_del_accept_socket(evhttp* http, evhttp_bound_socket* bound_socket); 171 172 /** 173 * Get the raw file descriptor referenced by an evhttp_bound_socket. 174 * 175 * @param bound_socket a handle returned by evhttp_{bind,accept}_socket_with_handle 176 * @return the file descriptor used by the bound socket 177 * @see evhttp_bind_socket_with_handle(), evhttp_accept_socket_with_handle() 178 */ 179 evutil_socket_t evhttp_bound_socket_get_fd(evhttp_bound_socket* bound_socket); 180 181 /** 182 * Free the previously created HTTP server. 183 * 184 * Works only if no requests are currently being served. 185 * 186 * @param http the evhttp server object to be freed 187 * @see evhttp_start() 188 */ 189 void evhttp_free(evhttp* http); 190 191 /** XXX Document. */ 192 void evhttp_set_max_headers_size(evhttp* http, ev_ssize_t max_headers_size); 193 /** XXX Document. */ 194 void evhttp_set_max_body_size(evhttp* http, ev_ssize_t max_body_size); 195 196 /** 197 Sets the what HTTP methods are supported in requests accepted by this 198 server, and passed to user callbacks. 199 200 If not supported they will generate a "405 Method not allowed" response. 201 202 By default this includes the following methods: GET, POST, HEAD, PUT, DELETE 203 204 @param http the http server on which to set the methods 205 @param methods bit mask constructed from evhttp_cmd_type values 206 */ 207 void evhttp_set_allowed_methods(evhttp* http, ev_uint16_t methods); 208 209 /** 210 Set a callback for a specified URI 211 212 @param http the http sever on which to set the callback 213 @param path the path for which to invoke the callback 214 @param cb the callback function that gets invoked on requesting path 215 @param cb_arg an additional context argument for the callback 216 @return 0 on success, -1 if the callback existed already, -2 on failure 217 */ 218 int evhttp_set_cb(evhttp* http, const(char)* path, 219 ExternC!(void function(evhttp_request*, void*)) cb, void* cb_arg); 220 221 /** Removes the callback for a specified URI */ 222 int evhttp_del_cb(evhttp*, const(char)*); 223 224 /** 225 Set a callback for all requests that are not caught by specific callbacks 226 227 Invokes the specified callback for all requests that do not match any of 228 the previously specified request paths. This is catchall for requests not 229 specifically configured with evhttp_set_cb(). 230 231 @param http the evhttp server object for which to set the callback 232 @param cb the callback to invoke for any unmatched requests 233 @param arg an context argument for the callback 234 */ 235 void evhttp_set_gencb(evhttp* http, 236 ExternC!(void function(evhttp_request*, void*)) cb, void* arg); 237 238 /** 239 Adds a virtual host to the http server. 240 241 A virtual host is a newly initialized evhttp object that has request 242 callbacks set on it via evhttp_set_cb() or evhttp_set_gencb(). It 243 most not have any listing sockets associated with it. 244 245 If the virtual host has not been removed by the time that evhttp_free() 246 is called on the main http server, it will be automatically freed, too. 247 248 It is possible to have hierarchical vhosts. For example: A vhost 249 with the pattern* .example.com may have other vhosts with patterns 250 foo.example.com and bar.example.com associated with it. 251 252 @param http the evhttp object to which to add a virtual host 253 @param pattern the glob pattern against which the hostname is matched. 254 The match is case insensitive and follows otherwise regular shell 255 matching. 256 @param vhost the virtual host to add the regular http server. 257 @return 0 on success, -1 on failure 258 @see evhttp_remove_virtual_host() 259 */ 260 int evhttp_add_virtual_host(evhttp* http, const(char)* pattern, 261 evhttp* vhost); 262 263 /** 264 Removes a virtual host from the http server. 265 266 @param http the evhttp object from which to remove the virtual host 267 @param vhost the virtual host to remove from the regular http server. 268 @return 0 on success, -1 on failure 269 @see evhttp_add_virtual_host() 270 */ 271 int evhttp_remove_virtual_host(evhttp* http, evhttp* vhost); 272 273 /** 274 Add a server alias to an http object. The http object can be a virtual 275 host or the main server. 276 277 @param http the evhttp object 278 @param alias the alias to add 279 @see evhttp_add_remove_alias() 280 */ 281 int evhttp_add_server_alias(evhttp* http, const(char)* alias_); 282 283 /** 284 Remove a server alias from an http object. 285 286 @param http the evhttp object 287 @param alias the alias to remove 288 @see evhttp_add_server_alias() 289 */ 290 int evhttp_remove_server_alias(evhttp* http, const(char)* alias_); 291 292 /** 293 * Set the timeout for an HTTP request. 294 * 295 * @param http an evhttp object 296 * @param timeout_in_secs the timeout, in seconds 297 */ 298 void evhttp_set_timeout(evhttp* http, int timeout_in_secs); 299 300 /* Request/Response functionality */ 301 302 /** 303 * Send an HTML error message to the client. 304 * 305 * @param req a request object 306 * @param error the HTTP error code 307 * @param reason a brief explanation of the error. If this is NULL, we'll 308 * just use the standard meaning of the error code. 309 */ 310 void evhttp_send_error(evhttp_request* req, int error, 311 const(char)* reason); 312 313 /** 314 * Send an HTML reply to the client. 315 * 316 * The body of the reply consists of the data in databuf. After calling 317 * evhttp_send_reply() databuf will be empty, but the buffer is still 318 * owned by the caller and needs to be deallocated by the caller if 319 * necessary. 320 * 321 * @param req a request object 322 * @param code the HTTP response code to send 323 * @param reason a brief message to send with the response code 324 * @param databuf the body of the response 325 */ 326 void evhttp_send_reply(evhttp_request* req, int code, 327 const(char)* reason, evbuffer* databuf); 328 329 /* Low-level response interface, for streaming/chunked replies */ 330 331 /** 332 Initiate a reply that uses Transfer-Encoding chunked. 333 334 This allows the caller to stream the reply back to the client and is 335 useful when either not all of the reply data is immediately available 336 or when sending very large replies. 337 338 The caller needs to supply data chunks with evhttp_send_reply_chunk() 339 and complete the reply by calling evhttp_send_reply_end(). 340 341 @param req a request object 342 @param code the HTTP response code to send 343 @param reason a brief message to send with the response code 344 */ 345 void evhttp_send_reply_start(evhttp_request* req, int code, 346 const(char)* reason); 347 348 /** 349 Send another data chunk as part of an ongoing chunked reply. 350 351 The reply chunk consists of the data in databuf. After calling 352 evhttp_send_reply_chunk() databuf will be empty, but the buffer is 353 still owned by the caller and needs to be deallocated by the caller 354 if necessary. 355 356 @param req a request object 357 @param databuf the data chunk to send as part of the reply. 358 */ 359 void evhttp_send_reply_chunk(evhttp_request* req, 360 evbuffer* databuf); 361 /** 362 Complete a chunked reply, freeing the request as appropriate. 363 364 @param req a request object 365 */ 366 void evhttp_send_reply_end(evhttp_request* req); 367 368 /* 369 * Interfaces for making requests 370 */ 371 372 /** The different request types supported by evhttp. These are as specified 373 * in RFC2616, except for PATCH which is specified by RFC5789. 374 * 375 * By default, only some of these methods are accepted and passed to user 376 * callbacks; use evhttp_set_allowed_methods() to change which methods 377 * are allowed. 378 */ 379 enum evhttp_cmd_type { 380 EVHTTP_REQ_GET = 1 << 0, 381 EVHTTP_REQ_POST = 1 << 1, 382 EVHTTP_REQ_HEAD = 1 << 2, 383 EVHTTP_REQ_PUT = 1 << 3, 384 EVHTTP_REQ_DELETE = 1 << 4, 385 EVHTTP_REQ_OPTIONS = 1 << 5, 386 EVHTTP_REQ_TRACE = 1 << 6, 387 EVHTTP_REQ_CONNECT = 1 << 7, 388 EVHTTP_REQ_PATCH = 1 << 8 389 }; 390 391 /** a request object can represent either a request or a reply */ 392 enum evhttp_request_kind { EVHTTP_REQUEST, EVHTTP_RESPONSE }; 393 394 /** 395 * Creates a new request object that needs to be filled in with the request 396 * parameters. The callback is executed when the request completed or an 397 * error occurred. 398 */ 399 evhttp_request* evhttp_request_new( 400 ExternC!(void function(evhttp_request*, void*)) cb, void* arg); 401 402 /** 403 * Enable delivery of chunks to requestor. 404 * @param cb will be called after every read of data with the same argument 405 * as the completion callback. Will never be called on an empty 406 * response. May drain the input buffer; it will be drained 407 * automatically on return. 408 */ 409 void evhttp_request_set_chunked_cb(evhttp_request*, 410 ExternC!(void function(evhttp_request*, void*)) cb); 411 412 /** Frees the request object and removes associated events. */ 413 void evhttp_request_free(evhttp_request* req); 414 415 struct evdns_base; 416 struct evhttp_connection; 417 418 /** 419 * A connection object that can be used to for making HTTP requests. The 420 * connection object tries to resolve address and establish the connection 421 * when it is given an http request object. 422 * 423 * @param base the event_base to use for handling the connection 424 * @param dnsbase the dns_base to use for resolving host names; if not 425 * specified host name resolution will block. 426 * @param address the address to which to connect 427 * @param port the port to connect to 428 * @return an evhttp_connection object that can be used for making requests 429 */ 430 evhttp_connection* evhttp_connection_base_new( 431 event_base* base, evdns_base* dnsbase, 432 const(char)* address, ushort port); 433 434 /** Takes ownership of the request object 435 * 436 * Can be used in a request callback to keep onto the request until 437 * evhttp_request_free() is explicitly called by the user. 438 */ 439 void evhttp_request_own(evhttp_request* req); 440 441 /** Returns 1 if the request is owned by the user */ 442 int evhttp_request_is_owned(evhttp_request* req); 443 444 /** 445 * Returns the connection object associated with the request or NULL 446 * 447 * The user needs to either free the request explicitly or call 448 * evhttp_send_reply_end(). 449 */ 450 evhttp_connection* evhttp_request_get_connection(evhttp_request* req); 451 452 /** 453 * Returns the underlying event_base for this connection 454 */ 455 event_base* evhttp_connection_get_base(evhttp_connection* req); 456 457 void evhttp_connection_set_max_headers_size(evhttp_connection* evcon, 458 ev_ssize_t new_max_headers_size); 459 460 void evhttp_connection_set_max_body_size(evhttp_connection* evcon, 461 ev_ssize_t new_max_body_size); 462 463 /** Frees an http connection */ 464 void evhttp_connection_free(evhttp_connection* evcon); 465 466 /** sets the ip address from which http connections are made */ 467 void evhttp_connection_set_local_address(evhttp_connection* evcon, 468 const(char)* address); 469 470 /** sets the local port from which http connections are made */ 471 void evhttp_connection_set_local_port(evhttp_connection* evcon, 472 ev_uint16_t port); 473 474 /** Sets the timeout for events related to this connection */ 475 void evhttp_connection_set_timeout(evhttp_connection* evcon, 476 int timeout_in_secs); 477 478 /** Sets the retry limit for this connection - -1 repeats indefinitely */ 479 void evhttp_connection_set_retries(evhttp_connection* evcon, 480 int retry_max); 481 482 /** Set a callback for connection close. */ 483 void evhttp_connection_set_closecb(evhttp_connection* evcon, 484 ExternC!(void function(evhttp_connection*, void*)) , void*); 485 486 /** Get the remote address and port associated with this connection. */ 487 void evhttp_connection_get_peer(evhttp_connection* evcon, 488 char* *address, ev_uint16_t* port); 489 490 /** 491 Make an HTTP request over the specified connection. 492 493 The connection gets ownership of the request. On failure, the 494 request object is no longer valid as it has been freed. 495 496 @param evcon the evhttp_connection object over which to send the request 497 @param req the previously created and configured request object 498 @param type the request type EVHTTP_REQ_GET, EVHTTP_REQ_POST, etc. 499 @param uri the URI associated with the request 500 @return 0 on success, -1 on failure 501 @see evhttp_cancel_request() 502 */ 503 int evhttp_make_request(evhttp_connection* evcon, 504 evhttp_request* req, 505 evhttp_cmd_type type, const(char)* uri); 506 507 /** 508 Cancels a pending HTTP request. 509 510 Cancels an ongoing HTTP request. The callback associated with this request 511 is not executed and the request object is freed. If the request is 512 currently being processed, e.g. it is ongoing, the corresponding 513 evhttp_connection object is going to get reset. 514 515 A request cannot be canceled if its callback has executed already. A request 516 may be canceled reentrantly from its chunked callback. 517 518 @param req the evhttp_request to cancel; req becomes invalid after this call. 519 */ 520 void evhttp_cancel_request(evhttp_request* req); 521 522 /** 523 * A structure to hold a parsed URI or Relative-Ref conforming to RFC3986. 524 */ 525 struct evhttp_uri; 526 527 /** Returns the request URI */ 528 const(char)* evhttp_request_get_uri(const(evhttp_request)* req); 529 /** Returns the request URI (parsed) */ 530 const(evhttp_uri)* evhttp_request_get_evhttp_uri(const(evhttp_request)* req); 531 /** Returns the request command */ 532 evhttp_cmd_type evhttp_request_get_command(const(evhttp_request)* req); 533 534 int evhttp_request_get_response_code(const(evhttp_request)* req); 535 536 /** Returns the input headers */ 537 evkeyvalq* evhttp_request_get_input_headers(evhttp_request* req); 538 /** Returns the output headers */ 539 evkeyvalq* evhttp_request_get_output_headers(evhttp_request* req); 540 /** Returns the input buffer */ 541 evbuffer* evhttp_request_get_input_buffer(evhttp_request* req); 542 /** Returns the output buffer */ 543 evbuffer* evhttp_request_get_output_buffer(evhttp_request* req); 544 /** Returns the host associated with the request. If a client sends an absolute 545 URI, the host part of that is preferred. Otherwise, the input headers are 546 searched for a Host: header. NULL is returned if no absolute URI or Host: 547 header is provided. */ 548 const(char)* evhttp_request_get_host(evhttp_request* req); 549 550 /* Interfaces for dealing with HTTP headers */ 551 552 /** 553 Finds the value belonging to a header. 554 555 @param headers the evkeyvalq object in which to find the header 556 @param key the name of the header to find 557 @returns a pointer to the value for the header or NULL if the header 558 count not be found. 559 @see evhttp_add_header(), evhttp_remove_header() 560 */ 561 const(char)* evhttp_find_header(const(evkeyvalq)* headers, 562 const(char)* key); 563 564 /** 565 Removes a header from a list of existing headers. 566 567 @param headers the evkeyvalq object from which to remove a header 568 @param key the name of the header to remove 569 @returns 0 if the header was removed, -1 otherwise. 570 @see evhttp_find_header(), evhttp_add_header() 571 */ 572 int evhttp_remove_header(evkeyvalq* headers, const(char)* key); 573 574 /** 575 Adds a header to a list of existing headers. 576 577 @param headers the evkeyvalq object to which to add a header 578 @param key the name of the header 579 @param value the value belonging to the header 580 @returns 0 on success, -1 otherwise. 581 @see evhttp_find_header(), evhttp_clear_headers() 582 */ 583 int evhttp_add_header(evkeyvalq* headers, const(char)* key, const(char)* value); 584 585 /** 586 Removes all headers from the header list. 587 588 @param headers the evkeyvalq object from which to remove all headers 589 */ 590 void evhttp_clear_headers(evkeyvalq* headers); 591 592 /* Miscellaneous utility functions */ 593 594 595 /** 596 Helper function to encode a string for inclusion in a URI. All 597 characters are replaced by their hex-escaped (%22) equivalents, 598 except for characters explicitly unreserved by RFC3986 -- that is, 599 ASCII alphanumeric characters, hyphen, dot, underscore, and tilde. 600 601 The returned string must be freed by the caller. 602 603 @param str an unencoded string 604 @return a newly allocated URI-encoded string or NULL on failure 605 */ 606 char* evhttp_encode_uri(const(char)* str); 607 608 /** 609 As evhttp_encode_uri, but if 'size' is nonnegative, treat the string 610 as being 'size' bytes long. This allows you to encode strings that 611 may contain 0-valued bytes. 612 613 The returned string must be freed by the caller. 614 615 @param str an unencoded string 616 @param size the length of the string to encode, or -1 if the string 617 is NUL-terminated 618 @param space_to_plus if true, space characters in 'str' are encoded 619 as +, not %20. 620 @return a newly allocate URI-encoded string, or NULL on failure. 621 */ 622 char* evhttp_uriencode(const(char)* str, ev_ssize_t size, int space_to_plus); 623 624 /** 625 Helper function to sort of decode a URI-encoded string. Unlike 626 evhttp_get_decoded_uri, it decodes all plus characters that appear 627 _after_ the first question mark character, but no plusses that occur 628 before. This is not a good way to decode URIs in whole or in part. 629 630 The returned string must be freed by the caller 631 632 @deprecated This function is deprecated; you probably want to use 633 evhttp_get_decoded_uri instead. 634 635 @param uri an encoded URI 636 @return a newly allocated unencoded URI or NULL on failure 637 */ 638 char* evhttp_decode_uri(const(char)* uri); 639 640 /** 641 Helper function to decode a URI-escaped string or HTTP parameter. 642 643 If 'decode_plus' is 1, then we decode the string as an HTTP parameter 644 value, and convert all plus ('+') characters to spaces. If 645 'decode_plus' is 0, we leave all plus characters unchanged. 646 647 The returned string must be freed by the caller. 648 649 @param uri a URI-encode encoded URI 650 @param decode_plus determines whether we convert '+' to sapce. 651 @param size_out if size_out is not NULL, *size_out is set to the size of the 652 returned string 653 @return a newly allocated unencoded URI or NULL on failure 654 */ 655 char* evhttp_uridecode(const(char)* uri, int decode_plus, 656 size_t* size_out); 657 658 /** 659 Helper function to parse out arguments in a query. 660 661 Parsing a URI like 662 663 http://foo.com/?q=test&s=some+thing 664 665 will result in two entries in the key value queue. 666 667 The first entry is: key="q", value="test" 668 The second entry is: key="s", value="some thing" 669 670 @deprecated This function is deprecated as of Libevent 2.0.9. Use 671 evhttp_uri_parse and evhttp_parse_query_str instead. 672 673 @param uri the request URI 674 @param headers the head of the evkeyval queue 675 @return 0 on success, -1 on failure 676 */ 677 int evhttp_parse_query(const(char)* uri, evkeyvalq* headers); 678 679 /** 680 Helper function to parse out arguments from the query portion of an 681 HTTP URI. 682 683 Parsing a query string like 684 685 q=test&s=some+thing 686 687 will result in two entries in the key value queue. 688 689 The first entry is: key="q", value="test" 690 The second entry is: key="s", value="some thing" 691 692 @param query_parse the query portion of the URI 693 @param headers the head of the evkeyval queue 694 @return 0 on success, -1 on failure 695 */ 696 int evhttp_parse_query_str(const(char)* uri, evkeyvalq* headers); 697 698 /** 699 * Escape HTML character entities in a string. 700 * 701 * Replaces <, >, ", ' and & with <, >, ", 702 * ' and & correspondingly. 703 * 704 * The returned string needs to be freed by the caller. 705 * 706 * @param html an unescaped HTML string 707 * @return an escaped HTML string or NULL on error 708 */ 709 char* evhttp_htmlescape(const(char)* html); 710 711 /** 712 * Return a new empty evhttp_uri with no fields set. 713 */ 714 evhttp_uri* evhttp_uri_new(); 715 716 /** 717 * Changes the flags set on a given URI. See EVHTTP_URI_* for 718 * a list of flags. 719 **/ 720 void evhttp_uri_set_flags(evhttp_uri* uri, uint flags); 721 722 /** Return the scheme of an evhttp_uri, or NULL if there is no scheme has 723 * been set and the evhttp_uri contains a Relative-Ref. */ 724 const(char)* evhttp_uri_get_scheme(const(evhttp_uri)* uri); 725 /** 726 * Return the userinfo part of an evhttp_uri, or NULL if it has no userinfo 727 * set. 728 */ 729 const(char)* evhttp_uri_get_userinfo(const(evhttp_uri)* uri); 730 /** 731 * Return the host part of an evhttp_uri, or NULL if it has no host set. 732 * The host may either be a regular hostname (conforming to the RFC 3986 733 * "regname" production), or an IPv4 address, or the empty string, or a 734 * bracketed IPv6 address, or a bracketed 'IP-Future' address. 735 * 736 * Note that having a NULL host means that the URI has no authority 737 * section, but having an empty-string host means that the URI has an 738 * authority section with no host part. For example, 739 * "mailto:user@example.com" has a host of NULL, but "file:///etc/motd" 740 * has a host of "". 741 */ 742 const(char)* evhttp_uri_get_host(const(evhttp_uri)* uri); 743 /** Return the port part of an evhttp_uri, or -1 if there is no port set. */ 744 int evhttp_uri_get_port(const(evhttp_uri)* uri); 745 /** Return the path part of an evhttp_uri, or NULL if it has no path set */ 746 const(char)* evhttp_uri_get_path(const(evhttp_uri)* uri); 747 /** Return the query part of an evhttp_uri (excluding the leading "?"), or 748 * NULL if it has no query set */ 749 const(char)* evhttp_uri_get_query(const(evhttp_uri)* uri); 750 /** Return the fragment part of an evhttp_uri (excluding the leading "#"), 751 * or NULL if it has no fragment set */ 752 const(char)* evhttp_uri_get_fragment(const(evhttp_uri)* uri); 753 754 /** Set the scheme of an evhttp_uri, or clear the scheme if scheme==NULL. 755 * Returns 0 on success, -1 if scheme is not well-formed. */ 756 int evhttp_uri_set_scheme(evhttp_uri* uri, const(char)* scheme); 757 /** Set the userinfo of an evhttp_uri, or clear the userinfo if userinfo==NULL. 758 * Returns 0 on success, -1 if userinfo is not well-formed. */ 759 int evhttp_uri_set_userinfo(evhttp_uri* uri, const(char)* userinfo); 760 /** Set the host of an evhttp_uri, or clear the host if host==NULL. 761 * Returns 0 on success, -1 if host is not well-formed. */ 762 int evhttp_uri_set_host(evhttp_uri* uri, const(char)* host); 763 /** Set the port of an evhttp_uri, or clear the port if port==-1. 764 * Returns 0 on success, -1 if port is not well-formed. */ 765 int evhttp_uri_set_port(evhttp_uri* uri, int port); 766 /** Set the path of an evhttp_uri, or clear the path if path==NULL. 767 * Returns 0 on success, -1 if path is not well-formed. */ 768 int evhttp_uri_set_path(evhttp_uri* uri, const(char)* path); 769 /** Set the query of an evhttp_uri, or clear the query if query==NULL. 770 * The query should not include a leading "?". 771 * Returns 0 on success, -1 if query is not well-formed. */ 772 int evhttp_uri_set_query(evhttp_uri* uri, const(char)* query); 773 /** Set the fragment of an evhttp_uri, or clear the fragment if fragment==NULL. 774 * The fragment should not include a leading "#". 775 * Returns 0 on success, -1 if fragment is not well-formed. */ 776 int evhttp_uri_set_fragment(evhttp_uri* uri, const(char)* fragment); 777 778 /** 779 * Helper function to parse a URI-Reference as specified by RFC3986. 780 * 781 * This function matches the URI-Reference production from RFC3986, 782 * which includes both URIs like 783 * 784 * scheme://[[userinfo]@]foo.com[:port]]/[path][?query][#fragment] 785 * 786 * and relative-refs like 787 * 788 * [path][?query][#fragment] 789 * 790 * Any optional elements portions not present in the original URI are 791 * left set to NULL in the resulting evhttp_uri. If no port is 792 * specified, the port is set to -1. 793 * 794 * Note that no decoding is performed on percent-escaped characters in 795 * the string; if you want to parse them, use evhttp_uridecode or 796 * evhttp_parse_query_str as appropriate. 797 * 798 * Note also that most URI schemes will have additional constraints that 799 * this function does not know about, and cannot check. For example, 800 * mailto://www.example.com/cgi-bin/fortune.pl is not a reasonable 801 * mailto url, http://www.example.com:99999/ is not a reasonable HTTP 802 * URL, and ftp:username@example.com is not a reasonable FTP URL. 803 * Nevertheless, all of these URLs conform to RFC3986, and this function 804 * accepts all of them as valid. 805 * 806 * @param source_uri the request URI 807 * @param flags Zero or more EVHTTP_URI_* flags to affect the behavior 808 * of the parser. 809 * @return uri container to hold parsed data, or NULL if there is error 810 * @see evhttp_uri_free() 811 */ 812 evhttp_uri* evhttp_uri_parse_with_flags(const(char)* source_uri, 813 uint flags); 814 815 /** Tolerate URIs that do not conform to RFC3986. 816 * 817 * Unfortunately, some HTTP clients generate URIs that, according to RFC3986, 818 * are not conformant URIs. If you need to support these URIs, you can 819 * do so by passing this flag to evhttp_uri_parse_with_flags. 820 * 821 * Currently, these changes are: 822 * <ul> 823 * <li> Nonconformant URIs are allowed to contain otherwise unreasonable 824 * characters in their path, query, and fragment components. 825 * </ul> 826 */ 827 enum EVHTTP_URI_NONCONFORMANT = 0x01; 828 829 /** Alias for evhttp_uri_parse_with_flags(source_uri, 0) */ 830 evhttp_uri* evhttp_uri_parse(const(char)* source_uri); 831 832 /** 833 * Free all memory allocated for a parsed uri. Only use this for URIs 834 * generated by evhttp_uri_parse. 835 * 836 * @param uri container with parsed data 837 * @see evhttp_uri_parse() 838 */ 839 void evhttp_uri_free(evhttp_uri* uri); 840 841 /** 842 * Join together the uri parts from parsed data to form a URI-Reference. 843 * 844 * Note that no escaping of reserved characters is done on the members 845 * of the evhttp_uri, so the generated string might not be a valid URI 846 * unless the members of evhttp_uri are themselves valid. 847 * 848 * @param uri container with parsed data 849 * @param buf destination buffer 850 * @param limit destination buffer size 851 * @return an joined uri as string or NULL on error 852 * @see evhttp_uri_parse() 853 */ 854 char* evhttp_uri_join(evhttp_uri* uri, char* buf, size_t limit);