Skip to content

Commit ecd166f

Browse files
committed
Preserve *partially* parseable query strings too
1 parent d21b225 commit ecd166f

37 files changed

+45
-42
lines changed

src/index.js

+9-6
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,16 @@ HTTPSnippet.prototype.prepare = function (request) {
216216
// eslint-disable-next-line node/no-deprecated-api
217217
request.uriObj = url.parse(request.url, true, true)
218218

219-
// merge all possible queryString values
220-
request.queryObj = Object.assign(request.queryObj, request.uriObj.query)
219+
// In some cases (unparseable/partially parseable query string) we want to fully preserve the
220+
// original string (as it may not follow qs conventions at all). We assume any scenario where
221+
// qs cannot reproduce the original value is this case.
222+
const simpleQueryString = !request.uriObj.search ||
223+
(qs.stringify(request.uriObj.query) === request.uriObj.search.slice(1))
224+
225+
if (simpleQueryString) {
226+
// merge all possible queryString values
227+
request.queryObj = Object.assign(request.queryObj, request.uriObj.query)
221228

222-
// In some cases (unparseable query - preference to use raw in exporter) the queryString might
223-
// be empty while the URL search is not. In that case, we prefer the URL search.
224-
const hasQueryObj = Object.keys(request.queryObj).length > 0
225-
if (hasQueryObj || !request.uriObj.search) {
226229
// reset uriObj values for a clean url
227230
request.uriObj.query = null
228231
request.uriObj.search = null
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CURL *hnd = curl_easy_init();
22

33
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
4-
curl_easy_setopt(hnd, CURLOPT_URL, "http://mockbin.com/har?&&&");
4+
curl_easy_setopt(hnd, CURLOPT_URL, "http://mockbin.com/har?&&a=b&&");
55

66
CURLcode ret = curl_easy_perform(hnd);
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
(require '[clj-http.client :as client])
22

3-
(client/get "http://mockbin.com/har?&&&")
3+
(client/get "http://mockbin.com/har?&&a=b&&")

test/fixtures/output/csharp/httpclient/unparseable-query.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
var request = new HttpRequestMessage
33
{
44
Method = HttpMethod.Get,
5-
RequestUri = new Uri("http://mockbin.com/har?&&&"),
5+
RequestUri = new Uri("http://mockbin.com/har?&&a=b&&"),
66
};
77
using (var response = await client.SendAsync(request))
88
{
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
var client = new RestClient("http://mockbin.com/har?&&&");
1+
var client = new RestClient("http://mockbin.com/har?&&a=b&&");
22
var request = new RestRequest(Method.GET);
33
IRestResponse response = client.Execute(request);

test/fixtures/output/go/native/unparseable-query.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88

99
func main() {
1010

11-
url := "http://mockbin.com/har?&&&"
11+
url := "http://mockbin.com/har?&&a=b&&"
1212

1313
req, _ := http.NewRequest("GET", url, nil)
1414

Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
GET /har?&&& HTTP/1.1
1+
GET /har?&&a=b&& HTTP/1.1
22
Host: mockbin.com

test/fixtures/output/java/asynchttp/unparseable-query.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
AsyncHttpClient client = new DefaultAsyncHttpClient();
2-
client.prepare("GET", "http://mockbin.com/har?&&&")
2+
client.prepare("GET", "http://mockbin.com/har?&&a=b&&")
33
.execute()
44
.toCompletableFuture()
55
.thenAccept(System.out::println)

test/fixtures/output/java/nethttp/unparseable-query.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
HttpRequest request = HttpRequest.newBuilder()
2-
.uri(URI.create("http://mockbin.com/har?&&&"))
2+
.uri(URI.create("http://mockbin.com/har?&&a=b&&"))
33
.method("GET", HttpRequest.BodyPublishers.noBody())
44
.build();
55
HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());

test/fixtures/output/java/okhttp/unparseable-query.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
OkHttpClient client = new OkHttpClient();
22

33
Request request = new Request.Builder()
4-
.url("http://mockbin.com/har?&&&")
4+
.url("http://mockbin.com/har?&&a=b&&")
55
.get()
66
.build();
77

Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
HttpResponse<String> response = Unirest.get("http://mockbin.com/har?&&&")
1+
HttpResponse<String> response = Unirest.get("http://mockbin.com/har?&&a=b&&")
22
.asString();

test/fixtures/output/javascript/axios/unparseable-query.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import axios from "axios";
22

3-
const options = {method: 'GET', url: 'http://mockbin.com/har?&&&'};
3+
const options = {method: 'GET', url: 'http://mockbin.com/har?&&a=b&&'};
44

55
axios.request(options).then(function (response) {
66
console.log(response.data);
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const options = {method: 'GET'};
22

3-
fetch('http://mockbin.com/har?&&&', options)
3+
fetch('http://mockbin.com/har?&&a=b&&', options)
44
.then(response => response.json())
55
.then(response => console.log(response))
66
.catch(err => console.error(err));

test/fixtures/output/javascript/jquery/unparseable-query.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const settings = {
22
"async": true,
33
"crossDomain": true,
4-
"url": "http://mockbin.com/har?&&&",
4+
"url": "http://mockbin.com/har?&&a=b&&",
55
"method": "GET",
66
"headers": {}
77
};

test/fixtures/output/javascript/xhr/unparseable-query.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ xhr.addEventListener("readystatechange", function () {
99
}
1010
});
1111

12-
xhr.open("GET", "http://mockbin.com/har?&&&");
12+
xhr.open("GET", "http://mockbin.com/har?&&a=b&&");
1313

1414
xhr.send(data);

test/fixtures/output/kotlin/okhttp/unparseable-query.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
val client = OkHttpClient()
22

33
val request = Request.Builder()
4-
.url("http://mockbin.com/har?&&&")
4+
.url("http://mockbin.com/har?&&a=b&&")
55
.get()
66
.build()
77

test/fixtures/output/node/axios/unparseable-query.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
var axios = require("axios").default;
22

3-
var options = {method: 'GET', url: 'http://mockbin.com/har?&&&'};
3+
var options = {method: 'GET', url: 'http://mockbin.com/har?&&a=b&&'};
44

55
axios.request(options).then(function (response) {
66
console.log(response.data);

test/fixtures/output/node/fetch/unparseable-query.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const fetch = require('node-fetch');
22

3-
let url = 'http://mockbin.com/har?&&&';
3+
let url = 'http://mockbin.com/har?&&a=b&&';
44

55
let options = {method: 'GET'};
66

test/fixtures/output/node/native/unparseable-query.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const options = {
44
"method": "GET",
55
"hostname": "mockbin.com",
66
"port": null,
7-
"path": "/har?&&&",
7+
"path": "/har?&&a=b&&",
88
"headers": {}
99
};
1010

test/fixtures/output/node/request/unparseable-query.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const request = require('request');
22

3-
const options = {method: 'GET', url: 'http://mockbin.com/har?&&&'};
3+
const options = {method: 'GET', url: 'http://mockbin.com/har?&&a=b&&'};
44

55
request(options, function (error, response, body) {
66
if (error) throw new Error(error);

test/fixtures/output/node/unirest/unparseable-query.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const unirest = require("unirest");
22

3-
const req = unirest("GET", "http://mockbin.com/har?&&&");
3+
const req = unirest("GET", "http://mockbin.com/har?&&a=b&&");
44

55
req.end(function (res) {
66
if (res.error) throw new Error(res.error);

test/fixtures/output/objc/nsurlsession/unparseable-query.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#import <Foundation/Foundation.h>
22

3-
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://mockbin.com/har?&&&"]
3+
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://mockbin.com/har?&&a=b&&"]
44
cachePolicy:NSURLRequestUseProtocolCachePolicy
55
timeoutInterval:10.0];
66
[request setHTTPMethod:@"GET"];

test/fixtures/output/ocaml/cohttp/unparseable-query.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ open Cohttp_lwt_unix
22
open Cohttp
33
open Lwt
44

5-
let uri = Uri.of_string "http://mockbin.com/har?&&&" in
5+
let uri = Uri.of_string "http://mockbin.com/har?&&a=b&&" in
66

77
Client.call `GET uri
88
>>= fun (res, body_stream) ->

test/fixtures/output/php/curl/unparseable-query.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
$curl = curl_init();
44

55
curl_setopt_array($curl, [
6-
CURLOPT_URL => 'http://mockbin.com/har?&&&',
6+
CURLOPT_URL => 'http://mockbin.com/har?&&a=b&&',
77
CURLOPT_RETURNTRANSFER => true,
88
CURLOPT_ENCODING => '',
99
CURLOPT_MAXREDIRS => 10,

test/fixtures/output/php/http1/unparseable-query.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22

33
$request = new HttpRequest();
4-
$request->setUrl('http://mockbin.com/har?&&&');
4+
$request->setUrl('http://mockbin.com/har?&&a=b&&');
55
$request->setMethod(HTTP_METH_GET);
66

77
try {

test/fixtures/output/php/http2/unparseable-query.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
$client = new http\Client;
44
$request = new http\Client\Request;
55

6-
$request->setRequestUrl('http://mockbin.com/har?&&&');
6+
$request->setRequestUrl('http://mockbin.com/har?&&a=b&&');
77
$request->setRequestMethod('GET');
88
$client->enqueue($request)->send();
99
$response = $client->getResponse();
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
$response = Invoke-RestMethod -Uri 'http://mockbin.com/har?&&&' -Method GET
1+
$response = Invoke-RestMethod -Uri 'http://mockbin.com/har?&&a=b&&' -Method GET
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
$response = Invoke-WebRequest -Uri 'http://mockbin.com/har?&&&' -Method GET
1+
$response = Invoke-WebRequest -Uri 'http://mockbin.com/har?&&a=b&&' -Method GET

test/fixtures/output/python/python3/unparseable-query.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
conn = http.client.HTTPConnection("mockbin.com")
44

5-
conn.request("GET", "/har?&&&")
5+
conn.request("GET", "/har?&&a=b&&")
66

77
res = conn.getresponse()
88
data = res.read()

test/fixtures/output/python/requests/unparseable-query.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import requests
22

3-
url = "http://mockbin.com/har?&&&"
3+
url = "http://mockbin.com/har?&&a=b&&"
44

55
response = requests.get(url)
66

test/fixtures/output/r/httr/unparseable-query.r

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
library(httr)
22

3-
url <- "http://mockbin.com/har?&&&"
3+
url <- "http://mockbin.com/har?&&a=b&&"
44

55
response <- VERB("GET", url, content_type("application/octet-stream"))
66

test/fixtures/output/ruby/native/unparseable-query.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
require 'uri'
22
require 'net/http'
33

4-
url = URI("http://mockbin.com/har?&&&")
4+
url = URI("http://mockbin.com/har?&&a=b&&")
55

66
http = Net::HTTP.new(url.host, url.port)
77

Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
curl --request GET \
2-
--url 'http://mockbin.com/har?&&&'
2+
--url 'http://mockbin.com/har?&&a=b&&'
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
http GET 'http://mockbin.com/har?&&&'
1+
http GET 'http://mockbin.com/har?&&a=b&&'
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
wget --quiet \
22
--method GET \
33
--output-document \
4-
- 'http://mockbin.com/har?&&&'
4+
- 'http://mockbin.com/har?&&a=b&&'

test/fixtures/output/swift/nsurlsession/unparseable-query.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Foundation
22

3-
let request = NSMutableURLRequest(url: NSURL(string: "http://mockbin.com/har?&&&")! as URL,
3+
let request = NSMutableURLRequest(url: NSURL(string: "http://mockbin.com/har?&&a=b&&")! as URL,
44
cachePolicy: .useProtocolCachePolicy,
55
timeoutInterval: 10.0)
66
request.httpMethod = "GET"
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"method": "GET",
3-
"url": "http://mockbin.com/har?&&&",
3+
"url": "http://mockbin.com/har?&&a=b&&",
44
"httpVersion": "HTTP/1.1",
55
"queryString": []
66
}

0 commit comments

Comments
 (0)