PHttpChannelParams.h (10094B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set sw=2 ts=8 et tw=80 : */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_net_PHttpChannelParams_h 8 #define mozilla_net_PHttpChannelParams_h 9 10 #define ALLOW_LATE_NSHTTP_H_INCLUDE 1 11 #include "base/basictypes.h" 12 13 #include "ipc/IPCMessageUtils.h" 14 #include "ipc/IPCMessageUtilsSpecializations.h" 15 #include "nsHttp.h" 16 #include "nsHttpHeaderArray.h" 17 #include "nsHttpRequestHead.h" 18 #include "nsHttpResponseHead.h" 19 20 namespace mozilla { 21 namespace net { 22 23 struct RequestHeaderTuple { 24 nsCString mHeader; 25 nsCString mValue; 26 bool mMerge; 27 bool mEmpty; 28 29 bool operator==(const RequestHeaderTuple& other) const { 30 return mHeader.Equals(other.mHeader) && mValue.Equals(other.mValue) && 31 mMerge == other.mMerge && mEmpty == other.mEmpty; 32 } 33 }; 34 35 typedef CopyableTArray<RequestHeaderTuple> RequestHeaderTuples; 36 37 } // namespace net 38 } // namespace mozilla 39 40 namespace IPC { 41 42 template <> 43 struct ParamTraits<mozilla::net::RequestHeaderTuple> { 44 typedef mozilla::net::RequestHeaderTuple paramType; 45 46 static void Write(MessageWriter* aWriter, const paramType& aParam) { 47 WriteParam(aWriter, aParam.mHeader); 48 WriteParam(aWriter, aParam.mValue); 49 WriteParam(aWriter, aParam.mMerge); 50 WriteParam(aWriter, aParam.mEmpty); 51 } 52 53 static bool Read(MessageReader* aReader, paramType* aResult) { 54 if (!ReadParam(aReader, &aResult->mHeader) || 55 !ReadParam(aReader, &aResult->mValue) || 56 !ReadParam(aReader, &aResult->mMerge) || 57 !ReadParam(aReader, &aResult->mEmpty)) 58 return false; 59 60 return true; 61 } 62 }; 63 64 template <> 65 struct ParamTraits<mozilla::net::nsHttpAtom> { 66 typedef mozilla::net::nsHttpAtom paramType; 67 68 static void Write(MessageWriter* aWriter, const paramType& aParam) { 69 // aParam.get() cannot be null. 70 MOZ_ASSERT(aParam.get(), "null nsHTTPAtom value"); 71 nsAutoCString value(aParam.get()); 72 WriteParam(aWriter, value); 73 } 74 75 static bool Read(MessageReader* aReader, paramType* aResult) { 76 nsAutoCString value; 77 if (!ReadParam(aReader, &value)) return false; 78 79 *aResult = mozilla::net::nsHttp::ResolveAtom(value); 80 MOZ_ASSERT(aResult->get(), "atom table not initialized"); 81 return true; 82 } 83 }; 84 85 template <> 86 struct ParamTraits<mozilla::net::nsHttpHeaderArray::nsEntry> { 87 typedef mozilla::net::nsHttpHeaderArray::nsEntry paramType; 88 89 static void Write(MessageWriter* aWriter, const paramType& aParam) { 90 if (aParam.headerNameOriginal.IsEmpty()) { 91 WriteParam(aWriter, aParam.header); 92 } else { 93 WriteParam(aWriter, aParam.headerNameOriginal); 94 } 95 WriteParam(aWriter, aParam.value); 96 switch (aParam.variety) { 97 case mozilla::net::nsHttpHeaderArray::eVarietyUnknown: 98 WriteParam(aWriter, (uint8_t)0); 99 break; 100 case mozilla::net::nsHttpHeaderArray::eVarietyRequestOverride: 101 WriteParam(aWriter, (uint8_t)1); 102 break; 103 case mozilla::net::nsHttpHeaderArray::eVarietyRequestDefault: 104 WriteParam(aWriter, (uint8_t)2); 105 break; 106 case mozilla::net::nsHttpHeaderArray::eVarietyRequestEnforceDefault: 107 WriteParam(aWriter, (uint8_t)3); 108 break; 109 case mozilla::net::nsHttpHeaderArray:: 110 eVarietyResponseNetOriginalAndResponse: 111 WriteParam(aWriter, (uint8_t)4); 112 break; 113 case mozilla::net::nsHttpHeaderArray::eVarietyResponseNetOriginal: 114 WriteParam(aWriter, (uint8_t)5); 115 break; 116 case mozilla::net::nsHttpHeaderArray::eVarietyResponse: 117 WriteParam(aWriter, (uint8_t)6); 118 break; 119 case mozilla::net::nsHttpHeaderArray::eVarietyResponseOverride: 120 WriteParam(aWriter, (uint8_t)7); 121 break; 122 } 123 } 124 125 static bool Read(MessageReader* aReader, paramType* aResult) { 126 uint8_t variety; 127 nsAutoCString header; 128 if (!ReadParam(aReader, &header) || !ReadParam(aReader, &aResult->value) || 129 !ReadParam(aReader, &variety)) 130 return false; 131 132 mozilla::net::nsHttpAtom atom = mozilla::net::nsHttp::ResolveAtom(header); 133 aResult->header = atom; 134 if (!header.Equals(atom.get())) { 135 aResult->headerNameOriginal = header; 136 } 137 138 switch (variety) { 139 case 0: 140 aResult->variety = mozilla::net::nsHttpHeaderArray::eVarietyUnknown; 141 break; 142 case 1: 143 aResult->variety = 144 mozilla::net::nsHttpHeaderArray::eVarietyRequestOverride; 145 break; 146 case 2: 147 aResult->variety = 148 mozilla::net::nsHttpHeaderArray::eVarietyRequestDefault; 149 break; 150 case 3: 151 aResult->variety = 152 mozilla::net::nsHttpHeaderArray::eVarietyRequestEnforceDefault; 153 break; 154 case 4: 155 aResult->variety = mozilla::net::nsHttpHeaderArray:: 156 eVarietyResponseNetOriginalAndResponse; 157 break; 158 case 5: 159 aResult->variety = 160 mozilla::net::nsHttpHeaderArray::eVarietyResponseNetOriginal; 161 break; 162 case 6: 163 aResult->variety = mozilla::net::nsHttpHeaderArray::eVarietyResponse; 164 break; 165 case 7: 166 aResult->variety = 167 mozilla::net::nsHttpHeaderArray::eVarietyResponseOverride; 168 break; 169 default: 170 return false; 171 } 172 173 return true; 174 } 175 }; 176 177 template <> 178 struct ParamTraits<mozilla::net::nsHttpHeaderArray> { 179 typedef mozilla::net::nsHttpHeaderArray paramType; 180 181 static void Write(MessageWriter* aWriter, const paramType& aParam) { 182 paramType& p = const_cast<paramType&>(aParam); 183 184 WriteParam(aWriter, p.mHeaders); 185 } 186 187 static bool Read(MessageReader* aReader, paramType* aResult) { 188 if (!ReadParam(aReader, &aResult->mHeaders)) return false; 189 190 return true; 191 } 192 }; 193 194 template <> 195 struct ParamTraits<mozilla::net::nsHttpRequestHead> { 196 typedef mozilla::net::nsHttpRequestHead paramType; 197 198 static void Write(MessageWriter* aWriter, 199 const paramType& aParam) MOZ_NO_THREAD_SAFETY_ANALYSIS { 200 aParam.Enter(); 201 WriteParam(aWriter, aParam.mHeaders); 202 WriteParam(aWriter, aParam.mMethod); 203 WriteParam(aWriter, static_cast<uint32_t>(aParam.mVersion)); 204 WriteParam(aWriter, aParam.mRequestURI); 205 WriteParam(aWriter, aParam.mPath); 206 WriteParam(aWriter, aParam.mOrigin); 207 WriteParam(aWriter, static_cast<uint8_t>(aParam.mParsedMethod)); 208 WriteParam(aWriter, aParam.mHTTPS); 209 aParam.Exit(); 210 } 211 212 static bool Read(MessageReader* aReader, paramType* aResult) { 213 uint32_t version; 214 uint8_t method; 215 aResult->Enter(); 216 if (!ReadParam(aReader, &aResult->mHeaders) || 217 !ReadParam(aReader, &aResult->mMethod) || 218 !ReadParam(aReader, &version) || 219 !ReadParam(aReader, &aResult->mRequestURI) || 220 !ReadParam(aReader, &aResult->mPath) || 221 !ReadParam(aReader, &aResult->mOrigin) || 222 !ReadParam(aReader, &method) || !ReadParam(aReader, &aResult->mHTTPS)) { 223 aResult->Exit(); 224 return false; 225 } 226 227 aResult->mVersion = static_cast<mozilla::net::HttpVersion>(version); 228 aResult->mParsedMethod = 229 static_cast<mozilla::net::nsHttpRequestHead::ParsedMethodType>(method); 230 aResult->Exit(); 231 return true; 232 } 233 }; 234 235 // Note that the code below MUST be synchronized with the code in 236 // nsHttpRequestHead's copy constructor. 237 template <> 238 struct ParamTraits<mozilla::net::nsHttpResponseHead> { 239 typedef mozilla::net::nsHttpResponseHead paramType; 240 241 static void Write(MessageWriter* aWriter, 242 const paramType& aParam) MOZ_NO_THREAD_SAFETY_ANALYSIS { 243 aParam.Enter(); 244 WriteParam(aWriter, aParam.mHeaders); 245 WriteParam(aWriter, static_cast<uint32_t>(aParam.mVersion)); 246 WriteParam(aWriter, aParam.mStatus); 247 WriteParam(aWriter, aParam.mStatusText); 248 WriteParam(aWriter, aParam.mContentLength); 249 WriteParam(aWriter, aParam.mContentType); 250 WriteParam(aWriter, aParam.mContentCharset); 251 WriteParam(aWriter, aParam.mHasCacheControl); 252 WriteParam(aWriter, aParam.mCacheControlPublic); 253 WriteParam(aWriter, aParam.mCacheControlPrivate); 254 WriteParam(aWriter, aParam.mCacheControlNoStore); 255 WriteParam(aWriter, aParam.mCacheControlNoCache); 256 WriteParam(aWriter, aParam.mCacheControlImmutable); 257 WriteParam(aWriter, aParam.mCacheControlStaleWhileRevalidateSet); 258 WriteParam(aWriter, aParam.mCacheControlStaleWhileRevalidate); 259 WriteParam(aWriter, aParam.mCacheControlMaxAgeSet); 260 WriteParam(aWriter, aParam.mCacheControlMaxAge); 261 WriteParam(aWriter, aParam.mPragmaNoCache); 262 aParam.Exit(); 263 } 264 265 static bool Read(MessageReader* aReader, paramType* aResult) { 266 uint32_t version; 267 aResult->Enter(); 268 if (!ReadParam(aReader, &aResult->mHeaders) || 269 !ReadParam(aReader, &version) || 270 !ReadParam(aReader, &aResult->mStatus) || 271 !ReadParam(aReader, &aResult->mStatusText) || 272 !ReadParam(aReader, &aResult->mContentLength) || 273 !ReadParam(aReader, &aResult->mContentType) || 274 !ReadParam(aReader, &aResult->mContentCharset) || 275 !ReadParam(aReader, &aResult->mHasCacheControl) || 276 !ReadParam(aReader, &aResult->mCacheControlPublic) || 277 !ReadParam(aReader, &aResult->mCacheControlPrivate) || 278 !ReadParam(aReader, &aResult->mCacheControlNoStore) || 279 !ReadParam(aReader, &aResult->mCacheControlNoCache) || 280 !ReadParam(aReader, &aResult->mCacheControlImmutable) || 281 !ReadParam(aReader, &aResult->mCacheControlStaleWhileRevalidateSet) || 282 !ReadParam(aReader, &aResult->mCacheControlStaleWhileRevalidate) || 283 !ReadParam(aReader, &aResult->mCacheControlMaxAgeSet) || 284 !ReadParam(aReader, &aResult->mCacheControlMaxAge) || 285 !ReadParam(aReader, &aResult->mPragmaNoCache)) { 286 aResult->Exit(); 287 return false; 288 } 289 290 aResult->mVersion = static_cast<mozilla::net::HttpVersion>(version); 291 aResult->Exit(); 292 return true; 293 } 294 }; 295 296 } // namespace IPC 297 298 #endif // mozilla_net_PHttpChannelParams_h