Annotation of win32/apache22/include/http_protocol.h, revision 1.1

1.1     ! moko        1: /* Licensed to the Apache Software Foundation (ASF) under one or more
        !             2:  * contributor license agreements.  See the NOTICE file distributed with
        !             3:  * this work for additional information regarding copyright ownership.
        !             4:  * The ASF licenses this file to You under the Apache License, Version 2.0
        !             5:  * (the "License"); you may not use this file except in compliance with
        !             6:  * the License.  You may obtain a copy of the License at
        !             7:  *
        !             8:  *     http://www.apache.org/licenses/LICENSE-2.0
        !             9:  *
        !            10:  * Unless required by applicable law or agreed to in writing, software
        !            11:  * distributed under the License is distributed on an "AS IS" BASIS,
        !            12:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        !            13:  * See the License for the specific language governing permissions and
        !            14:  * limitations under the License.
        !            15:  */
        !            16: 
        !            17: /**
        !            18:  * @file  http_protocol.h
        !            19:  * @brief HTTP protocol handling
        !            20:  *
        !            21:  * @defgroup APACHE_CORE_PROTO HTTP Protocol Handling
        !            22:  * @ingroup  APACHE_CORE
        !            23:  * @{
        !            24:  */
        !            25: 
        !            26: #ifndef APACHE_HTTP_PROTOCOL_H
        !            27: #define APACHE_HTTP_PROTOCOL_H
        !            28: 
        !            29: #include "httpd.h"
        !            30: #include "apr_hooks.h"
        !            31: #include "apr_portable.h"
        !            32: #include "apr_mmap.h"
        !            33: #include "apr_buckets.h"
        !            34: #include "util_filter.h"
        !            35: 
        !            36: #ifdef __cplusplus
        !            37: extern "C" {
        !            38: #endif
        !            39: 
        !            40: /**
        !            41:  * This hook allows modules to insert filters for the current error response
        !            42:  * @param r the current request
        !            43:  * @ingroup hooks
        !            44:  */
        !            45: AP_DECLARE_HOOK(void,insert_error_filter,(request_rec *r))
        !            46: 
        !            47: /** This is an optimization.  We keep a record of the filter_rec that
        !            48:  * stores the old_write filter, so that we can avoid strcmp's later.
        !            49:  */
        !            50: AP_DECLARE_DATA extern ap_filter_rec_t *ap_old_write_func;
        !            51: 
        !            52: /*
        !            53:  * Prototypes for routines which either talk directly back to the user,
        !            54:  * or control the ones that eventually do.
        !            55:  */
        !            56: 
        !            57: /**
        !            58:  * Read a request and fill in the fields.
        !            59:  * @param c The current connection
        !            60:  * @return The new request_rec
        !            61:  */ 
        !            62: request_rec *ap_read_request(conn_rec *c);
        !            63: 
        !            64: /**
        !            65:  * Read the mime-encoded headers.
        !            66:  * @param r The current request
        !            67:  */
        !            68: AP_DECLARE(void) ap_get_mime_headers(request_rec *r);
        !            69: 
        !            70: /**
        !            71:  * Optimized version of ap_get_mime_headers() that requires a
        !            72:  * temporary brigade to work with
        !            73:  * @param r The current request
        !            74:  * @param bb temp brigade
        !            75:  */
        !            76: AP_DECLARE(void) ap_get_mime_headers_core(request_rec *r,
        !            77:                                           apr_bucket_brigade *bb);
        !            78: 
        !            79: /* Finish up stuff after a request */
        !            80: 
        !            81: /**
        !            82:  * Called at completion of sending the response.  It sends the terminating
        !            83:  * protocol information.
        !            84:  * @param r The current request
        !            85:  */
        !            86: AP_DECLARE(void) ap_finalize_request_protocol(request_rec *r);
        !            87: 
        !            88: /**
        !            89:  * Send error back to client.
        !            90:  * @param r The current request
        !            91:  * @param recursive_error last arg indicates error status in case we get 
        !            92:  *      an error in the process of trying to deal with an ErrorDocument 
        !            93:  *      to handle some other error.  In that case, we print the default 
        !            94:  *      report for the first thing that went wrong, and more briefly report 
        !            95:  *      on the problem with the ErrorDocument.
        !            96:  */
        !            97: AP_DECLARE(void) ap_send_error_response(request_rec *r, int recursive_error);
        !            98: 
        !            99: /* Set last modified header line from the lastmod date of the associated file.
        !           100:  * Also, set content length.
        !           101:  *
        !           102:  * May return an error status, typically HTTP_NOT_MODIFIED (that when the
        !           103:  * permit_cache argument is set to one).
        !           104:  */
        !           105: 
        !           106: /**
        !           107:  * Set the content length for this request
        !           108:  * @param r The current request
        !           109:  * @param length The new content length
        !           110:  */
        !           111: AP_DECLARE(void) ap_set_content_length(request_rec *r, apr_off_t length);
        !           112: 
        !           113: /**
        !           114:  * Set the keepalive status for this request
        !           115:  * @param r The current request
        !           116:  * @return 1 if keepalive can be set, 0 otherwise
        !           117:  */
        !           118: AP_DECLARE(int) ap_set_keepalive(request_rec *r);
        !           119: 
        !           120: /**
        !           121:  * Return the latest rational time from a request/mtime pair.  Mtime is 
        !           122:  * returned unless it's in the future, in which case we return the current time.
        !           123:  * @param r The current request
        !           124:  * @param mtime The last modified time
        !           125:  * @return the latest rational time.
        !           126:  */
        !           127: AP_DECLARE(apr_time_t) ap_rationalize_mtime(request_rec *r, apr_time_t mtime);
        !           128: 
        !           129: /**
        !           130:  * Build the content-type that should be sent to the client from the
        !           131:  * content-type specified.  The following rules are followed:
        !           132:  *    - if type is NULL, type is set to ap_default_type(r)
        !           133:  *    - if charset adding is disabled, stop processing and return type.
        !           134:  *    - then, if there are no parameters on type, add the default charset
        !           135:  *    - return type
        !           136:  * @param r The current request
        !           137:  * @param type The content type
        !           138:  * @return The content-type
        !           139:  */ 
        !           140: AP_DECLARE(const char *) ap_make_content_type(request_rec *r,
        !           141:                                               const char *type);
        !           142: 
        !           143: #ifdef CORE_PRIVATE
        !           144: /**
        !           145:  * Precompile metadata structures used by ap_make_content_type()
        !           146:  * @param pool The pool to use for allocations
        !           147:  */
        !           148: AP_DECLARE(void) ap_setup_make_content_type(apr_pool_t *pool);
        !           149: #endif /* CORE_PRIVATE */
        !           150: 
        !           151: /**
        !           152:  * Construct an entity tag from the resource information.  If it's a real
        !           153:  * file, build in some of the file characteristics.
        !           154:  * @param r The current request
        !           155:  * @param force_weak Force the entity tag to be weak - it could be modified
        !           156:  *                   again in as short an interval.
        !           157:  * @return The entity tag
        !           158:  */ 
        !           159: AP_DECLARE(char *) ap_make_etag(request_rec *r, int force_weak);
        !           160: 
        !           161: /**
        !           162:  * Set the E-tag outgoing header
        !           163:  * @param r The current request
        !           164:  */
        !           165: AP_DECLARE(void) ap_set_etag(request_rec *r);
        !           166: 
        !           167: /**
        !           168:  * Set the last modified time for the file being sent
        !           169:  * @param r The current request
        !           170:  */
        !           171: AP_DECLARE(void) ap_set_last_modified(request_rec *r);
        !           172: 
        !           173: /**
        !           174:  * Implements condition GET rules for HTTP/1.1 specification.  This function
        !           175:  * inspects the client headers and determines if the response fulfills 
        !           176:  * the requirements specified.
        !           177:  * @param r The current request
        !           178:  * @return OK if the response fulfills the condition GET rules, some
        !           179:  *         other status code otherwise
        !           180:  */
        !           181: AP_DECLARE(int) ap_meets_conditions(request_rec *r);
        !           182: 
        !           183: /* Other ways to send stuff at the client.  All of these keep track
        !           184:  * of bytes_sent automatically.  This indirection is intended to make
        !           185:  * it a little more painless to slide things like HTTP-NG packetization
        !           186:  * underneath the main body of the code later.  In the meantime, it lets
        !           187:  * us centralize a bit of accounting (bytes_sent).
        !           188:  *
        !           189:  * These also return the number of bytes written by the call.
        !           190:  * They should only be called with a timeout registered, for obvious reaasons.
        !           191:  * (Ditto the send_header stuff).
        !           192:  */
        !           193: 
        !           194: /**
        !           195:  * Send an entire file to the client, using sendfile if supported by the 
        !           196:  * current platform
        !           197:  * @param fd The file to send.
        !           198:  * @param r The current request
        !           199:  * @param offset Offset into the file to start sending.
        !           200:  * @param length Amount of data to send
        !           201:  * @param nbytes Amount of data actually sent
        !           202:  */
        !           203: AP_DECLARE(apr_status_t) ap_send_fd(apr_file_t *fd, request_rec *r, apr_off_t offset, 
        !           204:                                    apr_size_t length, apr_size_t *nbytes);
        !           205: 
        !           206: #if APR_HAS_MMAP
        !           207: /**
        !           208:  * Send an MMAP'ed file to the client
        !           209:  * @param mm The MMAP'ed file to send
        !           210:  * @param r The current request
        !           211:  * @param offset The offset into the MMAP to start sending
        !           212:  * @param length The amount of data to send
        !           213:  * @return The number of bytes sent
        !           214:  */
        !           215: AP_DECLARE(size_t) ap_send_mmap(apr_mmap_t *mm, request_rec *r, size_t offset,
        !           216:                              size_t length);
        !           217: #endif
        !           218: 
        !           219: 
        !           220: /**
        !           221:  * Register a new request method, and return the offset that will be
        !           222:  * associated with that method.
        !           223:  *
        !           224:  * @param p        The pool to create registered method numbers from.
        !           225:  * @param methname The name of the new method to register.
        !           226:  * @return         Ab int value representing an offset into a bitmask.
        !           227:  */
        !           228: AP_DECLARE(int) ap_method_register(apr_pool_t *p, const char *methname);
        !           229: 
        !           230: /**
        !           231:  * Initialize the method_registry and allocate memory for it.
        !           232:  *
        !           233:  * @param p Pool to allocate memory for the registry from.
        !           234:  */
        !           235: AP_DECLARE(void) ap_method_registry_init(apr_pool_t *p);
        !           236: 
        !           237: /**
        !           238:  * This is a convenience macro to ease with checking a mask
        !           239:  * against a method name.
        !           240:  */
        !           241: #define AP_METHOD_CHECK_ALLOWED(mask, methname) \
        !           242:     ((mask) & (AP_METHOD_BIT << ap_method_number_of((methname))))
        !           243: 
        !           244: /**
        !           245:  * Create a new method list with the specified number of preallocated
        !           246:  * slots for extension methods.
        !           247:  *
        !           248:  * @param   p       Pointer to a pool in which the structure should be
        !           249:  *                  allocated.
        !           250:  * @param   nelts   Number of preallocated extension slots
        !           251:  * @return  Pointer to the newly created structure.
        !           252:  */
        !           253: AP_DECLARE(ap_method_list_t *) ap_make_method_list(apr_pool_t *p, int nelts);
        !           254: 
        !           255: 
        !           256: /**
        !           257:  * Copy a method list
        !           258:  *
        !           259:  * @param   dest List to copy to
        !           260:  * @param   src  List to copy from
        !           261:  */
        !           262: AP_DECLARE(void) ap_copy_method_list(ap_method_list_t *dest,
        !           263:                                     ap_method_list_t *src);
        !           264: 
        !           265: /**
        !           266:  * Search for an HTTP method name in an ap_method_list_t structure, and
        !           267:  * return true if found.
        !           268:  *
        !           269:  * @param   method  String containing the name of the method to check.
        !           270:  * @param   l       Pointer to a method list, such as cmd->methods_limited.
        !           271:  * @return  1 if method is in the list, otherwise 0
        !           272:  */
        !           273: AP_DECLARE(int) ap_method_in_list(ap_method_list_t *l, const char *method);
        !           274: 
        !           275: /**
        !           276:  * Add an HTTP method name to an ap_method_list_t structure if it isn't
        !           277:  * already listed.
        !           278:  *
        !           279:  * @param   method  String containing the name of the method to check.
        !           280:  * @param   l       Pointer to a method list, such as cmd->methods_limited.
        !           281:  * @return  None.
        !           282:  */
        !           283: AP_DECLARE(void) ap_method_list_add(ap_method_list_t *l, const char *method);
        !           284:     
        !           285: /**
        !           286:  * Remove an HTTP method name from an ap_method_list_t structure.
        !           287:  *
        !           288:  * @param   l       Pointer to a method list, such as cmd->methods_limited.
        !           289:  * @param   method  String containing the name of the method to remove.
        !           290:  * @return  None.
        !           291:  */
        !           292: AP_DECLARE(void) ap_method_list_remove(ap_method_list_t *l,
        !           293:                                       const char *method);
        !           294: 
        !           295: /**
        !           296:  * Reset a method list to be completely empty.
        !           297:  *
        !           298:  * @param   l       Pointer to a method list, such as cmd->methods_limited.
        !           299:  * @return  None.
        !           300:  */
        !           301: AP_DECLARE(void) ap_clear_method_list(ap_method_list_t *l);
        !           302:     
        !           303: /**
        !           304:  * Set the content type for this request (r->content_type). 
        !           305:  * @param r The current request
        !           306:  * @param ct The new content type
        !           307:  * @warning This function must be called to set r->content_type in order 
        !           308:  * for the AddOutputFilterByType directive to work correctly.
        !           309:  */
        !           310: AP_DECLARE(void) ap_set_content_type(request_rec *r, const char *ct);
        !           311: 
        !           312: /**
        !           313:  * Set the Accept-Ranges header for this response
        !           314:  * @param r The current request
        !           315:  */
        !           316: AP_DECLARE(void) ap_set_accept_ranges(request_rec *r);
        !           317: 
        !           318: 
        !           319: /* Hmmm... could macrofy these for now, and maybe forever, though the
        !           320:  * definitions of the macros would get a whole lot hairier.
        !           321:  */
        !           322: 
        !           323: /**
        !           324:  * Output one character for this request
        !           325:  * @param c the character to output
        !           326:  * @param r the current request
        !           327:  * @return The number of bytes sent
        !           328:  */
        !           329: AP_DECLARE(int) ap_rputc(int c, request_rec *r);
        !           330: 
        !           331: /**
        !           332:  * Output a string for the current request
        !           333:  * @param str The string to output
        !           334:  * @param r The current request
        !           335:  * @return The number of bytes sent
        !           336:  */
        !           337: AP_DECLARE(int) ap_rputs(const char *str, request_rec *r);
        !           338: 
        !           339: /**
        !           340:  * Write a buffer for the current request
        !           341:  * @param buf The buffer to write
        !           342:  * @param nbyte The number of bytes to send from the buffer
        !           343:  * @param r The current request
        !           344:  * @return The number of bytes sent
        !           345:  */
        !           346: AP_DECLARE(int) ap_rwrite(const void *buf, int nbyte, request_rec *r);
        !           347: 
        !           348: /**
        !           349:  * Write an unspecified number of strings to the request
        !           350:  * @param r The current request
        !           351:  * @param ... The strings to write
        !           352:  * @return The number of bytes sent
        !           353:  */
        !           354: AP_DECLARE_NONSTD(int) ap_rvputs(request_rec *r,...);
        !           355: 
        !           356: /**
        !           357:  * Output data to the client in a printf format
        !           358:  * @param r The current request
        !           359:  * @param fmt The format string
        !           360:  * @param vlist The arguments to use to fill out the format string
        !           361:  * @return The number of bytes sent
        !           362:  */
        !           363: AP_DECLARE(int) ap_vrprintf(request_rec *r, const char *fmt, va_list vlist);
        !           364: 
        !           365: /**
        !           366:  * Output data to the client in a printf format
        !           367:  * @param r The current request
        !           368:  * @param fmt The format string
        !           369:  * @param ... The arguments to use to fill out the format string
        !           370:  * @return The number of bytes sent
        !           371:  */
        !           372: AP_DECLARE_NONSTD(int) ap_rprintf(request_rec *r, const char *fmt,...)
        !           373:                                __attribute__((format(printf,2,3)));
        !           374: 
        !           375: /**
        !           376:  * Flush all of the data for the current request to the client
        !           377:  * @param r The current request
        !           378:  * @return 0 on success, -1 if an error occurred
        !           379:  */
        !           380: AP_DECLARE(int) ap_rflush(request_rec *r);
        !           381: 
        !           382: /**
        !           383:  * Index used in custom_responses array for a specific error code
        !           384:  * (only use outside protocol.c is in getting them configured).
        !           385:  * @param status HTTP status code
        !           386:  * @return The index of the response
        !           387:  */
        !           388: AP_DECLARE(int) ap_index_of_response(int status);
        !           389: 
        !           390: /** 
        !           391:  * Return the Status-Line for a given status code (excluding the
        !           392:  * HTTP-Version field). If an invalid or unknown status code is
        !           393:  * passed, "500 Internal Server Error" will be returned. 
        !           394:  * @param status The HTTP status code
        !           395:  * @return The Status-Line
        !           396:  */
        !           397: AP_DECLARE(const char *) ap_get_status_line(int status);
        !           398: 
        !           399: /* Reading a block of data from the client connection (e.g., POST arg) */
        !           400: 
        !           401: /**
        !           402:  * Setup the client to allow Apache to read the request body.
        !           403:  * @param r The current request
        !           404:  * @param read_policy How the server should interpret a chunked 
        !           405:  *                    transfer-encoding.  One of: <pre>
        !           406:  *    REQUEST_NO_BODY          Send 413 error if message has any body
        !           407:  *    REQUEST_CHUNKED_ERROR    Send 411 error if body without Content-Length
        !           408:  *    REQUEST_CHUNKED_DECHUNK  If chunked, remove the chunks for me.
        !           409:  * </pre>
        !           410:  * @return either OK or an error code
        !           411:  */
        !           412: AP_DECLARE(int) ap_setup_client_block(request_rec *r, int read_policy);
        !           413: 
        !           414: /**
        !           415:  * Determine if the client has sent any data.  This also sends a 
        !           416:  * 100 Continue response to HTTP/1.1 clients, so modules should not be called
        !           417:  * until the module is ready to read content.
        !           418:  * @warning Never call this function more than once.
        !           419:  * @param r The current request
        !           420:  * @return 0 if there is no message to read, 1 otherwise
        !           421:  */
        !           422: AP_DECLARE(int) ap_should_client_block(request_rec *r);
        !           423: 
        !           424: /**
        !           425:  * Call this in a loop.  It will put data into a buffer and return the length
        !           426:  * of the input block
        !           427:  * @param r The current request
        !           428:  * @param buffer The buffer in which to store the data
        !           429:  * @param bufsiz The size of the buffer
        !           430:  * @return Number of bytes inserted into the buffer.  When done reading, 0
        !           431:  *         if EOF, or -1 if there was an error
        !           432:  */
        !           433: AP_DECLARE(long) ap_get_client_block(request_rec *r, char *buffer, apr_size_t bufsiz);
        !           434: 
        !           435: /**
        !           436:  * In HTTP/1.1, any method can have a body.  However, most GET handlers
        !           437:  * wouldn't know what to do with a request body if they received one.
        !           438:  * This helper routine tests for and reads any message body in the request,
        !           439:  * simply discarding whatever it receives.  We need to do this because
        !           440:  * failing to read the request body would cause it to be interpreted
        !           441:  * as the next request on a persistent connection.
        !           442:  * @param r The current request
        !           443:  * @return error status if request is malformed, OK otherwise 
        !           444:  */
        !           445: AP_DECLARE(int) ap_discard_request_body(request_rec *r);
        !           446: 
        !           447: /**
        !           448:  * Setup the output headers so that the client knows how to authenticate
        !           449:  * itself the next time, if an authentication request failed.  This function
        !           450:  * works for both basic and digest authentication
        !           451:  * @param r The current request
        !           452:  */ 
        !           453: AP_DECLARE(void) ap_note_auth_failure(request_rec *r);
        !           454: 
        !           455: /**
        !           456:  * Setup the output headers so that the client knows how to authenticate
        !           457:  * itself the next time, if an authentication request failed.  This function
        !           458:  * works only for basic authentication
        !           459:  * @param r The current request
        !           460:  */ 
        !           461: AP_DECLARE(void) ap_note_basic_auth_failure(request_rec *r);
        !           462: 
        !           463: /**
        !           464:  * Setup the output headers so that the client knows how to authenticate
        !           465:  * itself the next time, if an authentication request failed.  This function
        !           466:  * works only for digest authentication
        !           467:  * @param r The current request
        !           468:  */ 
        !           469: AP_DECLARE(void) ap_note_digest_auth_failure(request_rec *r);
        !           470: 
        !           471: /**
        !           472:  * Get the password from the request headers
        !           473:  * @param r The current request
        !           474:  * @param pw The password as set in the headers
        !           475:  * @return 0 (OK) if it set the 'pw' argument (and assured
        !           476:  *         a correct value in r->user); otherwise it returns 
        !           477:  *         an error code, either HTTP_INTERNAL_SERVER_ERROR if things are 
        !           478:  *         really confused, HTTP_UNAUTHORIZED if no authentication at all 
        !           479:  *         seemed to be in use, or DECLINED if there was authentication but 
        !           480:  *         it wasn't Basic (in which case, the caller should presumably 
        !           481:  *         decline as well).
        !           482:  */
        !           483: AP_DECLARE(int) ap_get_basic_auth_pw(request_rec *r, const char **pw);
        !           484: 
        !           485: /**
        !           486:  * parse_uri: break apart the uri
        !           487:  * @warning Side Effects: 
        !           488:  *    @li sets r->args to rest after '?' (or NULL if no '?')
        !           489:  *    @li sets r->uri to request uri (without r->args part)
        !           490:  *    @li sets r->hostname (if not set already) from request (scheme://host:port)
        !           491:  * @param r The current request
        !           492:  * @param uri The uri to break apart
        !           493:  */
        !           494: AP_CORE_DECLARE(void) ap_parse_uri(request_rec *r, const char *uri);
        !           495: 
        !           496: /**
        !           497:  * Get the next line of input for the request
        !           498:  * @param s The buffer into which to read the line
        !           499:  * @param n The size of the buffer
        !           500:  * @param r The request
        !           501:  * @param fold Whether to merge continuation lines
        !           502:  * @return The length of the line, if successful
        !           503:  *         n, if the line is too big to fit in the buffer
        !           504:  *         -1 for miscellaneous errors
        !           505:  */
        !           506: AP_DECLARE(int) ap_getline(char *s, int n, request_rec *r, int fold);
        !           507: 
        !           508: /**
        !           509:  * Get the next line of input for the request
        !           510:  *
        !           511:  * Note: on ASCII boxes, ap_rgetline is a macro which simply calls 
        !           512:  *       ap_rgetline_core to get the line of input.
        !           513:  * 
        !           514:  *       on EBCDIC boxes, ap_rgetline is a wrapper function which
        !           515:  *       translates ASCII protocol lines to the local EBCDIC code page
        !           516:  *       after getting the line of input.
        !           517:  *       
        !           518:  * @param s Pointer to the pointer to the buffer into which the line
        !           519:  *          should be read; if *s==NULL, a buffer of the necessary size
        !           520:  *          to hold the data will be allocated from the request pool
        !           521:  * @param n The size of the buffer
        !           522:  * @param read The length of the line.
        !           523:  * @param r The request
        !           524:  * @param fold Whether to merge continuation lines
        !           525:  * @param bb Working brigade to use when reading buckets
        !           526:  * @return APR_SUCCESS, if successful
        !           527:  *         APR_ENOSPC, if the line is too big to fit in the buffer
        !           528:  *         Other errors where appropriate
        !           529:  */
        !           530: #if APR_CHARSET_EBCDIC
        !           531: AP_DECLARE(apr_status_t) ap_rgetline(char **s, apr_size_t n, 
        !           532:                                      apr_size_t *read,
        !           533:                                      request_rec *r, int fold,
        !           534:                                      apr_bucket_brigade *bb);
        !           535: #else /* ASCII box */
        !           536: #define ap_rgetline(s, n, read, r, fold, bb) \
        !           537:         ap_rgetline_core((s), (n), (read), (r), (fold), (bb))
        !           538: #endif
        !           539: 
        !           540: /** @see ap_rgetline */
        !           541: AP_DECLARE(apr_status_t) ap_rgetline_core(char **s, apr_size_t n, 
        !           542:                                           apr_size_t *read,
        !           543:                                           request_rec *r, int fold,
        !           544:                                           apr_bucket_brigade *bb);
        !           545: 
        !           546: /**
        !           547:  * Get the method number associated with the given string, assumed to
        !           548:  * contain an HTTP method.  Returns M_INVALID if not recognized.
        !           549:  * @param method A string containing a valid HTTP method
        !           550:  * @return The method number
        !           551:  */
        !           552: AP_DECLARE(int) ap_method_number_of(const char *method);
        !           553: 
        !           554: /**
        !           555:  * Get the method name associated with the given internal method
        !           556:  * number.  Returns NULL if not recognized.
        !           557:  * @param p A pool to use for temporary allocations.
        !           558:  * @param methnum An integer value corresponding to an internal method number
        !           559:  * @return The name corresponding to the method number
        !           560:  */
        !           561: AP_DECLARE(const char *) ap_method_name_of(apr_pool_t *p, int methnum);
        !           562: 
        !           563: 
        !           564:   /* Hooks */
        !           565:   /*
        !           566:    * post_read_request --- run right after read_request or internal_redirect,
        !           567:    *                  and not run during any subrequests.
        !           568:    */
        !           569: /**
        !           570:  * This hook allows modules to affect the request immediately after the request
        !           571:  * has been read, and before any other phases have been processes.  This allows
        !           572:  * modules to make decisions based upon the input header fields
        !           573:  * @param r The current request
        !           574:  * @return OK or DECLINED
        !           575:  */
        !           576: AP_DECLARE_HOOK(int,post_read_request,(request_rec *r))
        !           577: 
        !           578: /**
        !           579:  * This hook allows modules to perform any module-specific logging activities
        !           580:  * over and above the normal server things.
        !           581:  * @param r The current request
        !           582:  * @return OK, DECLINED, or HTTP_...
        !           583:  */
        !           584: AP_DECLARE_HOOK(int,log_transaction,(request_rec *r))
        !           585: 
        !           586: /**
        !           587:  * This hook allows modules to retrieve the http scheme for a request.  This
        !           588:  * allows Apache modules to easily extend the schemes that Apache understands
        !           589:  * @param r The current request
        !           590:  * @return The http scheme from the request
        !           591:  */
        !           592: AP_DECLARE_HOOK(const char *,http_scheme,(const request_rec *r))
        !           593: 
        !           594: /**
        !           595:  * Return the default port from the current request
        !           596:  * @param r The current request
        !           597:  * @return The current port
        !           598:  */
        !           599: AP_DECLARE_HOOK(apr_port_t,default_port,(const request_rec *r))
        !           600: 
        !           601: /** @see ap_bucket_type_error */
        !           602: typedef struct ap_bucket_error ap_bucket_error;
        !           603: 
        !           604: /**
        !           605:  * @struct ap_bucket_error
        !           606:  * @brief  A bucket referring to an HTTP error
        !           607:  *
        !           608:  * This bucket can be passed down the filter stack to indicate that an
        !           609:  * HTTP error occurred while running a filter.  In order for this bucket
        !           610:  * to be used successfully, it MUST be sent as the first bucket in the
        !           611:  * first brigade to be sent from a given filter.
        !           612:  */
        !           613: struct ap_bucket_error {
        !           614:     /** Number of buckets using this memory */
        !           615:     apr_bucket_refcount refcount;
        !           616:     /** The error code */
        !           617:     int status;
        !           618:     /** The error string */
        !           619:     const char    *data;
        !           620: };
        !           621: 
        !           622: /** @see ap_bucket_type_error */
        !           623: AP_DECLARE_DATA extern const apr_bucket_type_t ap_bucket_type_error;
        !           624: 
        !           625: /**
        !           626:  * Determine if a bucket is an error bucket
        !           627:  * @param e The bucket to inspect
        !           628:  * @return true or false
        !           629:  */
        !           630: #define AP_BUCKET_IS_ERROR(e)         (e->type == &ap_bucket_type_error)
        !           631: 
        !           632: /**
        !           633:  * Make the bucket passed in an error bucket
        !           634:  * @param b The bucket to make into an error bucket
        !           635:  * @param error The HTTP error code to put in the bucket. 
        !           636:  * @param buf An optional error string to put in the bucket.
        !           637:  * @param p A pool to allocate out of.
        !           638:  * @return The new bucket, or NULL if allocation failed
        !           639:  */
        !           640: AP_DECLARE(apr_bucket *) ap_bucket_error_make(apr_bucket *b, int error,
        !           641:                 const char *buf, apr_pool_t *p);
        !           642: 
        !           643: /**
        !           644:  * Create a bucket referring to an HTTP error.
        !           645:  * @param error The HTTP error code to put in the bucket. 
        !           646:  * @param buf An optional error string to put in the bucket.
        !           647:  * @param p A pool to allocate the error string out of.
        !           648:  * @param list The bucket allocator from which to allocate the bucket
        !           649:  * @return The new bucket, or NULL if allocation failed
        !           650:  */
        !           651: AP_DECLARE(apr_bucket *) ap_bucket_error_create(int error, const char *buf,
        !           652:                                                 apr_pool_t *p,
        !           653:                                                 apr_bucket_alloc_t *list);
        !           654: 
        !           655: AP_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, apr_bucket_brigade *b);
        !           656: AP_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, apr_bucket_brigade *b);
        !           657: AP_DECLARE_NONSTD(apr_status_t) ap_content_length_filter(ap_filter_t *,
        !           658:                                                               apr_bucket_brigade *);
        !           659: AP_DECLARE_NONSTD(apr_status_t) ap_old_write_filter(ap_filter_t *f, apr_bucket_brigade *b);
        !           660: 
        !           661: /**
        !           662:  * Sett up the protocol fields for subsidiary requests
        !           663:  * @param rnew New Sub Request
        !           664:  * @param r current request
        !           665:  */
        !           666: AP_DECLARE(void) ap_set_sub_req_protocol(request_rec *rnew, const request_rec *r);
        !           667: 
        !           668: /**
        !           669:  * A wrapup function to keep the internal accounting straight.
        !           670:  * Indicates that there is no more content coming.
        !           671:  * @param sub_r Subrequest that is now compete
        !           672:  */
        !           673: AP_DECLARE(void) ap_finalize_sub_req_protocol(request_rec *sub_r);
        !           674: 
        !           675: /**
        !           676:  * Send an interim (HTTP 1xx) response immediately.
        !           677:  * @param r The request
        !           678:  * @param send_headers Whether to send&clear headers in r->headers_out
        !           679:  */
        !           680: AP_DECLARE(void) ap_send_interim_response(request_rec *r, int send_headers);
        !           681:                                                                                 
        !           682: #ifdef __cplusplus
        !           683: }
        !           684: #endif
        !           685: 
        !           686: #endif /* !APACHE_HTTP_PROTOCOL_H */
        !           687: /** @} */

E-mail: