void f_header_remove(CStrRef name /* = null_string */) { if (f_headers_sent()) { raise_warning("Cannot modify header information - headers already sent"); } Transport *transport = g_context->getTransport(); if (transport) { if (name.isNull()) { transport->removeAllHeaders(); } else { transport->removeHeader(name.data()); } } }
bool TestExtNetwork::test_headers_sent() { f_header("Location: http://www.facebook.com"); VERIFY(!f_headers_sent()); return Count(true); }
void f_header(CStrRef str, bool replace /* = true */, int http_response_code /* = 0 */) { if (f_headers_sent()) { raise_warning("Cannot modify header information - headers already sent"); } String header = f_rtrim(str); // new line safety check // NOTE: PHP actually allows "\n " and "\n\t" to fall through. Is that bad // for security? if (header.find('\n') >= 0 || header.find('\r') >= 0) { raise_warning("Header may not contain more than a single header, " "new line detected"); return; } Transport *transport = g_context->getTransport(); if (transport && header->size()) { const char *header_line = header->data(); // handle single line of status code if (header->size() >= 5 && strncasecmp(header_line, "HTTP/", 5) == 0) { int code = 200; for (const char *ptr = header_line; *ptr; ptr++) { if (*ptr == ' ' && *(ptr + 1) != ' ') { code = atoi(ptr + 1); break; } } if (code) { transport->setResponse(code, "explicit_header"); } return; } const char *colon_offset = strchr(header_line, ':'); String newHeader; if (colon_offset) { if (!strncasecmp(header_line, "Content-Type", colon_offset - header_line)) { const char *ptr = colon_offset+1, *mimetype = NULL; while (*ptr == ' ') ptr++; mimetype = ptr; if (strncmp(mimetype, "text/", 5) == 0 && strstr(mimetype, "charset=") == NULL) { newHeader = header + ";charset=utf-8"; } } } if (replace) { transport->replaceHeader(newHeader.empty() ? header : newHeader); } else { transport->addHeader(newHeader.empty() ? header : newHeader); } if (http_response_code) { transport->setResponse(http_response_code, "explicit_header_response_code"); } } }