Re: Q & A: $r->custom_response

2002-04-23 Thread Per Einar Ellefsen

At 22:04 23.04.2002, Perrin Harkins wrote:
>Per Einar Ellefsen wrote:
>>I suppose Apache::Constants could have been extended to return globals if 
>>requested... But is there really any gain in that?
>
>Only in that people will not get tripped up by the possible bugs that 
>using subroutines as constants causes.  I guess Apache::Constants is 
>difficult to replace, so everyone will just have to keep an eye out for 
>this sort of problem.

Agreed.
I'll add a warning in the docs for Apache::Constants which might help out 
in the future.


-- 
Per Einar Ellefsen
[EMAIL PROTECTED]





Re: Q & A: $r->custom_response

2002-04-23 Thread Perrin Harkins

Per Einar Ellefsen wrote:
> I suppose Apache::Constants could have been extended to return globals 
> if requested... But is there really any gain in that?

Only in that people will not get tripped up by the possible bugs that 
using subroutines as constants causes.  I guess Apache::Constants is 
difficult to replace, so everyone will just have to keep an eye out for 
this sort of problem.

- Perrin




Re: Q & A: $r->custom_response

2002-04-23 Thread Per Einar Ellefsen

At 19:51 23.04.2002, Perrin Harkins wrote:
>Per Einar Ellefsen wrote:
>>Well, this one is exported by Apache::Constants, so if you don't want to do
>>$FORBIDDEN = FORBIDDEN;
>>somewhere at the top of your code, you're bound to continue using 
>>constants, right?
>
>That's still safer.  I used the constants pragma on a big project and I 
>saw people get bitten by $hash{CONSTANT} and "string interp CONSTANT" as 
>well as the aforementioned CONSTANT => value problem.  It's just asking 
>for trouble, in my opinion.
>
>Can anyone tell us if the Apache::Constants all just standard HTTP 
>response codes, or are some of them actually Apache-specific?

Apache::Constants gets them from httpd.h. Here is the expert:

#define HTTP_CONTINUE  100
#define HTTP_SWITCHING_PROTOCOLS   101
#define HTTP_PROCESSING102
#define HTTP_OK200
#define HTTP_CREATED   201
#define HTTP_ACCEPTED  202
#define HTTP_NON_AUTHORITATIVE 203
#define HTTP_NO_CONTENT204
#define HTTP_RESET_CONTENT 205
#define HTTP_PARTIAL_CONTENT   206
#define HTTP_MULTI_STATUS  207
#define HTTP_MULTIPLE_CHOICES  300
#define HTTP_MOVED_PERMANENTLY 301
#define HTTP_MOVED_TEMPORARILY 302
#define HTTP_SEE_OTHER 303
#define HTTP_NOT_MODIFIED  304
#define HTTP_USE_PROXY 305
#define HTTP_TEMPORARY_REDIRECT307
#define HTTP_BAD_REQUEST   400
#define HTTP_UNAUTHORIZED  401
#define HTTP_PAYMENT_REQUIRED  402
#define HTTP_FORBIDDEN 403
#define HTTP_NOT_FOUND 404
#define HTTP_METHOD_NOT_ALLOWED405
#define HTTP_NOT_ACCEPTABLE406
#define HTTP_PROXY_AUTHENTICATION_REQUIRED 407
#define HTTP_REQUEST_TIME_OUT  408
#define HTTP_CONFLICT  409
#define HTTP_GONE  410
#define HTTP_LENGTH_REQUIRED   411
#define HTTP_PRECONDITION_FAILED   412
#define HTTP_REQUEST_ENTITY_TOO_LARGE  413
#define HTTP_REQUEST_URI_TOO_LARGE 414
#define HTTP_UNSUPPORTED_MEDIA_TYPE415
#define HTTP_RANGE_NOT_SATISFIABLE 416
#define HTTP_EXPECTATION_FAILED417
#define HTTP_UNPROCESSABLE_ENTITY  422
#define HTTP_LOCKED423
#define HTTP_FAILED_DEPENDENCY 424
#define HTTP_INTERNAL_SERVER_ERROR 500
#define HTTP_NOT_IMPLEMENTED   501
#define HTTP_BAD_GATEWAY   502
#define HTTP_SERVICE_UNAVAILABLE   503
#define HTTP_GATEWAY_TIME_OUT  504
#define HTTP_VERSION_NOT_SUPPORTED 505
#define HTTP_VARIANT_ALSO_VARIES   506
#define HTTP_INSUFFICIENT_STORAGE  507
#define HTTP_NOT_EXTENDED  510

#define DOCUMENT_FOLLOWSHTTP_OK
#define PARTIAL_CONTENT HTTP_PARTIAL_CONTENT
#define MULTIPLE_CHOICESHTTP_MULTIPLE_CHOICES
#define MOVED   HTTP_MOVED_PERMANENTLY
#define REDIRECTHTTP_MOVED_TEMPORARILY
#define USE_LOCAL_COPY  HTTP_NOT_MODIFIED
#define BAD_REQUEST HTTP_BAD_REQUEST
#define AUTH_REQUIRED   HTTP_UNAUTHORIZED
#define FORBIDDEN   HTTP_FORBIDDEN
#define NOT_FOUND   HTTP_NOT_FOUND
#define METHOD_NOT_ALLOWED  HTTP_METHOD_NOT_ALLOWED
#define NOT_ACCEPTABLE  HTTP_NOT_ACCEPTABLE
#define LENGTH_REQUIRED HTTP_LENGTH_REQUIRED
#define PRECONDITION_FAILED HTTP_PRECONDITION_FAILED
#define SERVER_ERRORHTTP_INTERNAL_SERVER_ERROR
#define NOT_IMPLEMENTED HTTP_NOT_IMPLEMENTED
#define BAD_GATEWAY HTTP_BAD_GATEWAY
#define VARIANT_ALSO_VARIES HTTP_VARIANT_ALSO_VARIES

So apparently, FORBIDDEN == HTTP_FORBIDDEN == 403.
However, I wouldn't rely on any of this, because that's the reason behind 
constants: they hide what they really are!

For example, we have this:

#define DECLINED -1   /* Module declines to handle */
#define DONE -2 /* Module has served the response completely
  *  - it's safe to die() with no more output
  */
#define OK 0/* Module has handled this stage. */

OK should therefore not be confused with HTTP_OK (many people seem to bite 
the bug and return 200, which isn't supposed to be right).

I suppose Apache::Constants could have been extended to return globals if 
requested... But is there really any gain in that?


-- 
Per Einar Ellefsen
[EMAIL PROTECTED]





Re: Q & A: $r->custom_response

2002-04-23 Thread Geoffrey Young

> Can anyone tell us if the Apache::Constants all just standard HTTP 
> response codes, or are some of them actually Apache-specific?
> 


there are over 90 constants in Apache::Constants, which range from HTTP 
constants (like FORBIDDEN for 403) to Apache specific ones (like 
DECLINED for -1 and OPT_INCLUDES for 2).  there is also stuff like 
SERVER_VERSION which is really a runtime call to ap_get_server_version().

--Geoff






Re: Q & A: $r->custom_response

2002-04-23 Thread Perrin Harkins

Per Einar Ellefsen wrote:
> Well, this one is exported by Apache::Constants, so if you don't want to do
> $FORBIDDEN = FORBIDDEN;
> somewhere at the top of your code, you're bound to continue using 
> constants, right?

That's still safer.  I used the constants pragma on a big project and I 
saw people get bitten by $hash{CONSTANT} and "string interp CONSTANT" as 
well as the aforementioned CONSTANT => value problem.  It's just asking 
for trouble, in my opinion.

Can anyone tell us if the Apache::Constants all just standard HTTP 
response codes, or are some of them actually Apache-specific?

- Perrin






Re: Q & A: $r->custom_response

2002-04-23 Thread Per Einar Ellefsen

At 19:38 23.04.2002, Perrin Harkins wrote:
>Issac Goldstand wrote:
>>Reposting a question (and the answer) that geoff and I discussed in the 
>>IRC room, as I think it's worthwhile to mention...
>>I had the following line of code (actually many of the sort):
>>$r->custom_response(FORBIDDEN=>"File size exceeds quota.");
>>And kept getting errors like:
>>[Tue Apr 23 19:46:14 2002] null: Argument "FORBIDDEN" isn't numeric in 
>>subroutine entry at /usr/local/httpd/lib/perl/Mine/Pic/Application.pm 
>>line 1343.
>>The answer to the problem is that by using '=>' instead of ',', I was 
>>making 'FORBIDDEN' become '"FORBIDDEN"' (string instead of numeric 403).
>>Moral of the story: don't use => with Apache::Constants!
>
>In fact, don't use constants at all.  At least not the kind created by the 
>"use constants" pragma and similar tricks.  They have all kinds of 
>problems like this.  Use package variables instead ($FORBIDDEN).  Maybe 
>some day Perl will have real constants, but I'm perfectly happy with 
>package variables in the meantime.

Well, this one is exported by Apache::Constants, so if you don't want to do
$FORBIDDEN = FORBIDDEN;
somewhere at the top of your code, you're bound to continue using 
constants, right?


-- 
Per Einar Ellefsen
[EMAIL PROTECTED]





Re: Q & A: $r->custom_response

2002-04-23 Thread Per Einar Ellefsen

At 19:29 23.04.2002, Issac Goldstand wrote:
>Reposting a question (and the answer) that geoff and I discussed in the 
>IRC room, as I think it's worthwhile to mention...
>
>I had the following line of code (actually many of the sort):
>$r->custom_response(FORBIDDEN=>"File size exceeds quota.");
>
>And kept getting errors like:
>[Tue Apr 23 19:46:14 2002] null: Argument "FORBIDDEN" isn't numeric in 
>subroutine entry at /usr/local/httpd/lib/perl/Mine/Pic/Application.pm line 
>1343.
>
>The answer to the problem is that by using '=>' instead of ',', I was 
>making 'FORBIDDEN' become '"FORBIDDEN"' (string instead of numeric 403).
>
>Moral of the story: don't use => with Apache::Constants!

Or you can use &FORBIDDEN or FORBIDDEN() or +FORBIDDEN, which are another 
fix if you want to continue using =>.


-- 
Per Einar Ellefsen
[EMAIL PROTECTED]





Re: Q & A: $r->custom_response

2002-04-23 Thread Perrin Harkins

Issac Goldstand wrote:
> Reposting a question (and the answer) that geoff and I discussed in the 
> IRC room, as I think it's worthwhile to mention...
> 
> I had the following line of code (actually many of the sort):
> $r->custom_response(FORBIDDEN=>"File size exceeds quota.");
> 
> And kept getting errors like:
> [Tue Apr 23 19:46:14 2002] null: Argument "FORBIDDEN" isn't numeric in 
> subroutine entry at /usr/local/httpd/lib/perl/Mine/Pic/Application.pm 
> line 1343.
> 
> The answer to the problem is that by using '=>' instead of ',', I was 
> making 'FORBIDDEN' become '"FORBIDDEN"' (string instead of numeric 403).
> 
> Moral of the story: don't use => with Apache::Constants!

In fact, don't use constants at all.  At least not the kind created by 
the "use constants" pragma and similar tricks.  They have all kinds of 
problems like this.  Use package variables instead ($FORBIDDEN).  Maybe 
some day Perl will have real constants, but I'm perfectly happy with 
package variables in the meantime.

- Perrin