虚拟世界/HTTP
百科首页 - 3D虚拟世界 - 音乐与人工智能 - 人工智能机器人 - 知识百科 - 关于我们 - 网站首页
脚本首页 | Vehicles | NPC | HTTP | 脚本间通信 | 翻译参考
相关函数
llHTTPRequest
向指定的地址发送请求和参数
- key llHTTPRequest( string url, list parameters, string body );
- 返回一个key来标识发起的HTTP请求
- string url: A valid HTTP/HTTPS URL.
- list parameters: configuration parameters, specified as HTTP_* flag-value pairs [ parameter1, value1, parameter2, value2, . . . parameterN, valueN]
- string body: Contents of the request.
//HTTP_MIMETYPE: "text/html" "text/plain;charset=utf-8" "application/xhtml+xml" "application/json" "application/x-www-form-urlencoded" "application/rss+xml" "multipart/mixed; boundary="---1234567890---""
- 注意地址必须是服务器可访问到的
- HTTP_BODY_MAXLENGTH是发起请求的长度最大值,可以在服务器配置,但是响应的值被限制为2048,这个值还不可以配置。
- body内容不要随便乱写
- 如果是post方法,可以:string body="param1=v1¶m2=v2"
- 如果是get方法,可以将“?param1=v1¶m2=v2”这个放到url中,然后body用空字符串。
- 例子
key httpreq(string page,string MSG) { return llHTTPRequest(page,[ HTTP_METHOD, "GET" // "POST" //"PUT" //"DELETE" , HTTP_MIMETYPE, //"text/application/xhtml+xml" //"text/application/atom+xml" //"text/application/json" //"text/application/xml" //"text/application/llsd+xml" //"text/application/x-javascript" //"text/application/javascript" "text/application/x-www-form-urlencoded" //"text/application/rss+xml" , HTTP_BODY_MAXLENGTH,16384, HTTP_VERIFY_CERT,TRUE, HTTP_VERBOSE_THROTTLE,TRUE, //HTTP_CUSTOM_HEADER,"","", HTTP_PRAGMA_NO_CACHE,TRUE ],MSG); } key reqed; default { touch_start(integer total_number) { reqed=httpreq( "http://127.0.0.1/test/data?content=wei",""); llSay(0,"touch_start:"+reqed); } http_response(key request_id, integer status, list metadata, string body) { llSay(0,"http_response:"+request_id); if(reqed==request_id) { llSay(0,"http_response:"+body); } } }
llHTTPResponse
以status和body响应request_id所标识的请求。相当于提供http响应,一般与llRequestURL配合使用。
- llHTTPResponse( key request_id, integer status, string body );
- key request_id: A valid HTTP request key.
- integer status: HTTP Status (200, 400, 404, etc)
- string body: 响应内容。
- 注意事项
- The response need not be made inside the http_request event but if it does not happen in a timely fashion the request will time out (within 25 seconds).
- This call must be made by the script containing the http_request event where the request_id was received.
- There is no limit, other than script size, to the amount of data that can be sent by this function.
- The response by default has "content-type: text/plain". Use llSetContentType to optionally return a different type, like "text/html".
- 例子
string url; default { changed(integer change)//很多事情都会导致这个事情发生:CHANGED_INVENTORY、CHANGED_COLOR、CHANGED_SHAPE、CHANGED_SCALE、CHANGED_TEXTURE、CHANGED_LINK等等 { if (change & (CHANGED_REGION_START | CHANGED_REGION | CHANGED_TELEPORT)) llResetScript(); } state_entry() { llRequestURL(); } touch_start(integer num_detected) { // PUBLIC_CHANNEL has the integer value 0 if (url != "") llSay(PUBLIC_CHANNEL, "URL: " + url); } http_request(key id, string method, string body) { // http://en.wikipedia.org/wiki/Create,_read,_update_and_delete list CRUDmethods = ["GET", "POST", "PUT", "DELETE"]; // it's bit-wise NOT ( ~ ) !!! integer isAllowedMethod = ~llListFindList(CRUDmethods, [method]); if (isAllowedMethod) { llHTTPResponse(id, 200, "Body of request below:\n" + body); } else if (method == URL_REQUEST_GRANTED) { // don't forget the trailing slash url = body + "/"; llOwnerSay("URL: " + url); } else if (method == URL_REQUEST_DENIED) { llOwnerSay("Something went wrong, no URL.\n" + body); } else { llOwnerSay("Ummm... I have no idea what SL just did. Method=\""+method+"\"\n" + body); } } }
osRequestURL
请求HTTP:// url (opensim version 0.9 or over),与llRequestURL功能类似
支持可选参数,如 "allowXss" - Add 'Access-Control-Allow-Origin: *' to response header
- 例子
// //osRequestURL example // RequestReceived (key id, string query) { llHTTPResponse (id,200,query+" OK"); query = llUnescapeURL(query); llSay (0, query); } default { state_entry() { osRequestURL ([ "allowXss" ]); } http_request(key id, string method, string body) { if (method == URL_REQUEST_GRANTED) llOwnerSay ("URL_REQUEST_GRANTED" +"\n" +body); if (method == URL_REQUEST_DENIED) llOwnerSay ("URL_REQUEST_DENIED"); if (method == "GET") RequestReceived (id, llGetHTTPHeader(id,"x-query-string")); if (method == "POST") RequestReceived (id, body); } }
osRequestSecureURL
请求HTTPS:// url (opensim version 0.9 or over),与llRequestSecureURL类似
可选参数支持: "allowXss" - Add 'Access-Control-Allow-Origin: *' to response header
- 例子
// //osRequestSecureURL example // RequestReceived (key id, string query) { llHTTPResponse (id,200,query+" OK"); query = llUnescapeURL(query); llSay (0, query); } default { state_entry() { osRequestSecureURL ([ "allowXss" ]); } http_request(key id, string method, string body) { if (method == URL_REQUEST_GRANTED) llOwnerSay ("URL_REQUEST_GRANTED" +"\n" +body); if (method == URL_REQUEST_DENIED) llOwnerSay ("URL_REQUEST_DENIED"); if (method == "GET") RequestReceived (id, llGetHTTPHeader(id,"x-query-string")); if (method == "POST") RequestReceived (id, body); } }
llRequestURL
请求一个用于此脚本的“HTTP://”url。该请求将导致 http_request事件发生。HTTP使用12046端口(HTTP-in uses port 12046)。采用llGetFreeURLs函数可以返回还有多少个URL资源可以使用
该请求后,就会类似在12046端口开启了一个监听,通过http可以访问到该监听。
- key llRequestURL( );
- Returns a handle (a key) used for identifying the result of the request in the http_request event.
- HTTP-in uses port 12046.
- Use of this function is throttled. Although it has no forced sleep time, too many requests (5 ish) in a short period will cause all further requests to be denied until the script stops requesting urls for at least 1 second. Using an llSleep of 0.6 seconds or greater between each request will prevent you from being throttled.
- When a region is (re)started all HTTP server URLs are automatically released and invalidated.
- Use CHANGED_REGION_START to detect this so new URL can be requested.
- The number of available URLs is a limited resource, that is to say, a script can only have so many open URLs. See LSL http_server#Resource Limitations for details.
- When abandoning a URL, release it with llReleaseURL, to avoid leaks. Resetting the script, or deleting the prim will also suffice to release URLs.
- 例子:岛屿重启后,请求一个URL
string url; key urlRequestId; default { state_entry() { urlRequestId = llRequestURL(); } on_rez(integer start_param) { llResetScript(); } changed(integer change) { if (change & (CHANGED_OWNER | CHANGED_INVENTORY)) llResetScript(); if (change & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT)) urlRequestId = llRequestURL(); } http_request(key id, string method, string body) { if (id == urlRequestId) { if (method == URL_REQUEST_DENIED) llOwnerSay("The following error occurred while attempting to get a free URL for this device:\n \n" + body); else if (method == URL_REQUEST_GRANTED) { url = body; llLoadURL(llGetOwner(), "Click to visit my URL!", url); } } } }
注意建立请求后,该监听就一直存在,而一般资源是有限的,所以在不用时一定要释放。一般可以保存好监听的id在全局环境中,不用后使用llReleaseURL函数来释放。
// WARNING: // // This script is only for proof-of-concept (demo purposes). // DO NOT use it if you don't have the sim owners and/or // estate managers OK to test this script. // This script can possibly block HTTP communication from and to the sim. // ...bringing down all networked vendors and/or similar machines. // // This script allocates all available URLs. // Deleting the script and/or derezzing the object containing the script, // will release all previously taken URLs. default { state_entry() { llRequestURL(); } http_request(key id, string method, string body) { if (method == URL_REQUEST_DENIED) llSetText("No free URLs!", <1.0, 0.0, 0.0>, 1.0); else if (method == URL_REQUEST_GRANTED) { llSetText( (string)llGetFreeURLs() + " URLs left\n" + body, <1.0, 1.0, 1.0>, 1.0); llRequestURL(); } else if (method == "GET") llHTTPResponse(id, 200, "Hello there!"); } }
llGetFreeURLs
获取还有多少监听url可用。
- 例子
default { touch_start(integer num_detected) { integer numberOfFreeURLs = llGetFreeURLs(); if(numberOfFreeURLs) llSay(0, "There are " + (string)numberOfFreeURLs + " available HTTP-In URLs left for this sim."); else llSay(0, "WARNING: There are no HTTP-In URLs available anymore."); } }
// WARNING: // // This script is only for proof-of-concept (demo purposes). // DO NOT use it if you don't have the sim owners and/or // estate managers OK to test this script. // This script can possibly block HTTP communication from and to the sim. // ...bringing down all networked vendors and/or similar machines. // // This script allocates all available URLs. // Deleting the script and/or derezzing the object containing the script, // will release all previously taken URLs. default { state_entry() { llRequestURL(); } http_request(key request_id, string method, string body) { if (method == URL_REQUEST_DENIED) llSetText("No free URLs!", <1.0, 0.0, 0.0>, 1.0); else if (method == URL_REQUEST_GRANTED) { llSetText( (string)llGetFreeURLs() + " URLs left\n" + body, <1.0, 1.0, 1.0>, 1.0); llRequestURL(); } else if (method == "GET") llHTTPResponse(id, 200, "Hello there!"); } }
llRequestSecureURL
为本模型开启 HTTPS:// (SSL) url。http_request事件会被激发。使用端口:12043。
该调用返回一个key,用于在http_request事件中标识。
- 警告
- HTTPS-in uses port 12043.
- When a region is (re)started all HTTP server URLs are automatically released and invalidated.
- Use CHANGED_REGION_START to detect this so new URL can be requested.
- 例子
string secureUrl; key urlRequestId; key selfCheckRequestId; request_secure_url() { llReleaseURL(secureUrl); secureUrl = ""; urlRequestId = llRequestSecureURL(); } throw_exception(string inputString) { key owner = llGetOwner(); llInstantMessage(owner, inputString); // yeah, bad way to handle exceptions by restarting. // However this is just a demo script... llResetScript(); } default { on_rez(integer start_param) { llResetScript(); } changed(integer change) { if (change & (CHANGED_OWNER | CHANGED_INVENTORY)) { llReleaseURL(secureUrl); secureUrl = ""; llResetScript(); } if (change & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT)) request_secure_url(); } state_entry() { request_secure_url(); } http_request(key id, string method, string body) { integer responseStatus = 400; string responseBody = "Unsupported method"; if (method == URL_REQUEST_DENIED) throw_exception("The following error occurred while attempting to get a free URL for this device:\n \n" + body); else if (method == URL_REQUEST_GRANTED) { secureUrl = body; key owner = llGetOwner(); llLoadURL(owner, "Click to visit my URL!", secureUrl); // check every 5 mins for dropped URL llSetTimerEvent(300.0); } else if (method == "GET") { responseStatus = 200; responseBody = "Hello world!"; } // else if (method == "POST") ...; // else if (method == "PUT") ...; // else if (method == "DELETE") { responseStatus = 403; responseBody = "forbidden"; } llHTTPResponse(id, responseStatus, responseBody); } http_response(key id, integer status, list metaData, string body) { if (id == selfCheckRequestId) { // If you're not usually doing this, // now is a good time to get used to doing it! selfCheckRequestId = NULL_KEY; if (status != 200) request_secure_url(); } else if (id == NULL_KEY) throw_exception("Too many HTTP requests too fast!"); } timer() { selfCheckRequestId = llHTTPRequest(secureUrl, [HTTP_METHOD, "GET", HTTP_VERBOSE_THROTTLE, FALSE, HTTP_BODY_MAXLENGTH, 16384], ""); } }
llReleaseURL
- 释放特定的URL,它将不再被使用
- string url: URL to release
- 警告:URLs are automatically released and invalidated in certain situations. In the following situations, there is no need to call llReleaseURL. But you will have to request a new one afterwards
- When the region is restarted or goes offline
- When the script holding the URLs is reset, or recompiled
- When the object containing the script is deleted, or taken to inventory
- 例子
string url; key urlRequestId; key selfCheckRequestId; request_url() { llReleaseURL(url); url = ""; llSetTimerEvent(0.0); urlRequestId = llRequestURL(); } throw_exception(string inputString) { llInstantMessage(llGetOwner(), inputString); // yeah, bad way to handle exceptions by restarting. // However this is just a demo script... llResetScript(); } default { on_rez(integer start_param) { llResetScript(); } changed(integer change) { if (change & CHANGED_OWNER | CHANGED_REGION | CHANGED_REGION_START) llResetScript(); } state_entry() { request_url(); } http_request(key id, string method, string body) { integer responseStatus = 400; string responseBody = "Unsupported method"; if (method == URL_REQUEST_DENIED) throw_exception("The following error occurred while attempting to get a free URL for this device:\n \n" + body); else if (method == URL_REQUEST_GRANTED) { url = body; llLoadURL(llGetOwner(), "Click to visit my URL!", url); // check every 5 mins for dropped URL llSetTimerEvent(300.0); } else if (method == "GET") { responseStatus = 200; responseBody = "Hello world!"; } // else if (method == "POST") ...; // else if (method == "PUT") ...; // else if (method == "DELETE") { responseStatus = 403; responseBody = "forbidden"; } llHTTPResponse(id, responseStatus, responseBody); } http_response(key id, integer status, list metaData, string body) { if (id == selfCheckRequestId) { // If you're not usually doing this, // now is a good time to get used to doing it! selfCheckRequestId = NULL_KEY; if (status != 200) request_url(); } else if (id == NULL_KEY) throw_exception("Too many HTTP requests too fast!"); } timer() { selfCheckRequestId = llHTTPRequest(url, [HTTP_METHOD, "GET", HTTP_VERBOSE_THROTTLE, FALSE, HTTP_BODY_MAXLENGTH, 16384], ""); } }
llLoadURL
显示一个对话框,让化身决定是否需要加载网页。如果用户单击是,根据需要启动浏览器,并加载相关网页。
- llLoadURL( key avatar, string message, string url );
- key avatar: avatar UUID that is in the same region
- string message: message to be displayed in the dialog box
- string url
- 警告
- url长度限制为255,消息内容限制为254个字符。
- 必须指定协议,目前支持:"https://"和"http://"。
- URL遵循规划RFC-1738。
- 该函数将导致脚本休眠0.1秒。
- 不能在组物体中调研这个函数,如果调用会默默失败。
- 如果化身自己禁用了,该函数也会默默失败。
- 例子
default { touch_start(integer num_detected) { key id = llDetectedKey(0); integer avatarInSameSim = (llGetAgentSize(id) != ZERO_VECTOR);// TRUE or FALSE if (avatarInSameSim) { string info = "Visit the There website!"; // must start with either "http://..." or "https://..." string url = "http://vthere.bnu.edu.cn/"; llLoadURL(id, info, url); } else { llInstantMessage(id, "I can only open a URL dialog on your screen if you're in my sim!"); } } }
llGetHTTPHeader
返回request_id所标识的请求的头中的值.
- string llGetHTTPHeader( key request_id, string header );
- key request_id: A valid HTTP request key.
- string header: Lower case header value name.
- 警告
- Returns an empty string if the header is not found or if the headers can no longer be accessed. Headers can only be accessed before llHTTPResponse is called and with-in the first 30 seconds after the http_request event is queued.
- Header information becomes inaccessible after 30 seconds or if llHTTPResponse is called.
- Custom headers are not supported, only the headers listed in the specification are supported.
- LSL is not a CGI environment
- "Content-Type" is an example of a normal header name, in a CGI environment the name would be "HTTP_CONTENT_TYPE".
- header must be lower case (or it will match nothing). All header names are converted to lower case when they are received.
- When making a request...
- The path part of the URL must be prefixed with a forward slash
- In order to use the query string, you must include a path (even if it is just a slash)
- 例子
key url_request; default { state_entry() { url_request = llRequestURL(); } http_request(key id, string method, string body) { if (url_request == id) { // if you're usually not resetting the query ID // now is a good time to start! url_request = ""; if (method == URL_REQUEST_GRANTED) { llOwnerSay("URL: " + body); key owner = llGetOwner(); vector ownerSize = llGetAgentSize(owner); if (ownerSize)// != ZERO_VECTOR llLoadURL(owner, "I got a new URL!", body); } else if (method == URL_REQUEST_DENIED) llOwnerSay("Something went wrong, no url:\n" + body); } else { list headerList = ["x-script-url", "x-path-info", "x-query-string", "x-remote-ip", "user-agent"]; integer index = -llGetListLength(headerList); do { string header = llList2String(headerList, index); llOwnerSay(header + ": " + llGetHTTPHeader(id, header)); } while (++index); llOwnerSay("body:\n" + body); llHTTPResponse(id, 200, body); } } }
llEscapeURL
Returns a string that is the escaped/encoded version of url, replacing spaces with "%20" etc. The function will escape any character not in [a-zA-Z0-9] to "%xx" where "xx" is the hexadecimal value of the character in UTF-8 byte form.
llUnescapeURL
Returns a string that is an unescaped/unencoded version of url, replacing "%20" with spaces etc.
llSetContentType
llSetContentType( key request_id, integer content_type ); Sets the Internet media type "Content-Type" header of any subsequent LSL HTTP server response via llHTTPResponse.
- key request_id: a valid http_request() key
- integer content_type: Media type to use with any following llHTTPResponse(request_id, ...)
key url_request; string HTML_BODY = "<!DOCTYPE html> <html> <body> <h1>My First Heading</h1> <p>My first paragraph.</p> </body> </html>"; default { state_entry() { url_request = llRequestURL(); } http_request(key id, string method, string body) { key owner = llGetOwner(); vector ownerSize = llGetAgentSize(owner); if (url_request == id) { // if you're usually not resetting the query ID // now is a good time to start! url_request = ""; if (method == URL_REQUEST_GRANTED) { llOwnerSay("URL: " + body); // if owner in sim if (ownerSize)// != ZERO_VECTOR llLoadURL(owner, "I got a new URL!", body); } else if (method == URL_REQUEST_DENIED) llOwnerSay("Something went wrong, no url:\n" + body); } else { llOwnerSay("request body:\n" + body); // if owner in sim if (ownerSize)// != ZERO_VECTOR { llSetContentType(id, CONTENT_TYPE_HTML); llHTTPResponse(id, 200, HTML_BODY); } else { llSetContentType(id, CONTENT_TYPE_TEXT); llHTTPResponse(id, 200, "OK"); } } } }
辅助函数
JSON
- LSL:http://wiki.secondlife.com/wiki/Category:LSL_JSON
- OSSL:http://opensimulator.org/wiki/OsParseJSONNew、http://opensimulator.org/wiki/OsParseJSON
服务器相关配置
- Opensim.ini
;# {HttpProxy} {} {Proxy URL for llHTTPRequest and dynamic texture loading} {} http://proxy.com:8080 ;; Http proxy setting for llHTTPRequest and dynamic texture loading, if ;; required ; HttpProxy = "http://proxy.com:8080" ;# {HttpProxyExceptions} {HttpProxy} {Set of regular expressions defining URL that should not be proxied} {} ;; If you're using HttpProxy, then you can set HttpProxyExceptions to a ;; list of regular expressions for URLs that you don't want to go through ;; the proxy. ;; For example, servers inside your firewall. ;; Separate patterns with a ';' ; HttpProxyExceptions = ".mydomain.com;localhost" ;# {emailmodule} {} {Provide llEmail and llGetNextEmail functionality? (requires SMTP server)} {true false} false ;; The email module requires some configuration. It needs an SMTP ;; server to send mail through. ; emailmodule = DefaultEmailModule
; By default, OpenSimulator does not allow scripts to make HTTP calls to addresses on the simulator's LAN. ; See the OutboundDisallowForUserScripts parameter in OpenSimDefaults.ini for more information on this filter. ; If you need to allow scripts to make some LAN calls use the OutboundDisallowForUserScriptsExcept parameter below. ; We recommend that you do not override OutboundDisallowForUserScripts directly unless you are very sure about what you're doing. ; ; You can whitelist individual endpoints by IP or FQDN, e.g. ; ; OutboundDisallowForUserScriptsExcept = 192.168.1.3:8003 ; ; You can specify multiple addresses by separating them with a bar. For example, ; ; OutboundDisallowForUserScriptsExcept = 192.168.1.3:8003|myinternalserver:8000 ; ; If an address if given without a port number then port 80 is assumed ; ; You can also specify a network range in CIDR notation to whitelist, e.g. ; ; OutboundDisallowForUserScriptsExcept = 192.168.1.0/24 ; ; to whitelist all ports on addresses 192.168.1.0 to 192.168.1.255 ; To specify an individual IP address use the /32 netmask ; ; OutboundDisallowForUserScriptsExcept = 192.168.1.2/32 ; ; See http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation for more information on CIDR notation ;# {HttpBodyMaxLenMAX} {} {Maximum bytes allowed for HTTP_BODY_MAXLENGTH} {} 16384 ;; By default, llHTTPRequest limits the response body to 2048 bytes. ;; This limit can be extended using HTTP_BODY_MAXLENGTH to a maximum ;; of HttpBodyMaxLenMAX bytes. ;; Please be aware that the limit can be set to insanely high values, ;; effectively removing any limitation. This will expose your sim to a ;; known attack. It is not recommended to set this limit higher than ;; the highest value that is actually needed by existing applications! ;; 16384 is the SL compatible value. ; HttpBodyMaxLenMAX=16384 ;# {ExternalHostNameForLSL} {} {Hostname to use for HTTP-IN URLs. This should be reachable from the internet.} {} ;; Hostname to use in llRequestURL/llRequestSecureURL ;; if not defined - llRequestURL/llRequestSecureURL are disabled ExternalHostNameForLSL = ${Const|BaseHostname} ;# {shard} {} {Name to use for X-Secondlife-Shard header? (press enter if unsure)} {} OpenSim ;; What is reported as the "X-Secondlife-Shard" ;; Defaults to the user server url if not set ;; The old default is "OpenSim", set here for compatibility ;; The below is not commented for compatibility. shard = "OpenSim" ;# {user_agent} {} {User agent to report to web servers?} {} OpenSim LSL (Mozilla Compatible) ;; What is reported as the "User-Agent" when using llHTTPRequest ;; Defaults to not sent if not set here. See the notes section in the wiki ;; at http://wiki.secondlife.com/wiki/LlHTTPRequest for comments on adding ;; " (Mozilla Compatible)" to the text where there are problems with a ;; web server ; user_agent = "OpenSim LSL (Mozilla Compatible)" ;; The following 3 variables are for HTTP Basic Authentication for the Robust services. ;; Use this if your central services in port 8003 need to be accessible on the Internet ;; but you want to protect them from unauthorized access. The username and password ;; here need to match the ones in the Robust service configuration. ; AuthType = "BasicHttpAuthentication" ; HttpAuthUsername = "some_username" ; HttpAuthPassword = "some_password" ;; ;; Any of these 3 variables above can be overriden in any of the service sections.
- OpensimDefaults.ini
; Maximum bytes allowed for HTTP_BODY_MAXLENGTH. ; By default, llHTTPRequest limits the response body to 2048 bytes. ; This limit can be extended using HTTP_BODY_MAXLENGTH to a maximum ; of HttpBodyMaxLenMAX bytes. ; HttpBodyMaxLenMAX=16384 ; Hostname to use in llRequestURL/llRequestSecureURL ; if not defined - llRequestURL/llRequestSecureURL are disabled ; ExternalHostNameForLSL=127.0.0.1 ; Disallow the following address ranges for user scripting calls (e.g. llHttpRequest()) ; This is based on http://en.wikipedia.org/wiki/Reserved_IP_addresses ; This stops users making HTTP calls to machines in the simulator's local network. ; If you need to allow some LAN calls we recommend you use OutboundDisallowForUserScriptsExcept documented in OpenSim.ini.example ; If you override OutboundDisallowForUserScripts directly you need to be very careful. ; ; Network ranges are specified in CIDR notation (http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation) with multiple entries separated by | ; To specify an individual IP address use the /32 netmask (e.g. 192.168.1.3/32) ; You can also specify individual <addr>:<port> endpoints (e.g. 192.168.1.3:8003) ; If an address if given without a port number then port 80 is assumed. OutboundDisallowForUserScripts = 0.0.0.0/8|10.0.0.0/8|100.64.0.0/10|127.0.0.0/8|169.254.0.0/16|172.16.0.0/12|192.0.0.0/24|192.0.2.0/24|192.88.99.0/24|192.168.0.0/16|198.18.0.0/15|198.51.100.0/24|203.0.113.0/24|224.0.0.0/4|240.0.0.0/4|255.255.255.255/32