Closed Bug 201625 Opened 21 years ago Closed 21 years ago

expose request and response versions via new nsIHttpChannel2 interface

Categories

(Core :: Networking: HTTP, defect)

x86
Linux
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: db48x, Assigned: db48x)

Details

Attachments

(1 file, 8 obsolete files)

I've got a patch, but since it creates a new file, I won't be able to make an
acutal diff.
Attached patch patch (obsolete) — Splinter Review
Attached file new file, nsIHttpChannel2.idl (obsolete) —
it goes in netwerk/protocol/http/, of course.
Comment on attachment 120183 [details]
new file, nsIHttpChannel2.idl

requesting r= on both attachments to this bug.
Attachment #120183 - Flags: review?(darin)
Comment on attachment 120183 [details]
new file, nsIHttpChannel2.idl

might as well request sr while I'm at it.
Attachment #120183 - Flags: superreview?(bzbarsky)
Comment on attachment 120183 [details]
new file, nsIHttpChannel2.idl


>/** 
> * Adds to the frozen nsIHttpChannel
> */

remove the word frozen.  better to just say:

  "Extends nsIHttpChannel"

>  readonly attribute PRUint8 requestVersion;
>  readonly attribute PRUint8 responseVersion;

PRUint8?  huh?	if you are meaning to just pass the values straight from
nsHttpRequestHead/nsHttpResponseHead, then you will also need to define
the constants for HTTP/1.0 and HTTP/1.1, but constants wouldn't be very
flexible.  how about something more general like, minorVersion/majorVersion?

   readonly attribute unsigned long requestVersionMajor;
   readonly attribute unsigned long requestVersionMinor;

   readonly attribute unsigned long responseVersionMajor;
   readonly attribute unsigned long responseVersionMinor;

or you could even provide it as a string.  i'm not sure which would be
best.

also, NOTE: that the consumer of this interface will not be able to detect
HTTP/0.9 responses since we write the version as HTTP/1.0.  i'm not sure if
this impacts how you plan to use this interface, which i'm very curious
about.
Attachment #120183 - Flags: review?(darin) → review-
Comment on attachment 120182 [details] [diff] [review]
patch

>Index: netwerk/protocol/http/src/nsHttpChannel.cpp
>+NS_IMETHODIMP
>+nsHttpChannel::GetRequestVersion(PRUint8 *version)
>+{
>+  NS_ENSURE_ARG_POINTER(version);

This is a semi-religious issue, but imo that should just be
NS_PRECONDITION(version, "Null out param") (and maybe aVersion? I don't recall
what the arg-naming convention in that file is).

The only way you'd get a null |version| is if someone who has no clue about COM
writes some C++ code.

Same for the other method.
Comment on attachment 120183 [details]
new file, nsIHttpChannel2.idl

What darin said.  ;)
Attachment #120183 - Flags: superreview?(bzbarsky) → superreview-
It'll be used by livehttpheaders and page info. Both string and major/minor
would be equally useful for that purpose, so I'll pick... major/minor. Seems
like that'd be the most generally useful. On the other hand, a single byte
should provide enough space for future http versions, so it would certainly work
for me.

It is dissapointing to hear that a .9 version gets stored as a 1.0, but that's
life (and I don't suppose there are many of those around any more.)

bz: heh. I copied that from somewhere else in the file, it doesn't make any
difference to me. Anyway, I'll make those changes, just as soon as I figure out
why in the world I didn't leave my linux machine plugged in to the net instead
of my windows machine :P
Attached patch better (obsolete) — Splinter Review
Attachment #120182 - Attachment is obsolete: true
Attached file the new file (obsolete) —
Attachment #120183 - Attachment is obsolete: true
Comment on attachment 120278 [details]
the new file

requesting r= and sr= on the two new files
Attachment #120278 - Flags: superreview?(bzbarsky)
Attachment #120278 - Flags: review?(darin)
Attachment #120278 - Flags: superreview?(bzbarsky) → superreview+
Comment on attachment 120277 [details] [diff] [review]
better

Did the linebreaks in that file get fucked up?	This patch is almost certainly
not what you want to be doing; take a look at it... ;)
Attachment #120277 - Flags: superreview-
erm, no, that's not what I want to do.
Attached patch diff -uw :P (obsolete) — Splinter Review
it's not like I changed any whitespace so that should work
Attachment #120277 - Attachment is obsolete: true
may i ask why this is needed?  it just occured to me while working on proxy
failover that our request version might change as a result of failing over from
a proxy connection to a direct connection.  such would not be a big problem if
these methods were only accessed between OnStartRequest and OnStopRequest.  is
that the case?  is this for page-info or something?
Yes, it's for page info. Can't you just store the new request version if it's
required when the failover occurs?
so, darin, what's the word?
spoke to db48x over irc... seems best to utilize nsIHttpChannelInternal for
this... we can introduce nsIHttpChannel2 later if we need to freeze more stuff.
 "Internal" suffix comes from nsIPrefBranch and nsIPrefBranchInternal where only
the former is frozen and the latter is for stuff internal to mozilla.
Attached patch patch (obsolete) — Splinter Review
modifies nsIHttpChannelInternal instead of adding nsIHttpChannel2

Please double check that the data is returned ok, in my last patch I forgot
which language this was and returned the value instead of using the out param.
:P

My modified copy of livehttpheaders works ok, but double checking is good.
Attachment #120278 - Attachment is obsolete: true
Attachment #120303 - Attachment is obsolete: true
Comment on attachment 124459 [details] [diff] [review]
patch

request r=
Attachment #124459 - Flags: review?(darin)
Comment on attachment 124459 [details] [diff] [review]
patch

>Index: netwerk/protocol/http/public/nsIHttpChannelInternal.idl

>+    readonly attribute unsigned long requestVersionMinor;
>+    readonly attribute unsigned long requestVersionMajor;

nit: list major before minor.


>Index: netwerk/protocol/http/src/nsHttpChannel.cpp

>+nsHttpChannel::GetRequestVersionMajor(PRUint32 *version)
>+{
>+  NS_PRECONDITION(version, "Null out parameter");
>+  switch(mRequestHead.Version())
>+  {
>+    case NS_HTTP_VERSION_1_0:
>+    case NS_HTTP_VERSION_1_1:
>+      *version = 1;
>+      break;
>+    case NS_HTTP_VERSION_0_9:
>+    default:
>+      *version = 0;
>+      break;
>+  }
>+  return NS_OK;
>+}

 majorVersion = mRequestHead.Version() / 10;
 minorVersion = mRequestHead.Version() % 10;

less code :-)

also, would folks really ever want just the major
version number without the minor version as well?

how about functions like this instead:

  GetRequestVersion(PRUint32 *major, PRUint32 *minor);
  GetResponseVersion(PRUint32 *major, PRUint32 *minor);

i understand that these are less friendly to javascripters,
but it seems better to coalesce the operations like this.
Attachment #124459 - Flags: review?(darin) → review-
> majorVersion = mRequestHead.Version() / 10;
> minorVersion = mRequestHead.Version() % 10;
>
>less code :-)



>also, would folks really ever want just the major
>version number without the minor version as well?

maybe not, but you can tell what version you're working with by just examining
the minor version, since all three possible version numbers have a unique minor
part.

>how about functions like this instead:
>
>  GetRequestVersion(PRUint32 *major, PRUint32 *minor);
>  GetResponseVersion(PRUint32 *major, PRUint32 *minor);
>
>i understand that these are less friendly to javascripters,
>but it seems better to coalesce the operations like this.

perhaps.

I suppose I can do that. I can kill the NS_PRECONDITIONs and only assign to
pointers that are not null, so you can still get just one of the two if needed.
and there's really no need to return a status or anything, since it can't really
fail.

let me see if it compiles, then I'll attach it. It's so nice to have my dsl back. :)
Attached patch patch (obsolete) — Splinter Review
Attachment #124459 - Attachment is obsolete: true
Comment on attachment 127236 [details] [diff] [review]
patch

requesting r= and sr=
Attachment #127236 - Flags: superreview?(bzbarsky)
Attachment #127236 - Flags: review?(darin)
Comment on attachment 127236 [details] [diff] [review]
patch

>Index: netwerk/protocol/http/public/nsIHttpChannelInternal.idl

>+    void GetRequestVersion(out unsigned long major, out unsigned long minor);
>+    void GetResponseVersion(out unsigned long major, out unsigned long minor);

methods in IDL should be named using interCaps, so these methods should be:

    void getRequestVersion(out unsigned long major, out unsigned long minor);
    void getResponseVersion(out unsigned long major, out unsigned long minor);

r=darin with that change.
Attachment #127236 - Flags: review?(darin) → review+
the Get would still be capitolized in the implementation, because it's c++, right?
Comment on attachment 127236 [details] [diff] [review]
patch

> the Get would still be capitolized in the implementation, because it's c++, right?

Yes.

Please add null-checks before accessing mResponseHead (which can certainly be
null) and maybe mRequestHead, and sr=me
Attachment #127236 - Flags: superreview?(bzbarsky) → superreview+
Attachment #127236 - Attachment is obsolete: true
Attached patch patchSplinter Review
at bz's request, initialize the out params and return something
Attachment #127266 - Attachment is obsolete: true
bz checked this in
Status: NEW → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
Comment on attachment 120278 [details]
the new file

clean up old request
Attachment #120278 - Flags: review?(darin)
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: