| 39 | } |
| 40 | |
| 41 | void HTTPPacket::parseHeader(Exception& ex,const char* key, const char* value) { |
| 42 | if (String::ICompare(key,"content-length")==0) { |
| 43 | contentLength = String::ToNumber(ex,contentLength, value); |
| 44 | } else if (String::ICompare(key,"content-type")==0) { |
| 45 | contentType = HTTP::ParseContentType(value, contentSubType); |
| 46 | } else if (String::ICompare(key,"connection")==0) { |
| 47 | connection = HTTP::ParseConnection(ex,value); |
| 48 | } else if (String::ICompare(key,"host")==0) { |
| 49 | serverAddress.assign(value); |
| 50 | } else if (String::ICompare(key,"origin")==0) { |
| 51 | origin.assign(value); |
| 52 | } else if (String::ICompare(key,"upgrade")==0) { |
| 53 | upgrade.assign(value); |
| 54 | } else if (String::ICompare(key,"sec-websocket-key")==0) { |
| 55 | secWebsocketKey.assign(value); |
| 56 | } else if (String::ICompare(key,"sec-webSocket-accept")==0) { |
| 57 | secWebsocketAccept.assign(value); |
| 58 | } else if (String::ICompare(key,"if-modified-since")==0) { |
| 59 | ifModifiedSince.update(ex,value,Date::HTTP_FORMAT); |
| 60 | } else if (String::ICompare(key,"access-control-request-headers")==0) { |
| 61 | accessControlRequestHeaders = value; |
| 62 | } else if (String::ICompare(key,"access-control-request-method")==0) { |
| 63 | |
| 64 | String::ForEach forEach([this,&ex](UInt32 index,const char* value){ |
| 65 | accessControlRequestMethod |= HTTP::ParseCommand(ex,value); |
| 66 | return true; |
| 67 | }); |
| 68 | String::Split(value, ",", forEach, String::SPLIT_IGNORE_EMPTY | String::SPLIT_TRIM); |
| 69 | |
| 70 | } else if (String::ICompare(key,"cookie")==0) { |
| 71 | String::ForEach forEach([this](UInt32 index,const char* data) { |
| 72 | const char* value = data; |
| 73 | // trim right |
| 74 | while (value && *value != '=' && !isblank(*value)) |
| 75 | ++value; |
| 76 | if (value) { |
| 77 | const char *endKey=value; |
| 78 | // trim left |
| 79 | do { |
| 80 | ++value; |
| 81 | } while (value && (isblank(*value) || *value == '=')); |
| 82 | SCOPED_STRINGIFY(data, endKey-data, cookies[data] = value); |
| 83 | } |
| 84 | return true; |
| 85 | }); |
| 86 | String::Split(value, ";", forEach, String::SPLIT_IGNORE_EMPTY | String::SPLIT_TRIM); |
| 87 | } |
| 88 | } |
| 89 | |
| 90 | UInt32 HTTPPacket::build(Exception& ex,UInt8* data,UInt32 size) { |
| 91 | if (_data) |