--vDz90IqCUeSi4M1R Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Matz, anyone? Any word on this patch? For what it's worth, it appears to apply cleanly to 1.9 as well (at least the last time I tried). * Paul Duncan (pabs / pablotron.org) wrote: > Hi Everyone, > > Attached is a patch against Ruby 1.8.4 which adds missing HTTP headers, > environment variables, and HTTP status codes to CGI.rb. > > Here's a complete list of additions: > > HTTP Headers > ============ > * If-Modified-Since > * If-None-Match > > Environment Variables > ===================== > * DOCUMENT_ROOT > * REMOTE_PORT > * SERVER_ADMIN > * SERVER_ADDR > * UNIQUE_ID > * SCRIPT_FILENAME (note that this is different from SCRIPT_NAME) > > HTTP Status Codes > ================= > * 100 Continue > * 101 Switching Protocols > * 201 Created > * 202 Accepted > * 203 Non-Authoritative Information > * 204 No Content > * 205 Reset Content > * 303 See Other > * 305 Use Proxy > * 306 (Unused) > * 307 Temporary Redirect > * 402 Payment Required > * 407 Proxy Authentication Required > * 408 Request Timeout > * 409 Conflict > * 410 Gone > * 413 Request Entity Too Large > * 414 Request-URI Too Long > * 415 Unsupported Media Type > * 416 Requested Range Not Satisfiable > * 417 Expectation Failed > * 503 Service Unavailable > * 504 Gateway Timeout > * 505 HTTP Version Not Supported > > The patch also updates the documentation at the top of CGI.rb to reflect > the new HTTP headers and environment variables. On the off-chance that > your mail client mangles the attachment, it's also available at the > following URL: > > http://diff.pablotron.org/ruby-1.8.4-cgi_headers.diff > > -- > Paul Duncan <pabs / pablotron.org> OpenPGP Key ID: 0x82C29562 > http://www.pablotron.org/ http://www.paulduncan.org/ > Only in ruby-1.8.4/lib: .cgi.rb.swp > diff -ur ruby-1.8.4-orig/lib/cgi.rb ruby-1.8.4/lib/cgi.rb > --- ruby-1.8.4-orig/lib/cgi.rb 2005-10-06 21:01:22.000000000 -0400 > +++ ruby-1.8.4/lib/cgi.rb 2005-12-15 00:47:42.000000000 -0500 > @@ -64,16 +64,19 @@ > # attributes of a CGI object. The following is a list of these variables: > # > # > -# AUTH_TYPE HTTP_HOST REMOTE_IDENT > -# CONTENT_LENGTH HTTP_NEGOTIATE REMOTE_USER > -# CONTENT_TYPE HTTP_PRAGMA REQUEST_METHOD > -# GATEWAY_INTERFACE HTTP_REFERER SCRIPT_NAME > -# HTTP_ACCEPT HTTP_USER_AGENT SERVER_NAME > -# HTTP_ACCEPT_CHARSET PATH_INFO SERVER_PORT > -# HTTP_ACCEPT_ENCODING PATH_TRANSLATED SERVER_PROTOCOL > -# HTTP_ACCEPT_LANGUAGE QUERY_STRING SERVER_SOFTWARE > -# HTTP_CACHE_CONTROL REMOTE_ADDR > -# HTTP_FROM REMOTE_HOST > +# AUTH_TYPE HTTP_IF_NONE_MATCH REMOTE_USER > +# CONTENT_LENGTH HTTP_KEEP_ALIVE REQUEST_METHOD > +# CONTENT_TYPE HTTP_NEGOTIATE SCRIPT_FILENAME > +# DOCUMENT_ROOT HTTP_PRAGMA SCRIPT_NAME > +# GATEWAY_INTERFACE HTTP_REFERER SERVER_ADDR > +# HTTP_ACCEPT HTTP_USER_AGENT SERVER_ADMIN > +# HTTP_ACCEPT_CHARSET PATH_INFO SERVER_NAME > +# HTTP_ACCEPT_ENCODING PATH_TRANSLATED SERVER_PORT > +# HTTP_ACCEPT_LANGUAGE QUERY_STRING SERVER_PROTOCOL > +# HTTP_CACHE_CONTROL REMOTE_ADDR SERVER_SIGNATURE > +# HTTP_FROM REMOTE_HOST SERVER_SOFTWARE > +# HTTP_HOST REMOTE_IDENT UNIQUE_ID > +# HTTP_IF_MODIFIED_SINCE REMOTE_PORT > # > # > # For each of these variables, there is a corresponding attribute with the > @@ -293,23 +296,47 @@ > > # HTTP status codes. > HTTP_STATUS = { > + "CONTINUE" => "100 Continue", > + "SWITCHING_PROTOCOLS" => "101 Switching Protocols", > "OK" => "200 OK", > + "CREATED" => "201 Created", > + "ACCEPTED" => "202 Accepted", > + "NON_AUTHORITATIVE_INFORMATION" => "203 Non-Authoritative Information", > + "NO_CONTENT" => "204 No Content", > + "RESET_CONTENT" => "205 Reset Content", > "PARTIAL_CONTENT" => "206 Partial Content", > "MULTIPLE_CHOICES" => "300 Multiple Choices", > "MOVED" => "301 Moved Permanently", > "REDIRECT" => "302 Found", > + "SEE_OTHER" => "303 See Other", > "NOT_MODIFIED" => "304 Not Modified", > + "USE_PROXY" => "305 Use Proxy", > + "(UNUSED)" => "306 (Unused)", > + "TEMPORARY_REDIRECT" => "307 Temporary Redirect", > "BAD_REQUEST" => "400 Bad Request", > "AUTH_REQUIRED" => "401 Authorization Required", > + "PAYMENT_REQUIRED" => "402 Payment Required", > "FORBIDDEN" => "403 Forbidden", > "NOT_FOUND" => "404 Not Found", > "METHOD_NOT_ALLOWED" => "405 Method Not Allowed", > "NOT_ACCEPTABLE" => "406 Not Acceptable", > + "PROXY_AUTHENTICATION_REQUIRED" => "407 Proxy Authentication Required", > + "REQUEST_TIMEOUT" => "408 Request Timeout", > + "CONFLICT" => "409 Conflict", > + "GONE" => "410 Gone", > "LENGTH_REQUIRED" => "411 Length Required", > "PRECONDITION_FAILED" => "412 Rrecondition Failed", > + "REQUEST_ENTITY_TOO_LARGE" => "413 Request Entity Too Large", > + "REQUEST_URI_TOO_LONG" => "414 Request-URI Too Long", > + "UNSUPPORTED_MEDIA_TYPE" => "415 Unsupported Media Type", > + "REQUESTED_RANGE_NOT_SATISFIABLE" => "416 Requested Range Not Satisfiable", > + "EXPECTATION_FAILED" => "417 Expectation Failed", > "SERVER_ERROR" => "500 Internal Server Error", > "NOT_IMPLEMENTED" => "501 Method Not Implemented", > "BAD_GATEWAY" => "502 Bad Gateway", > + "SERVICE_UNAVAILABLE" => "503 Service Unavailable", > + "GATEWAY_TIMEOUT" => "504 Gateway Timeout", > + "HTTP_VERSION_NOT_SUPPORTED" => "505 HTTP Version Not Supported", > "VARIANT_ALSO_VARIES" => "506 Variant Also Negotiates" > } > > @@ -922,19 +949,22 @@ > # > module QueryExtension > > - %w[ CONTENT_LENGTH SERVER_PORT ].each do |env| > + %w[ CONTENT_LENGTH SERVER_PORT REMOTE_PORT ].each do |env| > define_method(env.sub(/^HTTP_/n, '').downcase) do > (val = env_table[env]) && Integer(val) > end > end > > - %w[ AUTH_TYPE CONTENT_TYPE GATEWAY_INTERFACE PATH_INFO > - PATH_TRANSLATED QUERY_STRING REMOTE_ADDR REMOTE_HOST > - REMOTE_IDENT REMOTE_USER REQUEST_METHOD SCRIPT_NAME > - SERVER_NAME SERVER_PROTOCOL SERVER_SOFTWARE > + %w[ AUTH_TYPE CONTENT_TYPE DOCUMENT_ROOT GATEWAY_INTERFACE > + PATH_INFO PATH_TRANSLATED QUERY_STRING REMOTE_ADDR > + REMOTE_HOST REMOTE_IDENT REMOTE_USER REQUEST_METHOD > + SCRIPT_FILENAME SCRIPT_NAME SERVER_ADDR SERVER_ADMIN > + SERVER_NAME SERVER_PROTOCOL SERVER_SOFTWARE SERVER_SIGNATURE > + UNIQUE_ID > > HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING > HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_FROM HTTP_HOST > + HTTP_IF_MODIFIED_SINCE HTTP_IF_NONE_MATCH HTTP_KEEP_ALIVE > HTTP_NEGOTIATE HTTP_PRAGMA HTTP_REFERER HTTP_USER_AGENT ].each do |env| > define_method(env.sub(/^HTTP_/n, '').downcase) do > env_table[env] -- Paul Duncan <pabs / pablotron.org> OpenPGP Key ID: 0x82C29562 http://www.pablotron.org/ http://www.paulduncan.org/ --vDz90IqCUeSi4M1R Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFDq4vqzdlT34LClWIRApaeAJ0XZfDk2MftTdID6FQdd5ppPhoiMgCcCSSY Yf84MO2Uw6S6v+bxP9LbWss ja -----END PGP SIGNATURE----- --vDz90IqCUeSi4M1R--